Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-84118-who-labeled-the-crit-as-a-high — إثبات المفهوم لـ CVE-2026-84118، وهو ثغرة استخدام بعد التحرير (use-after-free) في جامع القمامة (GC) الخاص بـ SpiderMonkey تؤدي إلى قراءة/كتابة خارج الحدود واحتمال تنفيذ كود. يتضمن مشغّل خطأ تجزئة (SEGV) حتميًا وبحثًا حول التصعيد إلى قراءة عشوائية وكسر ASLR. | Kitploit
أدوات/GitHubGitHub/sneakynachos/cve-2026-84118-who-labeled-the-crit-as-a-high
تحليل الذاكرة الجنائيتحليل الثغرات الأمنيةالاستغلالأمن الويباستغلال الملفات الثنائية
GitHubsneakynachos/cve-2026-84118-who-labeled-the-crit-as-a-high

CVE-2026-84118-who-labeled-the-crit-as-a-high

إثبات المفهوم لـ CVE-2026-84118، وهو ثغرة استخدام بعد التحرير (use-after-free) في جامع القمامة (GC) الخاص بـ SpiderMonkey تؤدي إلى قراءة/كتابة خارج الحدود واحتمال تنفيذ كود. يتضمن مشغّل خطأ تجزئة (SEGV) حتميًا وبحثًا حول التصعيد إلى قراءة عشوائية وكسر ASLR.

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
عرض المستودع
1منذ 11 ساعاتلم تتم المراجعة بعد

CVE-2026-84118 — استغلال use-after-free في محرك SpiderMonkey (Bug 2057457)

هذه إحدى الحالات التي صنّفتها Mozilla على أنها حرجة (Critical) بينما كانت في الواقع عالية الخطورة (High). لذا قد يرغب شخص ما في مطالبة Firefox بتحديث مكافأة مكتشفي الثغرة الأصليين إذا كان الأمر كذلك.

الخلاصة المختصرة: يمكنك تنفيذ بدائية قراءة/كتابة خارج الحدود (OOB R) على مؤشر مُتحكَم فيه ثم البدء بالتحرك صعودًا وهبوطًا من ذلك المؤشر. لذا إذا وجّهت المؤشر المُتحكَم فيه إلى مصفوفة، فتهانينا يمكنك فعل أشياء ممتعة.

الـ POC يحتوي فقط على جزء الـ SEGV، لذا فإن الباقي مغامرة ممتعة في توجيه المؤشر داخل مصفوفة والقفز إلى WASM من اختيارك.

إثبات مفهوم حتمي لانهيار SEGV في إصدار الإصدار (release) لمتصفح Firefox/SpiderMonkey 154.0.1. تم إصلاحه في الإصدار 155 (إعادة هيكلة AtomMarking). خطورة Mozilla: عالية (HIGH).

تشغيل الـ PoC

root@kitploit:~
/path/to/release/js poc.js

تمت إعادة الإنتاج على الإصدار 154.0.1: 3/3 على غلاف مُحسَّن عادي (SIGSEGV، خروج 139)، 5/5 على غلاف release+gczeal، نفس الخطأ في كل تشغيل:

root@kitploit:~
SEGV على العنوان 0x000000000014 (قراءة)
JS::shadow::Zone::gcState()  <- zone == nullptr، إزاحة +0x14

السبب الجذري

الإصدار 154 يخلط بين خرائط بتات العلامات (mark) للذرات لكل منطقة (per-zone) مع تتبع المراجع (reference). رمز (Symbol) محتفظ به بشكل ضعيف فقط — هنا، مُلتقَط كحقل Value ضعيف داخل كعب IC الخاص بـ Baseline CacheIR — ومشار إليه من منطقة غير مجمَّعة (uncollected zone) لا يتم إعادة تمييزه أبدًا عندما يتم جمع منطقة الذرات في GC بنطاق منطقة (zone-scoped GC). النتيجة هي حافة قديمة (stale edge) إلى خلية تم كنسها/نقلها.

الضربة القاتلة في إصدار الإصدار هي خطأ ثانٍ ثابت: MightBeForwarded<JS::Symbol> مُرمَّز بشكل ثابت على false، لذا IsForwarded تُرجع false بدون فحص (gc/Marking-inl.h:92-97) و كل مسار إصلاح مؤشر يعتمد عليها يتخطى الحافة بصمت. عندما تكون منطقة الذرات مضغوطة (compacted)، يتم تحديث الحواف القوية بشكل صحيح، لكن هذه الحافة الضعيفة لـ CacheIR تُترك معلقة بشكل دائم على العنوان القديم لرمز الضحية. (إصدارات التصحيح تلتقطها كـ Assertion failure: !t->isForwarded(), gc/Marking-inl.h:94.)

كيف يحوّل الـ PoC الحافة المعلقة إلى SEGV

