
PoC e app red team per CVE-2026-28576, un'iniezione SQL a permessi zero nell'Android Contacts Provider che consente l'esfiltrazione completa del database dei contatti.
CVE-2026-28576 è una vulnerabilità critica di controllo degli accessi nel framework Android Contacts Provider (ContactsProvider2.queryLocal()). La falla consente a un'applicazione non privilegiata installata localmente con zero permessi dichiarati di esfiltrare l'intero database dei contatti di un dispositivo, inclusi nomi completi, numeri di telefono, indirizzi postali e indirizzi email.
| Attributo | Valore |
|---|---|
| CVE ID | CVE-2026-28576 |
| GHSA ID | GHSA-ph86-9mcx-3p6r |
| Android Bug ID | A-488593616 |
| CWE | CWE-89: Neutralizzazione Impropria di Elementi Speciali usati in un Comando SQL ('SQL Injection') |
| CVSS v4.0 | 10.0 (Critico) - AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H |
| Punteggio EPSS | 0.148% (4° percentile) |
| Pubblicato | 17 giugno 2026 |
| Componente | Android Contacts Provider (ContactsProvider2) |
| Vettore di Attacco | Locale (app a zero permessi) |
| Interazione Utente | Nessuna richiesta |
La vulnerabilità esiste nel metodo ContactsProvider2.queryLocal() all'interno del framework Android Contacts Provider (packages/providers/ContactsProvider). Il metodo costruisce query SQL utilizzando input controllato dall'utente non sanificato, consentendo SQL injection attraverso i parametri selection e selectionArgs passati tramite ContentResolver.query().
ContentResolver.query()
→ ContactsProvider2.query()
→ ContactsProvider2.queryLocal() [VULNERABILE]
→ SQLiteQueryBuilder.buildQuery()
→ Esecuzione SQL grezza con input non sanificato
selection (String): Clausola WHERE senza parametrizzazioneselectionArgs (String[]): Argomenti con escaping impropriouri (Uri): Content URI che punta a content://com.android.contacts/...READ_CONTACTS, READ_PRIVILEGED_PHONE_STATE o qualsiasi permesso pericolosoIl metodo queryLocal() elabora il parametro selection concatenandolo direttamente nella clausola WHERE SQL senza una corretta parametrizzazione:
// Pattern vulnerabile semplificato in ContactsProvider2.java
public Cursor queryLocal(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(Tables.CONTACTS);
// VULNERABILE: selection interpolata direttamente nell'SQL
String whereClause = buildWhereClause(selection, selectionArgs);
Cursor c = qb.query(db, projection, whereClause, null, null, null, sortOrder);
return c;
}
Un attaccante costruisce un parametro selection malevolo come:
"1=1) UNION SELECT _id, display_name, phone_number, email_address, postal_address FROM raw_contacts--"
Questo aggira la logica prevista della query ed estrae tutti i campi dei contatti.
graph TD
A[App Malevola Installata] --> B[Richiesta ContentResolver.query]
B --> C[Costruzione Payload SQL Injection]
C --> D[Target content://com.android.contacts/data]
D --> E[ContactsProvider2.queryLocal]
E --> F[Parametro selection non sanificato]
F --> G[SQL Injection Eseguita]
G --> H[Intero DB Contatti Restituito]
H --> I[Esfiltrazione via Rete/Log]UNION/UPDATE| Versione Android | Stato |
|---|---|
| Android 14 (U) | Vulnerabile |
| Android 15 (V) | Vulnerabile |
| Android 16 (W) | Vulnerabile |
| Android 17 (giugno 2026+) | Corretta |
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() tramite policy SELinuxContactsProvider per parametri selection anomalicontent://com.android.contacts senza il permesso READ_CONTACTSDocumento generato per il repository di ricerca CVE-2026-28576 Ultimo aggiornamento: settembre 2025
| Categoria Dati | Campi Esposti |
|---|
| Identità | display_name, phonetic_name, nickname, company, title |
| Numeri di Telefono | number, type (mobile, casa, lavoro, fax, ecc.), label |
| Indirizzi Email | address, type (casa, lavoro, altro), label |
| Indirizzi Postali | street, city, region, postcode, country, type |
| Dati Strutturati | mimetype, data1–data15, sync1–sync4 |
| Metadati | contact_id, raw_contact_id, version, dirty, deleted |