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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
أدوات/GitHubGitHub/sneakynachos/cve-2026-15718-who-put-ptrs-in-my-wasm
تحليل الثغرات الأمنيةالاستغلالالهندسة العكسيةأمن الويبتطوير الحمولاتاستغلال الملفات الثنائية
GitHubsneakynachos/cve-2026-15718-who-put-ptrs-in-my-wasm

CVE-2026-15718-who-put-ptrs-in-my-wasm

سلسلة استغلال PoC لـ CVE-2026-15718: مترجم SpiderMonkey wasm الأساسي array.fill بفقدان المزامنة -> مؤشر غير صالح -> addrOf/fakeobj -> قراءة/كتابة عشوائية -> تنفيذ كود عن بُعد (RCE)

عرض المستودع
1منذ يوم واحدلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
مشاركة

CVE-2026-15718 — من وضع المؤشرات في wasm الخاص بي؟

سلسلة استغلال لإثبات المفهوم لـ CVE-2026-15718، وهي سوء ترجمة ناتج عن غياب sync() في مترجم WebAssembly من فئة baseline في Mozilla SpiderMonkey (مكوّن "JavaScript: WebAssembly"). عملية array.fill واحدة بصفر تكرارات تُنتج بدائية fakeobj؛ ثم تتصاعد السلسلة إلى قراءة/كتابة عشوائية في عملية المضيف وتنفيذ كود أصلي عشوائي (posix_spawnp("/bin/sh", ...)).

  • CVE: CVE-2026-15718 (CWE-763، تحرير مؤشر غير صالح)
  • الإصدارات المتأثرة: Firefox < 152.0.6، Firefox ESR < 140.13، Thunderbird < 140.13
  • أُصلح في: Firefox 152.0.6 / ESR 140.13 / Thunderbird 140.13، 2026-07-14
  • الخلل الأصلي (upstream): Mozilla Bug 2045443 (MFSA-2026-67)
  • التزام الإصلاح: 4441102e62e8 ("Bug 2045443"، سطر واحد)

السبب الجذري

تُصدر BaseCompiler::emitArrayFill() (js/src/wasm/WasmBaselineCompile.cpp) حلقة تعبئة دون استدعاء أولاً:

array.fill
sync()
root@kitploit:~
   if (elementType.isRefRepr()) {
     freePtr(RegPtr(PreBarrierReg));
   }

+  sync();
+
   // Perform the fill loop using `numElements` as the loop variable ...

تقوم sync() بدفع مكدس القيم الخاص بمترجم baseline (stk_) من السجلات إلى مكدس الآلة. يستدعي حاجز ما بعد الكتابة غير الدقيق (emitPostBarrierEdgeImprecise) في كل تكرار من حلقة التعبئة الدالةَ sync() داخلياً — لكن فقط إذا كانت الحلقة تُنفَّذ. تسمية الخروج من الحلقة (done) هي نقطة التقاء لمسارين:

  • نُفذت الحلقة مرة واحدة على الأقل (عناصر reftype): stk_ متزامن — كل معامل يعيش في خانة من مكدس الآلة؛
  • صفر تكرارات (numElements == 0): stk_ لم يُمَس — المعاملات ما تزال تعيش في السجلات فقط.

يعكس النموذج الثابت للمترجم بعد نقطة الالتقاء المسار المتزامن دائماً، لذلك يقرأ الكود المُصدَر بعد array.fill المعاملات من خانات مكدس لم يكتبها تنفيذ صفري التكرارات أبداً. إن قراءة معامل من نوع reftype بهذه الطريقة تعطي مؤشراً غير صالح (قديماً) (CWE-763).

البدائية: تقنية زرع/قراءة الخانة

عدم التزامن ثنائي الاتجاه عبر دالّتي wasm متطابقتَي الإطار:

  • الزرع (plant) (n = 1، الحلقة تُنفَّذ): دالة sync() داخل الحلقة تكتب قيمة في الخانة — إمّا ref حقيقي (addrOf) أو i64 متحكَّم فيه (إعداد fakeobj)؛
  • القراءة (read) (n = 0، صفر تكرارات): الخانة لا تُكتب أبداً؛ الدالة التوأم تقرأ الخانة القديمة — كـ i64 (تسريب) أو كـ (ref $t) (fakeobj).

سلسلة الاستغلال (poc/)

الملفالمرحلةالنتيجة
poc-min.js (+ gen_trigger.py)عرض عدم التزامنمسار التحكم يعيد القيمة الصحيحة؛ مسار صفر التكرارات يعيد مؤشراً عشوائياً مقروءاً من الخانة التي لم تُكتب أبداً
chain.js (+ gen_chain.py, chain.tpl.js, build.sh)السلسلة الكاملةaddrOf + fakeobj → WasmArrayObject مزيف → قراءة/كتابة عشوائية → تسريب قاعدة XUL → التجوال في استيرادات Mach-O في وقت التشغيل → funcref مزيّف → posix_spawnp("/bin/sh", ["-c", "touch /tmp/CVE-2026-15718-PWNED"])