الـ PoC لا يكتفي بترك مؤشر قديم إلى كومة قابلة لإعادة الاستخدام — بل يجعل الصفحة الداعمة غير مُعيَّنة (munmapped)، بحيث يسبب أي إلغاء مرجعية تالٍ خطأ.

  1. عزل القطع لكل منطقة. مجمعات قطع GC تكون لكل منطقة (Zone::availableChunks/fullChunks)، لذا فإن قطع منطقة الذرات تحتوي فقط على حاويات (arenas) لمنطقة الذرات. يمكن التحكم في مصير القطعة بشكل كامل بواسطة أعمار الذرات/الرموز.
  2. تهيئة الكومة. 300 رمز "مغناطيسي" (مُبقى على قيد الحياة) تشغل قطعة مبكرة وتعمل كـ وجهة الضغط. ثم تملأ 150,000 رمز قابل للتصرف ~4 قطع جديدة بحجم 1 ميجابايت، بحيث يقع رمز الضحية في منتصف الرش في قطعة تحتوي فقط على رموز رش محكوم عليها بالموت.
  3. رقصة الرمز المحتفظ به بشكل ضعيف (الأسطر 21-31، هشّة على مستوى البايت كود — يجب أن تبقى حرفيًا): c.eval(b) يجعل كعب IC للاستدعاء على المستوى الأعلى يلتقط الرمز في حقل كعب ضعيف؛ b = undefined يُسقط آخر جذر قوي؛ يتم إسقاط الرش؛ عمليتا GC بنطاق منطقة (gc("zone"), schedulezone(c) + schedulezone("") + gc("zone") — السلسلة الفارغة تُجدول منطقة الذرات) تكنسان الرش الميت، وتضغطان الضحية في حاوية المغناطيس، تتخطيان إصلاح الحافة الضعيفة، وتحرران حاوية الضحية. قطعتها الآن فارغة تمامًا.
  4. munmap. gcparam("minEmptyChunkCount", 0) يجعل كل قطعة فارغة قابلة للانتهاء؛ أثناء sleep(0.5) تقوم مهمة BackgroundDecommitTask بتشغيل expireEmptyChunkPool -> -> — إلغاء تعيين حقيقي لقطعة الضحية. (إلغاء الالتزام على مستوى الحاوية هو فقط — أصفار قابلة للقراءة — تحرير القطعة بالكامل هو مسار munmap الوحيد، ولهذا فإن عزل القطع في الخطوة 1 مهم.)

ما بعد انهيار الصفحة الفارغة

هذا ليس مجرد DoS. تصعيدات مُثبتة (PoCs وسجلات في دليلي البحث GC-NDAY/ و CHAIN/):

  • عنوان خطأ يختاره المهاجم (segv9): بعد الـ munmap، انقلاب نصف مساحة minorgc() يجعل الحضانة (nursery) تطالب بالعنوان الافتراضي المحرر؛ رش مصفوفة كثيفة مزدوجة يكتب كلمة رباعية (qword) يختارها المهاجم فوق حقل zone لرأس الحاوية القديم. ثم يقوم الكنس بإلغاء مرجعية attacker_ptr + 0x14 — حتمي 3/3 عند 0x424242424256.
  • التحكم في الحكم + قراءات قابلة للتكرار: القيمة المحمَّلة تختار حكم حيوية الحافة الضعيفة؛ حكم "حي" (LIVE) يُبقي الحافة المعلقة و يعيد إلغاء مرجعيتها في كل GC رئيسي لاحق (قراءات يختارها المهاجم
    • وحي (oracle) قابل للملاحظة من السكربت ببت واحد). حكم "ميت" (DEAD) يشفي ذاتيًا.
  • سلسلة من خطأين: مؤشر js::Zone* حقيقي تم تسريبه عبر قناة جانبية تخمينية منفصلة تم زرعه من خلال هذا التعبئة؛ المستهلك (المجمِّع) استهلك بيانات الحاوية المزورة بدون التسبب بخطأ (زرع تحكم مضطرب ببت واحد ينهار)، مما يُثبت تكوين هزيمة ASLR -> زرع UAF.
  • سالب محدود: fakeobj المباشر من خلال عائلة الكعوب هذه محجوب معماريًا — الضغط يصلح الحواف القوية بشكل صحيح، فقط الحواف الضعيفة تعلق، ومستهلكو كنسها فرعيون فقط.
تنزيل الأداة
FreeChunkPool
UnmapPages
madvise(MADV_DONTNEED)
  • إلغاء المرجعية المُسبِّب للخطأ. عملية gc() النهائية تكنس بيانات JIT: sweepJitDataOnMainThread -> ICEntry::traceWeak -> TraceWeakCacheIRStub يقرأ مؤشر الرمز القديم، ثم SweepingTracer::onEdge (gc/Marking.cpp:3195) يقوم بحساب القطع على العنوان القديم لتحميل حقل zone لرأس الحاوية. الصفحة اختفت/صُفِّرت، لذا zone == nullptr، و zone->isGCSweeping() يقرأ nullptr + 0x14 (shadow::Zone::gcState) -> SIGSEGV. عند الخطأ، يحمل rcx مؤشر الرمز القديم و rdx قاعدة القطعة غير المُعيَّنة.