
إثبات المفهوم والتحليل الفني لـ CVE-2026-85046، وهو خلط أنواع في V8 داخل Array.prototype.sort المضمّن، بما في ذلك السبب الجذري وفرق التصحيح وسلسلة الاستغلال لمتصفح Chrome < 152.0.7977.82.
| الحقل | القيمة |
|---|
| CVSS | 8.8 (عالية) |
| CWE | CWE-843 (ارتباك نوعي) |
| المكوّن | محرك JavaScript في V8 -- فرز مضمّن Maglev/Turbofan |
| المتأثر | Chrome < 152.0.7977.82، جميع المتصفحات المبنية على Chromium |
| تم الإصلاح | Chrome 152.0.7977.82 (2026-09-03) |
| Commit الإصلاح | e0562d87ad9c17042b581582c99237d798572e67 |
| CISA KEV | أُضيف 2026-09-04، الموعد النهائي 2026-09-18 |
| استغلال واسع | نعم (مؤكد من Google) |
| المُبلّغ | Salvatore Gulizia (Serotav) |
يقبل تحسين الفرز المضمّن ملاحظات متعددة الأشكال لنوع العناصر (PACKED_SMI_ELEMENTS + PACKED_ELEMENTS). عندما يستدعي المُقارن arr.fill(0)، يهاجر V8 خريطة المستقبِل إلى الخلف من PACKED_ELEMENTS إلى PACKED_SMI_ELEMENTS. ينجح فحص الخريطة بعد الفرز لأن PACKED_SMI_ELEMENTS كان ضمن مجموعة الملاحظات الأصلية. تكتب عملية النسخ الخلفي مؤشرات كائنات في مصفوفة تدّعي خريطتها عناصر SMI فقط.
يضيف الإصلاح شرطًا مسبقًا يتطلب أن تتشارك جميع خرائط المستقبِل في الملاحظات نفس elements_kind قبل تضمين الفرز.
| الملف | الوصف |
|---|---|
patch-analysis.md | تحليل كامل لفرق التصحيح مع السبب الجذري، آلية التشغيل، وتقييم البدائيات الاستغلالية |
patch-analysis.json | بيانات منظمة: hashes الـ commits، CWE، الإصدارات المتأثرة، البدائيات الاستغلالية |
v8-research.md | غوص عميق في أنواع عناصر V8، PoCs سابقة (CVE-2020-6418، CVE-2025-2135، CVE-2024-4947، إلخ)، بنية الصندوق الرملي، تقنيات الهروب |
poc-minimal.js | مشغّل ارتباك نوعي بسيط لـ d8 (d8 --allow-natives-syntax poc-minimal.js) |
poc.html | سلسلة استغلال كاملة: ارتباك نوعي، بدائية addrof، رشّ الكومة، fakeobj عبر تداخل مخزن الدعم، تسريب معلومات |
exploit-notes.md | توثيق تقني: سلسلة خطوة بخطوة، مخططات تخطيط الكومة، ضغط المؤشرات، تأثير الصندوق الرملي، مؤشرات الكشف، المعالجة |
# مع أدوات تصحيح V8
d8 --allow-natives-syntax poc-minimal.js
# بدونها (تحقق استدلالي عبر String())
d8 poc-minimal.js
افتح poc.html في Chrome < 152.0.7977.82. يعمل الاستغلال تلقائيًا ويسجّل كل مرحلة في الصفحة ووحدة تحكم المطوّر. المراحل:
arr.fill(0) في مُقارن الفرزaddrof -- تسرّب مؤشرات الكومة المضغوطة كأعداد صحيحةfakeobj عبر التداخل -- تزوير مراجع كائنات من أعداد صحيحة مُتحكَّم بهاالتدريب (2000 تكرار)
|
v
ارتباك نوعي: خريطة PACKED_ELEMENTS -> خريطة PACKED_SMI_ELEMENTS
(مخزن الدعم ما زال يحمل مؤشرات كائنات)
|
v
addrof: String(confused_array) يسرّب المؤشرات كأعداد صحيحة
|
v
fakeobj: تداخل مصفوفات double/object يكتب مؤشرًا مُتحكَّمًا به
|
v
JSArray مزيف بمؤشر عناصر مُتحكَّم به -> قراءة/كتابة عشوائية (داخل القفص)
|
v
تنفيذ كود داخل صندوق V8 الرملي (يتطلب هروبًا من الصندوق الرملي لـ RCE كامل)
kMaxInlineSortLength)arr.fill() بقيم SMI لترحيل الخريطة إلى الخلفPACKED_SMI و PACKED_ELEMENTS أثناء التدريب