
PoC e aplicação de red team para CVE-2026-28576, uma injeção SQL sem permissões no Android Contacts Provider que permite a exfiltração completa da base de dados de contactos.
CVE-2026-28576 é uma vulnerabilidade crítica de controle de acesso no framework Android Contacts Provider (ContactsProvider2.queryLocal()). A falha permite que um aplicativo sem privilégios instalado localmente com zero permissões declaradas exfiltre todo o banco de dados de contatos de um dispositivo, incluindo nomes completos, números de telefone, endereços postais e endereços de e-mail.
| Atributo | Valor |
|---|---|
| CVE ID | CVE-2026-28576 |
| GHSA ID | GHSA-ph86-9mcx-3p6r |
| Android Bug ID | A-488593616 |
| CWE | CWE-89: Neutralização Imprópria de Elementos Especiais usados em Comando SQL ('Injeção SQL') |
| CVSS v4.0 | 10.0 (Crítico) - 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% (4º percentil) |
| Publicado | 17 de junho de 2026 |
| Componente | Android Contacts Provider (ContactsProvider2) |
| Vetor de Ataque | Local (aplicativo sem permissões) |
| Interação do Usuário | Nenhuma necessária |
A vulnerabilidade existe no método ContactsProvider2.queryLocal() dentro do framework Android Contacts Provider (packages/providers/ContactsProvider). O método constrói consultas SQL usando entrada controlada pelo usuário não sanitizada, permitindo injeção SQL através dos parâmetros selection e selectionArgs passados via ContentResolver.query().
ContentResolver.query()
→ ContactsProvider2.query()
→ ContactsProvider2.queryLocal() [VULNERABLE]
→ SQLiteQueryBuilder.buildQuery()
→ Raw SQL execution with unsanitized input
selection (String): Cláusula WHERE sem parametrizaçãoselectionArgs (String[]): Argumentos que são escapados de forma imprópriauri (Uri): Content URI direcionado a content://com.android.contacts/...READ_CONTACTS, READ_PRIVILEGED_PHONE_STATE ou qualquer permissão perigosaO método queryLocal() processa o parâmetro selection concatenando-o diretamente na cláusula WHERE do SQL sem a parametrização adequada:
// 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;
}
Um atacante elabora um parâmetro selection malicioso como:
"1=1) UNION SELECT _id, display_name, phone_number, email_address, postal_address FROM raw_contacts--"
Isso contorna a lógica de consulta pretendida e extrai todos os campos de contato.
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| Versão do Android | Status |
|---|---|
| Android 14 (U) | Vulnerável |
| Android 15 (V) | Vulnerável |
| Android 16 (W) | Vulnerável |
| Android 17 (junho de 2026+) | Corrigido |
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() via política SELinuxContactsProvider para parâmetros selection anômaloscontent://com.android.contacts sem permissão READ_CONTACTSDocumento gerado para o repositório de pesquisa CVE-2026-28576 Última atualização: setembro de 2025
| Categoria de Dados | Campos Expostos |
|---|
| Identidade | display_name, phonetic_name, nickname, company, title |
| Números de Telefone | number, type (celular, residencial, trabalho, fax, etc.), label |
| Endereços de E-mail | address, type (residencial, trabalho, outro), label |
| Endereços Postais | street, city, region, postcode, country, type |
| Dados Estruturados | mimetype, data1–data15, sync1–sync4 |
| Metadados | contact_id, raw_contact_id, version, dirty, deleted |