
Google Chrome CVE-2026-6307 PoC
استنساخ محلي وتسليح لارتباك نوع إلغاء التحسين لـ V8 من JS إلى Wasm الموصوف من قبل Nebula، تم نقله إلى xcalc تم إطلاقه من معالج عرض Chrome للاختبار 146.0.7680.165 (تم إصلاح الخلل في 147.0.7727.101).
جميع الحمولات غير ضارة (آلة حاسبة / exit(0x42) / jmp $).
كل شيء يعمل ضد متصفح قديم عمداً في مختبر محلي، لا توجهه إلى أي شخص آخر.
https://github.com/user-attachments/assets/d450f064-ba52-4f39-a88b-367f31217143
عامل المساواة في JSToWasmFrameStateFunctionInfo يحذف مقارنة توقيع Wasm، لذلك يقوم CSE/GVN بدمج حالات الإطار التي تختلف فقط في التوقيع. ثم يقوم إلغاء التحسين الكسول بتجسيد Wasm i64 كـ externref موسوم (والعكس)، مما يعطي addrof/fakeobj كامل 64 بت ومؤشراتها ليست مضغوطة في القفص (تستخدم مراجع Wasm تمثيل السجل الموسوم، ويتم إرجاعها عبر kReturnRegister0).
كل ما يلي تم التحقق منه مباشرة ضد 146.0.7680.165. الأرقام لكل تحميل هي معدلات نجاح مقاسة عبر تشغيلات متكررة (الارتباك حساس لـ GC؛ كل صفحة تعاد تشغيلها على بناء قذر). لم ينتج أي تشغيل نتيجة إيجابية خاطئة.
--allow-natives-syntaxمعظم PoCs لخلل V8 تفرض التحسين باستخدام %OptimizeFunctionOnNextCall، وهو دالة داخلية للاختبار فقط محجوبة خلف --allow-natives-syntax لا يقوم أي ضحية حقيقي بتمكينها. هذه تقود الخلل بدون أعلام على الإطلاق، من خلال تشكيل ردود فعل الإحماء بحيث يشتعل ارتباك إلغاء التحسين بشكل طبيعي. يتم تسريب كل عنوان في وقت التشغيل — لا شيء مشفر. قم بتشغيلها بدون رأس وبدون أعلام.
يقوم rce-no-aslr/ بنقلها إلى تنفيذ التعليمات البرمجية: دالة JS محسنة g تنظم شيلكود execve كقيم JIT مزدوجة (ثوابت movabs، كل منها ينتهي بـ eb rel8 لتسلسل التالي)، يقوم التخزين المربك بتصحيح nop; jmp في كود g، واستدعاء g() ينزلق RIP إلى الشيلكود.
يستخدم هذا البناء --allow-natives-syntax (%Optimize يثبت حمولة JIT الخاصة بـ g بحيث لا يمكن لـ GC إلغاء التحسين مسحها) و --no-memory-protection-keys (بحيث يمكن للتخزين المربك تصحيح صفحة JIT — وإلا فإن PKU لـ V8 يجعلها للقراءة فقط). تم إيقاف ASLR (randomize_va_space=0) لذا فإن العناوين حتمية (A_MAP = 0x5555bbc0128a). يحتاج المعالج أيضًا إلى --disable-seccomp-filter-sandbox --no-zygote، لأن seccomp يمنع execve للشيلكود.
نظام Linux x86_64 أصلي، ASLR معطل، Chrome 146 في PATH، شاشة X على :0 (Xvfb أو X حقيقي). يقوم rce-no-aslr/run.sh بتعيين جميع الأعلام ويخدم عبر http.
cd rce-no-aslr
./run.sh calc # pop a real xcalc over http://127.0.0.1:8080, on :0
./run.sh exit # strace-confirms the renderer's exit(66)
./run.sh jmp # gdb-confirms RIP inside the injected shellcode
./demo.sh calc # clean-slate + auto-retry, full-size headful browser (for recording)
./demo.sh msgbox # same, but the pop is a branded "0xSha :: pwned" box
يقوم pocmode.sh calc|msgbox بتبديل ما يطلقه execve("/usr/bin/xcalc") الخاص بـ RCE (آلة حاسبة حقيقية مقابل الصندوق المسمى). الأساسيات بدون أعلام تحتاج فقط إلى متصفح:
chrome --headless=new --no-sandbox http://127.0.0.1:8080/flag-free/01-primitives-flagfree.html
flag-free/ المساهمة بدون أعلام (لا --allow-natives-syntax)
00-reachability المشغل + فرق التصحيح (الضعيف 146 مقابل المصحح 147)
01-primitives addrof / fakeobj
02-store تخزين خارج القفص
03-arw في القفص read64 / write64
rce-no-aslr/ RCE المرئي (حتمي، بناء مختبر بدون ASLR)
exploit-calc.html / exploit-exit.html
run.sh, demo.sh, pocmode.sh, xcalc-msgbox.sh
كتابة الخلل والجذر: Nebula Security (مذكور أعلاه). المشغل بدون أعلام، والأساسيات، والأعمال المرئية في هذا المستودع هي استنساخ/توسعات تم التحقق منها في مختبر محلي.
| الملف | يثبت | تم التحقق |
|---|
flag-free/00-reachability-flagfree.html | يؤدي إلى الحالة المربكة؛ يعمل على الإصدار الضعيف 146، ليس على الإصدار المصحح 147 | 6/15 لكل تحميل |
flag-free/01-primitives-flagfree.html | addrof / fakeobj (fakeobj(addrof(o))===o) | 8/12 |
flag-free/02-store-flagfree.html | تخزين خارج القفص يضع قيمة مختارة في كائن مختار | 12/12 |
flag-free/03-arw-flagfree.html | في القفص read64 / write64 (مصفوفة PACKED_DOUBLE مزيفة) | 2/12 (غير مستقر، أعد المحاولة) |
| الملف | يثبت | تم التحقق |
|---|
rce-no-aslr/exploit-calc.html | يفتح نافذة xcalc حقيقية عبر execve من المعالج | يفتح في ~1 ثانية على حالة نظيفة |
rce-no-aslr/exploit-exit.html | المعالج يشغل الشيلكود المحقون لـ exit(66); #jmp يدير RIP داخله | exit(66) 8/8 (strace) |