Check Point 的研究人员
为了成功进行攻击,必须能够修改被攻击应用程序的数据库文件,这限制了攻击使用 SQLite 数据库作为传输和输入数据格式的应用程序的方法。 该方法还可用于扩展现有的本地访问,例如,将隐藏的后门集成到使用的应用程序中,以及在安全研究人员分析恶意软件时绕过安全机制。 文件替换后的操作是在应用程序针对修改的数据库中的表执行第一个 SELECT 查询时执行的。
作为示例,我们演示了打开地址簿时在 iOS 中运行代码的能力,使用所提出的方法修改了包含“AddressBook.sqlitedb”数据库的文件。 该攻击利用了 fts3_tokenizer 函数中的漏洞(CVE-2019-8602,指针取消引用功能),该漏洞已在 2.28 月份的 SQLite XNUMX 更新中修复,此外还有另一个漏洞
该攻击方法基于“查询劫持”和“面向查询编程”两种技术的使用,允许利用导致 SQLite 引擎内存损坏的任意问题。 “查询劫持”的本质是替换sqlite_master服务表中“sql”字段的内容,该字段决定了数据库的结构。 指定字段包含一个DDL(数据定义语言)块,用于描述数据库中对象的结构。 描述是使用标准 SQL 语法指定的,即使用“CREATE TABLE”结构,
它在数据库初始化过程中执行(在第一次启动期间)
sqlite3LocateTable 函数在内存中创建与表相关的内部结构。
这个想法是,由于将“CREATE TABLE”替换为“CREATE VIEW”,因此可以通过定义自己的视图来控制对数据库的任何访问。 使用“CREATE VIEW”将“SELECT”操作绑定到表,该操作将代替“CREATE TABLE”被调用,并允许您访问 SQLite 解释器的不同部分。 接下来,最简单的攻击方法是调用“load_extension”函数,该函数允许您加载带有扩展名的任意库,但默认情况下该函数是禁用的。
为了在可以执行“SELECT”操作时进行攻击,提出了“面向查询编程”技术,该技术使得利用 SQLite 中导致内存损坏的问题成为可能。 该技术让人想起面向返回的编程(
来源: opennet.ru