
سلسلة استغلال كاملة لمتصفح Chromium على أندرويد تجمع بين تسريب معلومات CVE-2026-11057 واستخدام بعد التحرير CVE-2026-5281 لتحقيق اختطاف جدول الدوال الافتراضية وتنفيذ تعليمات برمجية عشوائية.
Pixel 7 Android 16 ARM64
commit 994c846bbd7a35241ba7c08158c13d66412a6993 (HEAD -> 146.0.7680.111, tag: 146.0.7680.111)
Author: Roger McFarlane <[email protected]>
Date: Mon Mar 9 12:48:07 2026 -0700
يجمع هذا المستودع بين CVE-2026-11057 (ذاكرة صورة glyph غير مهيأة في Skia) وCVE-2026-5281 (استخدام بعد التحرير DeviceInfo في خادم Dawn wire) في سلسلة كاملة. جميع التعديلات على جانب المُصيّر (renderer)؛ كود عملية GPU دون تغيير:
تسريب المعلومات (CVE-2026-11057) — إثارة مخزن مؤقت لصورة glyph غير مهيأ عبر عرض نص على canvas، وقراءة المؤشرات من كومة عملية GPU، والتحقق منها عبر عمليات حسابية متكررة، واستنتاج قاعدة تجمّع PartitionAlloc، وحساب هدف Server المزيف M = POOL + 0x202A08000 (إزاحة معايرة).
رشّ CC — يُطلق createBuffer(label="CCM:<m>:<n>") حقن 3000 من ChunkedCommands غير المكتملة (دلو 10KB، remainingSize=1، تبقى حية في mChunkedCommands الخاص بخادم wire). تملأ الحمولة المنطقة حول M بـ Server مزيف مُهيأ لـ Android arm64: MutexProtected vptr عند +0xB20، وChunkedCommandSerializer عند +0xB50/+0xB58، وCommandSerializer/vtable مزيف عند +0xC00/+0xD00.
إطلاق 5281 + الاحتلال — يستدعي queue.writeBuffer(buffer, 0x414141, ...) أولاً Unregister(Device) لتحرير DeviceInfo ذي الـ 16 بايت، ثم يحقن ChunkedCommand احتلالي بحجم 16 بايت لاستعادة تلك الفتحة والكتابة فوق info->server بالقيمة M، وأخيراً يثير خطأ تحقق بإزاحة خارج الحدود.
استدعاء معلّق → اختطاف vtable — يقوم استدعاء الخطأ غير المُلتقط بإلغاء الإشارة إلى info->server = M (Server المزيف): تمرّ الأقفال المُصفّرة، ويصل التنفيذ إلى OnUncapturedError → SerializeCommand، ويصيب الاستدعاء غير المباشر عبر vtable النسبي جدول vtable المزيف الخاص بنا، مما يعطي pc = fake_vtable + controlled int32 offset، كما هو موضح بـ pc = 0x7641414141.
ملاحظة: يستخدم Chromium على Android arm64 جداول vtable نسبية (
-fexperimental-relative-c++-abi-vtables)؛ مدخلات vtable هي إزاحات نسبية 32-بت بدلاً من مؤشرات دوال مطلقة، لذا يستخدم PoC إزاحة int32 مُتحكَّم بها كعلامة عند نقطة اختطاف vtable.
على جهاز الاختبار، تصل السلسلة الكاملة إلى انهيار اختطاف vtable بمعدل نجاح يقارب 100%؛ قد تتطلب مرحلة التسريب أحياناً عدة عمليات إعادة تحميل تلقائية قبل أن تنجح.
SkStrike.cpp.patch — مُشغّل تسريب CVE-2026-11057. تعيد FlattenGlyphsByType() كتابة حمولة strike بحيث تنشئ عملية GPU SkGlyph بقيمة fImage == nullptr، مما يؤدي في النهاية إلى قراءة مخزن مؤقت لصورة غير مهيأ لتسريب مؤشرات الكومة.Device.cpp.patch — رشّ CC في عميل Dawn wire. تحلّل APICreateBuffer() تسمية CCM:، وتبني حمولة Server المزيف لـ Android arm64، وتحقن N من ChunkedCommands غير المكتملة التي تبقى حية في عملية GPU.ApiProcs.cpp.patch — إطلاق CVE-2026-5281 + الاحتلال. عند الإزاحة السحرية 0x414141 في QueueWriteBuffer، يستدعي Unregister(Device) لتحرير DeviceInfo، ويحقن ChunkedCommand بحجم 16 بايت لاستعادة الفتحة وتعيين info->server = M، ثم يمضي بإزاحة خارج الحدود لإطلاق الاستدعاء المعلّق.exploit.html — تنسيق الصفحة: بدائية التسريب (groom/draw/readCell/verifyRuns/derivePoolBase)، ورشّ CC، ومُشغّل exploit5281() مستقل؛ عند الفشل ينظّف حالة الرشّ ويعيد التحميل حتى لا تتداخل المراحل.يُفصح عن هذا ExP فقط حتى خطوة اختطاف vtable (هدف استدعاء غير مباشر مُتحكَّم به، pc = base+0x41414141). تبقى الخطوات من القفزة المُتحكَّم بها فصاعداً، بالإضافة إلى تنفيذ RCE، سرية وغير مضمنة في هذا المستودع.
يختلف استغلالي عن نهج المُبلّغ الأصلي في نقطة جوهرية. تحقق الاستغلال الأصلي عبر تعديل الكود المصدري لـ PartitionAlloc في عملية GPU لتعطيل عشوائية العناوين. هذا النهج مناسب فقط لأغراض إثبات المفهوم. في المقابل، يجمع استغلالي بين ثغرة إفصاح عن المعلومات لتجاوز عشوائية العناوين، مما يتيح استغلالاً فعّالاً بالكامل يعمل في بيئات واقعية.
# Set build arguments here. See `gn help buildargs`.
is_official_build = true
is_debug = false
symbol_level = 0
v8_symbol_level = 0
blink_symbol_level = 0
is_component_build = false
proprietary_codecs = true
ffmpeg_branding = "Chrome"
dcheck_always_on =false
optimize_webui = true
android_static_analysis = "off"
target_os = "android"
target_cpu = "arm64"
# Disable PartitionAllocEventuallyZeroFreedMemory
disable_fieldtrial_testing_config = true
treat_warnings_as_errors = false
adb logcat | grep DEBUG على الحاسوب