
تطبيق إثبات مفهوم وفريق أحمر لـ CVE-2026-28576، وهو حقن SQL بدون أذونات في موفر جهات الاتصال في Android يتيح استخراج قاعدة بيانات جهات الاتصال بالكامل.
CVE-2026-28576 هي ثغرة حرجة في التحكم بالوصول في إطار عمل موفر جهات الاتصال على أندرويد (ContactsProvider2.queryLocal()). تتيح هذه الثغرة لتطبيق غير مميز مثبّت محليًا بـ صفر أذونات مصرّح بها تسريب قاعدة بيانات جهات الاتصال بالكامل من الجهاز، بما في ذلك الأسماء الكاملة وأرقام الهواتف والعناوين البريدية وعناوين البريد الإلكتروني.
| السمة | القيمة |
|---|---|
| معرّف CVE | CVE-2026-28576 |
| معرّف GHSA | GHSA-ph86-9mcx-3p6r |
| معرّف خطأ أندرويد | 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% (المئين الرابع) |
| تاريخ النشر | 17 يونيو 2026 |
| المكوّن | موفر جهات الاتصال على أندرويد (ContactsProvider2) |
| ناقل الهجوم | محلي (تطبيق بصفر أذونات) |
| تفاعل المستخدم | غير مطلوب |
توجد الثغرة في طريقة ContactsProvider2.queryLocal() داخل إطار عمل موفر جهات الاتصال على أندرويد (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): معرّف URI للمحتوى يستهدف content://com.android.contacts/...READ_CONTACTS أو READ_PRIVILEGED_PHONE_STATE أو أي أذونات خطيرةتعالج طريقة queryLocal() معامل selection عبر دمجه مباشرة في جملة WHERE الخاصة بـ SQL دون تحديد معاملات مناسب:
// 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 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 بحثًا عن معاملات selection غير طبيعيةcontent://com.android.contacts دون إذن READ_CONTACTSمستند مُنشأ لمستودع أبحاث CVE-2026-28576 آخر تحديث: سبتمبر 2025
| فئة البيانات | الحقول المكشوفة |
|---|
| الهوية | 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 |