CVE-2026-28576 是 Android 联系人提供程序框架(ContactsProvider2.queryLocal())中的一个严重访问控制漏洞。该缺陷使本地安装的、未声明任何权限的非特权应用能够窃取整个设备的联系人数据库,包括全名、电话号码、邮寄地址和电子邮件地址。
| 属性 | 值 |
|---|---|
| CVE ID | CVE-2026-28576 |
| GHSA ID | GHSA-ph86-9mcx-3p6r |
| Android Bug ID | A-488593616 |
| CWE | CWE-89:SQL 命令中使用的特殊元素未正确中和(“SQL 注入”) |
| CVSS v4.0 | 10.0(严重)- AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H |
| EPSS 评分 | 0.148%(第 4 百分位) |
| 发布日期 | 2026 年 6 月 17 日 |
| 组件 | Android 联系人提供程序(ContactsProvider2) |
| 攻击向量 | 本地(零权限应用) |
| 用户交互 | 无需任何交互 |
该漏洞存在于 Android 联系人提供程序框架(packages/providers/ContactsProvider)中的 ContactsProvider2.queryLocal() 方法内。该方法使用未经净化的用户可控输入构造 SQL 查询,允许通过 ContentResolver.query() 传递的 selection 和 selectionArgs 参数进行 SQL 注入。
ContentResolver.query()
→ ContactsProvider2.query()
→ ContactsProvider2.queryLocal() [存在漏洞]
→ SQLiteQueryBuilder.buildQuery()
→ 使用未经净化的输入执行原始 SQL
selection(String):未参数化的 WHERE 子句selectionArgs(String[]):转义不当的参数uri(Uri):指向 content://com.android.contacts/... 的内容 URIREAD_CONTACTS、READ_PRIVILEGED_PHONE_STATE 或任何危险权限queryLocal() 方法通过将 selection 参数直接拼接到 SQL WHERE 子句中而不进行适当参数化来处理该参数:
// ContactsProvider2.java 中简化的易受攻击模式
public Cursor queryLocal(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(Tables.CONTACTS);
// 存在漏洞:selection 被直接插入 SQL
String whereClause = buildWhereClause(selection, selectionArgs);
Cursor c = qb.query(db, projection, whereClause, null, null, null, sortOrder);
return c;
}
攻击者构造恶意的 selection 参数,例如:
"1=1) UNION SELECT _id, display_name, phone_number, email_address, postal_address FROM raw_contacts--"
这会绕过预期的查询逻辑并提取所有联系人字段。
graph TD
A[恶意应用已安装] --> B[请求 ContentResolver.query]
B --> C[构造 SQL 注入载荷]
C --> D[目标 content://com.android.contacts/data]
D --> E[ContactsProvider2.queryLocal]
E --> F[未经净化的 selection 参数]
F --> G[SQL 注入被执行]
G --> H[返回完整联系人数据库]
H --> I[通过网络/日志窃取]UNION/UPDATE 注入操纵联系人数据| Android 版本 | 状态 |
|---|---|
| Android 14 (U) | 存在漏洞 |
| Android 15 (V) | 存在漏洞 |
| Android 16 (W) | 存在漏洞 |
| Android 17(2026 年 6 月及以后) | 已修补 |
rule Android_ContactsProvider_SQLi_CVE_2026_28576 {
meta:
description = "Detects SQL injection payloads targeting ContactsProvider"
cve = "CVE-2026-28576"
severity = "critical"
strings:
$s1 = "content://com.android.contacts" nocase
$s2 = "UNION SELECT" nocase
$s3 = "raw_contacts" nocase
$s4 = "data1" nocase
$s5 = "1=1" nocase
condition:
$s1 and 2 of ($s2, $s3, $s4, $s5)
}
alert http any any -> any any (
msg:"CVE-2026-28576 Contacts Exfiltration";
flow:established,to_server;
content:"contacts";
http.uri;
pcre:"/UNION.*SELECT.*raw_contacts/i";
classtype:web-application-attack;
sid:202628576;
rev:1;
)
ContentResolver.query()ContactsProvider 查询日志,查找异常的 selection 参数READ_CONTACTS 权限的情况下使用 content://com.android.contacts URI 的应用为 CVE-2026-28576 研究仓库生成的文档 最后更新:2025 年 9 月
| 数据类别 | 暴露的字段 |
|---|
| 身份 | display_name、phonetic_name、nickname、company、title |
| 电话号码 | number、type(手机、家庭、工作、传真等)、label |
| 电子邮件地址 | address、type(家庭、工作、其他)、label |
| 邮寄地址 | street、city、region、postcode、country、type |
| 结构化数据 | mimetype、data1–data15、sync1–sync4 |
| 元数据 | contact_id、raw_contact_id、version、dirty、deleted |