تفاصيل المراحل في chain.js:

  1. plantSpray/plantCmd/plantFun/plantExt + leak — addrOf لصفائف wasm ولـ funcrefs وللكائنات JS (externref).
  2. sprayV + fakeRd/fakeWr — fakeobj؛ كائن WasmArrayObject مزيف (numElements_ @+16، data_ @+24، عناصر inline @+40) مع إبقاء النافذة المزيفة في مصفوفة خارج الخط (out-of-line) (مخصَّصة عبر malloc) حتى لا يتمكن جامع القمامة (GC) من نقلها أثناء الفحص.
  3. تسريب نقطة الدخول الأصلية لدالة JSFunction (+0x20)، ثم مسح للخلف صفحة بصفحة بحثاً عن توقيع Mach-O السحري (0xfeedfacf) ← قاعدة XUL.
  4. حل الرموز ديناميكياً بالكامل: التجوال في أوامر تحميل Mach-O الخاصة بـ XUL عبر القراءة العشوائية (LC_SEGMENT_64/LC_SYMTAB/LC_DYSYMTAB + جدول الرموز غير المباشر) لتحديد مدخل __stubs الخاص بـ _posix_spawnp. لا إزاحات مثبتة في الكود؛ يقوم الـ stub بالربط الكسول عند أول استدعاء.
  5. تزوير funcref (typeDef @+0x40 منسوخ من ref.func حقيقي، هدف الاستدعاء @+0x38 = عنوان الـ stub) واستدعاؤه عبر call_ref باستخدام posix_spawnp(pid, "/bin/sh", 0, 0, [sh, -c, cmd], 0).

التشغيل

تم الاختبار باستخدام xpcshell (أو قشرة js / المتصفح) مبنية من شجرة سابقة للإصدار 152.0.6 (البناء المرجعي هنا هو Firefox 149.0a1، 2026-01-14):

root@kitploit:~
# minimal desync demo
xpcshell poc/poc-min.js

# full chain (regenerates chain.js from the template + generator)
(cd poc && sh build.sh)
rm -f /tmp/CVE-2026-15718-PWNED
xpcshell poc/chain.js    # creates /tmp/CVE-2026-15718-PWNED
ls -l /tmp/CVE-2026-15718-PWNED

تضبط المنظومة (harness) javascript.options.wasm_optimizingjit=false لتثبيت طبقة baseline أثناء فحص Mach-O الطويل (الخلل خاص بطبقة baseline فقط؛ في المتصفح يعمل المشغِّل بأقل بكثير من عتبة رفع الطبقة، لذا لا حاجة لذلك هناك). tools/xul_slots.py هو مدقِّق يعمل دون اتصال يسرد خانات الـ stub/GOT المسماة في XUL (يُستخدم للتحقق المتبادل من المتجول في وقت التشغيل).

ملاحظات قابلية النقل

الإزاحات مخصصة لـ macOS arm64 ولهذه الشجرة/البناء بالذات (WasmArrayObject { +16 numElements، +24 data_، +40 inline }، JSFunction native @ +0x20، WasmFuncRef { +0x38/+0x48 هدف الاستدعاء، +0x40 typeDef }). جميعها تُشتق من جديد في وقت التشغيل عبر اختبارات السلسلة الذاتية؛ لا يُفترض سوى تخطيط البنى. لا توجد مخاوف متعلقة بـ PAC (XUL ثنائي arm64 وليس arm64e)؛ يحل الـ stub ذو الربط الكسول الهدف عند أول استدعاء، لذا لا حاجة لإزاحات dyld-shared-cache.

النطاق / القيود الصريحة

يعمل هذا العرض (PoC) في عملية قشرة (shell) بدون صندوق رمل. في هجوم Firefox حقيقي، تهبط السلسلة داخل عملية المحتوى، حيث يرفض صندوق رمل macOS استدعاء posix_spawnp — يلزم خلل منفصل للهروب من صندوق رمل نظام التشغيل لتحقيق اختراق كامل (انظر مثلاً تحليل المرحلة الثانية في CVE-2026-2796-and-CVE-2026-2768-escape-the-wasm-box).

التخفيفات

  • التحديث إلى Firefox / Thunderbird ≥ 152.0.6 (ESR ≥ 140.13).
  • دفاع في العمق: javascript.options.wasm=false يحجب ناقل المشغِّل.

المراجع

  • MFSA-2026-67
  • NVD: CVE-2026-15718
  • الإصلاح: https://github.com/mozilla-firefox/firefox/commit/4441102e62e8

إخلاء مسؤولية

لأغراض البحث الأمني والتعليم والاختبار الدفاعي فقط. الثغرة مصحَّحة في إصدارات Firefox/Thunderbird الحالية. لا تستخدمها ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.

تنزيل الأداة