
PoC и red team приложение для CVE-2026-28576 — SQL-инъекции без разрешений в Android Contacts Provider, позволяющей полностью выгрузить базу данных контактов.
CVE-2026-28576 — критическая уязвимость контроля доступа в фреймворке Android Contacts Provider (ContactsProvider2.queryLocal()). Данный недостаток позволяет непривилегированному приложению, установленному локально с нулевыми объявленными разрешениями, осуществить эксфильтрацию всей базы контактов устройства, включая полные имена, номера телефонов, почтовые адреса и адреса электронной почты.
| Атрибут | Значение |
|---|---|
| CVE ID | CVE-2026-28576 |
| GHSA ID | GHSA-ph86-9mcx-3p6r |
| Android Bug ID | A-488593616 |
| CWE | CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection') |
| CVSS v4.0 | 10.0 (Critical) - AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H |
| EPSS Score | 0.148% (4th percentile) |
| Опубликовано | 17 июня 2026 г. |
| Компонент | Android Contacts Provider (ContactsProvider2) |
| Вектор атаки | Локальный (приложение с нулевыми разрешениями) |
| Взаимодействие с пользователем | Не требуется |
Уязвимость существует в методе ContactsProvider2.queryLocal() в рамках фреймворка Android Contacts Provider (packages/providers/ContactsProvider). Метод конструирует SQL-запросы, используя несанитизированный ввод, контролируемый пользователем, что позволяет осуществить SQL-инъекцию через параметры selection и selectionArgs, передаваемые посредством ContentResolver.query().
ContentResolver.query()
→ ContactsProvider2.query()
→ ContactsProvider2.queryLocal() [VULNERABLE]
→ SQLiteQueryBuilder.buildQuery()
→ Raw SQL execution with unsanitized input
selection (String): условие WHERE без параметризацииselectionArgs (String[]): аргументы, которые неправильно экранированыuri (Uri): content URI, нацеленный на content://com.android.contacts/...READ_CONTACTS, READ_PRIVILEGED_PHONE_STATE или любых опасных разрешенийМетод queryLocal() обрабатывает параметр selection, напрямую конкатенируя его в SQL-условие WHERE без должной параметризации:
// Simplified vulnerable pattern in ContactsProvider2.java
public Cursor queryLocal(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(Tables.CONTACTS);
// VULNERABLE: selection directly interpolated into 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[Malicious App Installed] --> B[Request ContentResolver.query]
B --> C[Craft SQL Injection Payload]
C --> D[Target content://com.android.contacts/data]
D --> E[ContactsProvider2.queryLocal]
E --> F[Unsanitized selection parameter]
F --> G[SQL Injection Executed]
G --> H[Full Contacts DB Returned]
H --> I[Exfiltrate via Network/Logs]UNION/UPDATE| Версия Android | Статус |
|---|---|
| Android 14 (U) | Уязвима |
| Android 15 (V) | Уязвима |
| Android 16 (W) | Уязвима |
| Android 17 (июнь 2026+) | Исправлена |
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() через политику SELinuxContactsProvider на предмет аномальных параметров selectioncontent://com.android.contacts без разрешения READ_CONTACTSДокумент создан для исследовательского репозитория CVE-2026-28576 Последнее обновление: сентябрь 2025 г.
| Категория данных | Раскрываемые поля |
|---|
| Идентификация | display_name, phonetic_name, nickname, company, title |
| Номера телефонов | number, type (mobile, home, work, fax и т.д.), label |
| Адреса электронной почты | address, type (home, work, other), label |
| Почтовые адреса | street, city, region, postcode, country, type |
| Структурированные данные | mimetype, data1–data15, sync1–sync4 |
| Метаданные | contact_id, raw_contact_id, version, dirty, deleted |