
PoC- und Red-Team-App für CVE-2026-28576, eine Zero-Permission-SQL-Injection im Android Contacts Provider, die die vollständige Exfiltration der Kontaktdatenbank ermöglicht.
CVE-2026-28576 ist eine kritische Zugriffskontrollschwachstelle im Android Contacts Provider Framework (ContactsProvider2.queryLocal()). Die Schwachstelle ermöglicht es einer lokal installierten, nicht privilegierten Anwendung mit null deklarierten Berechtigungen, die gesamte Kontaktdatenbank eines Geräts zu exfiltrieren, einschließlich vollständiger Namen, Telefonnummern, Postanschriften und E-Mail-Adressen.
| Attribut | Wert |
|---|---|
| CVE-ID | CVE-2026-28576 |
| GHSA-ID | GHSA-ph86-9mcx-3p6r |
| Android Bug-ID | A-488593616 |
| CWE | CWE-89: Unsachgemäße Neutralisierung von Sonderzeichen in SQL-Befehlen ('SQL Injection') |
| CVSS v4.0 | 10.0 (Kritisch) - 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. Perzentil) |
| Veröffentlicht | 17. Juni 2026 |
| Komponente | Android Contacts Provider (ContactsProvider2) |
| Angriffsvektor | Lokal (App ohne Berechtigungen) |
| Benutzerinteraktion | Nicht erforderlich |
Die Schwachstelle befindet sich in der Methode ContactsProvider2.queryLocal() innerhalb des Android Contacts Provider Frameworks (packages/providers/ContactsProvider). Die Methode erstellt SQL-Abfragen unter Verwendung nicht bereinigter, benutzergesteuerter Eingaben, wodurch SQL-Injection über die Parameter selection und selectionArgs möglich ist, die über ContentResolver.query() übergeben werden.
ContentResolver.query()
→ ContactsProvider2.query()
→ ContactsProvider2.queryLocal() [VULNERABLE]
→ SQLiteQueryBuilder.buildQuery()
→ Raw SQL execution with unsanitized input
selection (String): WHERE-Klausel ohne ParametrisierungselectionArgs (String[]): Argumente, die unsachgemäß escaped werdenuri (Uri): Content-URI, der auf content://com.android.contacts/... abzieltREAD_CONTACTS, READ_PRIVILEGED_PHONE_STATE oder andere gefährliche BerechtigungenDie Methode queryLocal() verarbeitet den Parameter selection, indem sie ihn direkt in die SQL-WHERE-Klausel einfügt, ohne ordnungsgemäße Parametrisierung:
// 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;
}
Ein Angreifer erstellt einen bösartigen selection-Parameter wie:
"1=1) UNION SELECT _id, display_name, phone_number, email_address, postal_address FROM raw_contacts--"
Dies umgeht die beabsichtigte Abfragelogik und extrahiert alle Kontaktfelder.
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-Injection| Android-Version | Status |
|---|---|
| Android 14 (U) | Anfällig |
| Android 15 (V) | Anfällig |
| Android 16 (W) | Anfällig |
| Android 17 (Juni 2026+) | Gepatcht |
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() über SELinux-Richtlinie einschränkenContactsProvider-Abfrageprotokolle auf anomale selection-Parameter prüfencontent://com.android.contacts-URIs ohne READ_CONTACTS-Berechtigung scannenDokument erstellt für das CVE-2026-28576-Forschungsrepository Zuletzt aktualisiert: September 2025
| Datenkategorie | Offengelegte Felder |
|---|
| Identität | display_name, phonetic_name, nickname, company, title |
| Telefonnummern | number, type (Mobil, Privat, Arbeit, Fax usw.), label |
| E-Mail-Adressen | address, type (Privat, Arbeit, Sonstige), label |
| Postanschriften | street, city, region, postcode, country, type |
| Strukturierte Daten | mimetype, data1–data15, sync1–sync4 |
| Metadaten | contact_id, raw_contact_id, version, dirty, deleted |