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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
fuzzilli — مختبر عشوائي لمحرك جافا سكريبت | Kitploit
أدوات/GitHubGitHub/googleprojectzero/fuzzilli
تحليل الثغرات الأمنيةالاختبار العشوائيتحليل الملفات الثنائيةالأوراق والأبحاثالتعلم والتعليم
GitHubgoogleprojectzero/fuzzilli

fuzzilli

مختبر عشوائي لمحرك جافا سكريبت

عرض المستودع
2.3k3661منذ 7 أيامتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

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

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

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

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

فيوزيلي

مُختبر اختراق (Fuzzer) موجه بالتغطية (coverage-guided) لمفسري اللغات الديناميكية، يعتمد على لغة وسيطة مخصصة (FuzzIL) يمكن تحويرها وترجمتها إلى جافاسكريبت.

الاستخدام

الخطوات الأساسية لاستخدام هذا المُختبر هي:

  1. قم بتنزيل الكود المصدري لإحدى محركات جافاسكريبت المدعومة. راجع دليل Targets/ للحصول على قائمة محركات جافاسكريبت المدعومة.
  2. قم بتطبيق التصحيحات (patches) المقابلة من دليل الهدف. راجع أيضًا ملف README.md في ذلك الدليل.
  3. قم بترجمة المحرك مع أجهزة التغطية (يتطلب clang >= 4.0) كما هو موصوف في README.
  4. قم بترجمة المُختبر: swift build [-c release].
  5. قم بتشغيل المُختبر: swift run [-c release] FuzzilliCli --profile=<profile> [other cli options] /path/to/jsshell. راجع أيضًا swift run FuzzilliCli --help.

إنشاء وتشغيل فيوزيلي ومحركات جافاسكريبت المدعومة داخل Docker وعلى Google Compute Engine مدعوم أيضًا.

الاختراق (Hacking)

اطلع على main.swift لترى مثالاً على استخدام مكتبة فيوزيلي وتجربة خيارات التكوين المختلفة. بعد ذلك، ألق نظرة على Fuzzer.swift للاطلاع على منطق الاختبار عالي المستوى. من هناك، تعمق في أي جزء يبدو مثيرًا للاهتمام.

التصحيحات والإضافات والمساهمات الأخرى لهذا المشروع مرحب بها جدًا! ومع ذلك، يُرجى مراجعة ملاحظات المساهمين بسرعة. يتبع فيوزيلي تقريبًا دليل أسلوب كود جوجل لـ Swift.

سيكون موضع تقدير كبير إذا أمكنك إرسال ملاحظة قصيرة (قد تتضمن رقم CVE) إلى [email protected] أو فتح طلب سحب (pull request) لأي ثغرة تم العثور عليها بمساعدة هذا المشروع ليتم تضمينها في قسم عرض الثغرات. بخلاف ذلك، يمكنك بالطبع المطالبة بأي مكافأة للثغرات، أرصدة CVE، إلخ للثغرات :)

المفهوم

عند اختبار الأخطاء الأساسية للمفسر، مثل مترجمات JIT، تصبح الصحة الدلالية للبرامج المُنشأة مصدر قلق. وهذا على عكس معظم السيناريوهات الأخرى، مثل اختبار واجهات برمجة التطبيقات في وقت التشغيل، حيث يمكن بسهولة تجاوز مشكلة الصحة الدلالية عن طريق تغليف الكود المُنشأ في بنيات try-catch. هناك احتمالات مختلفة لتحقيق معدل مقبول من العينات الصحيحة دلالياً، أحدها هو النهج التحويري (mutational approach) حيث تكون جميع العينات في المجموعة (corpus) صالحة دلاليًا أيضًا. في هذه الحالة، كل تحوير له فرصة صغيرة فقط لتحويل عينة صالحة إلى عينة غير صالحة.

لتنفيذ مُختبر اختراق جافاسكريبت قائم على التحوير، يجب تعريف التحويرات على كود جافاسكريبت. بدلاً من تحوير شجرة البنية المجردة (AST) أو العناصر النحوية الأخرى للبرنامج، يتم تعريف لغة وسيطة مخصصة (IL) يمكن من خلالها إجراء تحويرات على تدفق التحكم والبيانات بشكل أكثر مباشرة. يتم بعد ذلك ترجمة هذه اللغة الوسيطة إلى جافاسكريبت للتنفيذ. تبدو اللغة الوسيطة تقريبًا كما يلي:

root@kitploit:~
v0 <− LoadInteger '0'
v1 <− LoadInteger '10'
v2 <− LoadInteger '1'
v3 <− LoadInteger '0'
BeginFor v0, '<', v1, '+', v2 −> v4
   v6 <− BinaryOperation v3, '+', v4
   Reassign v3, v6
EndFor
v7 <− LoadString 'Result: '
v8 <− BinaryOperation v7, '+', v3
v9 <− LoadGlobal 'console'
v10 <− CallMethod v9, 'log', [v8]

والتي يمكن، على سبيل المثال، ترجمتها بسهولة إلى كود جافاسكريبت التالي:

root@kitploit:~
const v0 = 0;
const v1 = 10;
const v2 = 1;
let v3 = 0;
for (let v4 = v0; v4 < v1; v4 = v4 + v2) {
    const v6 = v3 + v4;
    v3 = v6;
}
const v7 = "Result: ";
const v8 = v7 + v3;
const v9 = console;
const v10 = v9.log(v8);

أو إلى كود جافاسكريبت التالي عن طريق تضمين التعبيرات الوسيطة (inlining):

root@kitploit:~
let v3 = 0;
for (let v4 = 0; v4 < 10; v4++) {
    v3 = v3 + v4;
}
console.log("Result: " + v3);

تمتلك FuzzIL عددًا من الخصائص:

  • برنامج FuzzIL هو ببساطة قائمة من التعليمات.
  • تعليمة FuzzIL هي عملية مع متغيرات الإدخال والإخراج وربما معلمة واحدة أو أكثر (محاطة بفواصل مفردة في الترميز أعلاه).
  • مدخلات التعليمات هي دائمًا متغيرات، لا توجد قيم فورية.
  • كل مخرج من تعليمة هو متغير جديد، ولا يمكن إعادة تعيين المتغيرات الموجودة إلا من خلال عمليات مخصصة مثل تعليمة Reassign.
  • كل متغير يُعرّف قبل استخدامه.

يمكن بعد ذلك إجراء عدد من التحويرات على هذه البرامج:

  • InputMutator: يستبدل متغيرات الإدخال للتعليمات بأخرى مختلفة لتحوير تدفق البيانات للبرنامج.
  • CodeGenMutator: يُنشئ كودًا ويُدرجه في مكان ما في البرنامج المحور. يتم إنشاء الكود إما عن طريق تشغيل مُولد الكود أو عن طريق نسخ بعض التعليمات من برنامج آخر في المجموعة (splicing).
  • CombineMutator: يُدرج برنامجًا من المجموعة في موضع عشوائي في البرنامج المحور.
  • OperationMutator: يحور معاملات العمليات، على سبيل المثال استبدال ثابت صحيح بآخر مختلف.
  • والمزيد...

يمكن العثور على مناقشة أكثر شمولاً لكيفية عمل فيوزيلي هنا.

التنفيذ

المُختبر مُنفذ بلغة Swift، مع بعض الأجزاء (مثل قياسات التغطية، تفاعلات المقابس، إلخ) منفذة بلغة C.

البنية

يتكون مثيل المُختبر (منفذ في Fuzzer.swift) من المكونات المركزية التالية:

  • MutationFuzzer: ينتج برامج جديدة من البرامج الموجودة عن طريق تطبيق التحويرات. ثم ينفذ العينات المنتجة ويقيمها.
  • ScriptRunner: ينفذ برامج اللغة الهدف.
  • Corpus: يخزن العينات المثيرة للاهتمام ويوفرها للمختبر الأساسي.
  • Environment: لديه معرفة ببيئة التشغيل، مثل الدوال المدمجة المتاحة، أسماء الخصائص، والطرق.
  • Minimizer: يقلص البرامج المتسببة في الأعطال والمثيرة للاهتمام.
  • Evaluator: يقيم ما إذا كانت العينة مثيرة للاهتمام وفقًا لبعض المقاييس، مثل تغطية الكود.
  • Lifter: يترجم برنامج FuzzIL إلى اللغة الهدف (جافاسكريبت).

علاوة على ذلك، تتوفر عدد من الوحدات اختياريًا:

  • Statistics: يجمع قطعًا متنوعة من المعلومات الإحصائية.
  • NetworkSync: مزامنة مثيلات متعددة عبر الشبكة.
  • ThreadSync: مزامنة مثيلات متعددة داخل نفس العملية.
  • Storage: يخزن البرامج المتسببة في الأعطال على القرص.

المُختبر مدفوع بالأحداث (event-driven)، حيث تتم معظم التفاعلات بين الفئات المختلفة من خلال الأحداث. يتم إرسال الأحداث، على سبيل المثال، نتيجة لعطل أو العثور على برنامج مثير للاهتمام، أو تنفيذ برنامج جديد، أو إنشاء رسالة سجل، وهكذا. راجع Events.swift للحصول على القائمة الكاملة للأحداث. آلية الأحداث تفصل بشكل فعال المكونات المختلفة للمُختبر وتجعل من السهل تنفيذ وحدات إضافية.

يمكن بناء برنامج FuzzIL باستخدام مثيل ProgramBuilder. يوفر ProgramBuilder طرقًا لإنشاء وإلحاق تعليمات جديدة، وإلحاق تعليمات من برنامج آخر، واسترداد المتغيرات الموجودة، والاستعلام عن سياق التنفيذ في الموضع الحالي (مثل ما إذا كان داخل حلقة)، والمزيد.

التنفيذ

يستخدم فيوزيلي وضع تنفيذ مخصص يسمى REPRL (read-eval-print-reset-loop). لذلك، يتم تعديل المحرك الهدف لقبول إدخال نصي عبر الأنابيب و/أو الذاكرة المشتركة، وتنفيذه، ثم إعادة تعيين حالته الداخلية وانتظار النص التالي. هذا يزيل الحمل الزائد الناتج عن إنشاء العمليات وإلى حد كبير عن تهيئة المحرك.

قابلية التوسع

يوجد مثيل Fuzzer واحد لكل عملية هدف. يتيح ذلك التنفيذ المتزامن للبرامج وبالتالي يبسط تنفيذ الخوارزميات المختلفة مثل التحويرات المتتالية والتصغير. علاوة على ذلك، يتجنب الحاجة إلى تنفيذ وصول آمن للخيوط إلى الحالة الداخلية، مثل المجموعة. كل مثيل للمُختبر له DispatchQueue خاص به، والذي يتوافق نظريًا مع خيط واحد. كقاعدة عامة، يجب أن يحدث كل تفاعل مع مثيل Fuzzer على قائمة الانتظار الخاصة به. يضمن ذلك سلامة الخيوط لأن الطابور تسلسلي. لمزيد من التفاصيل راجع الوثائق.

للتوسع، يمكن لمثيلات المُختبر تشكيل هيكل شجري، وفي هذه الحالة يقومون بالإبلاغ عن العينات المثيرة للاهتمام والأعطال التي تم العثور عليها حديثًا إلى العقدة الأم. في المقابل، تقوم العقدة الأم بمزامنة مجموعتها مع العقد التابعة لها. يمكن أن يحدث الاتصال بين العقد في الشجرة بطرق مختلفة، كل منها منفذ كوحدة:

  • الاتصال بين الخيوط: مزامنة المثيلات في نفس العملية عن طريق إدراج المهام في قائمة انتظار المُختبر الآخر.
  • الاتصال بين الأجهزة: مزامنة المثيلات عبر بروتوكول بسيط قائم على TCP.

يسمح هذا التصميم للمُختبر بالتوسع إلى العديد من النوى على جهاز واحد وكذلك إلى العديد من الأجهزة المختلفة. نظرًا لأن عقدة أم واحدة يمكن أن تصبح محملة بشكل زائد بسرعة إذا أرسلت إليها مثيلات كثيرة جدًا برامج، فمن الممكن تكوين مستويات متعددة من المثيلات، على سبيل المثال، مثيل جذر واحد، و16 عقدة وسيطة متصلة بالجذر، و256 "ورقة" متصلة بالعقد الوسيطة. راجع دليل Cloud/ لمزيد من المعلومات حول الاختبار الموزع.

الموارد

موارد إضافية حول هذا المُختبر:

  • عرض تقديمي حول فيوزيلي قُدّم في Offensive Con 2019.
  • أطروحة الماجستير التي تم من أجلها التنفيذ الأولي.
  • منشور مدونة من Sensepost حول استخدام فيوزيلي للعثور على خطأ في v8.
  • منشور مدونة من Doyensec حول اختبار محرك JerryScript باستخدام فيوزيلي.
  • ورقة بحثية من ندوة NDSS 2023 حول فيوزيلي وكيفية مقارنته بالمُختبرات الأخرى.

عرض الثغرات

فيما يلي قائمة ببعض الثغرات التي تم العثور عليها بمساعدة فيوزيلي. يجب تضمين الثغرات ذات التأثير الأمني فقط التي كانت موجودة في إصدار بيتا على الأقل من البرنامج المتأثر في هذه القائمة. نظرًا لأن فيوزيلي يُستخدم غالبًا لاختبارات مستمرة أثناء التطوير، فإن العديد من المشكلات التي يعثر عليها غير مدرجة في هذه القائمة لأنها تُعثر عليها عادةً قبل وصول الكود الضعيف إلى إصدار بيتا. ومع ذلك، يمكن العثور على قائمة بجميع المشكلات التي عثر عليها فيوزيلي مؤخرًا في V8 هنا.

شكر خاص لجميع مستخدمي فيوزيلي الذين أبلغوا عن الثغرات التي عثر عليها!

WebKit/JavaScriptCore

  • Issue 185328: يستخدم مترجم DFG سجل إخراج غير صحيح لعملية NumberIsInteger
  • CVE-2018-4299: تسريب كائن داخلي إلى النص البرمجي عبر performProxyCall
  • CVE-2018-4359: ينتج compileMathIC كود آلة غير صحيح
  • CVE-2019-8518: وصول خارج الحدود (OOB) في FTL JIT بسبب نقل كود ثابت الحلقة (LICM) الذي ينقل الوصول إلى المصفوفة قبل فحص الحدود
  • CVE-2019-8558: استخدام بعد التحرير (UaF) لـ CodeBlock بسبب نقاط المراقبة المعلقة (Watchpoints)
  • CVE-2019-8611: تحسين AIR يزيل بشكل غير صحيح تعيين السجل
  • CVE-2019-8623: نقل كود ثابت الحلقة (LICM) في DFG JIT يترك متغير المكدس غير مهيأ
  • CVE-2019-8622: دالة doesGC() في DFG غير صحيحة بشأن سلوك عملية HasIndexedProperty على كائنات StringObject
  • CVE-2019-8671: DFG: نقل كود ثابت الحلقة (LICM) يترك الوصول إلى خاصية الكائن غير محروس
  • CVE-2019-8672: استخدام بعد التحرير لـ JSValue في ملفات تعريف القيم (ValueProfiles)
  • CVE-2019-8678: فشل JSC في تشغيل haveABadTime() عند تعديل بعض النماذج الأولية، مما يؤدي إلى ارتباك الأنواع
  • CVE-2019-8685: يستخدم JSPropertyNameEnumerator معرفات بنية خاطئة
  • CVE-2019-8765: ارتباك نوع GetterSetter أثناء ترجمة DFG
  • CVE-2019-8820: ارتباك نوع أثناء الانسحاب (bailout) عند إعادة بناء كائنات الوسائط (arguments)
  • CVE-2019-8844: لا ينبغي لـ ObjectAllocationSinkingPhase إدراج تلميحات للتخصيصات التي لم تعد صالحة

Gecko/Spidermonkey

  • CVE-2018-12386: خطأ في تخصيص السجلات في IonMonkey يؤدي إلى ارتباك الأنواع
  • CVE-2019-9791: استدلال النوع لـ IonMonkey غير صحيح للمُنشئات التي يتم إدخالها عبر OSR
  • CVE-2019-9792: تسريب IonMonkey القيمة السحرية JS_OPTIMIZED_OUT إلى النص البرمجي
  • CVE-2019-9816: ObjectGroup غير متوقع في عملية ObjectGroupDispatch
  • CVE-2019-9813: فشل الكود المترجم بواسطة IonMonkey في تحديث أنواع الخصائص المستنبطة، مما يؤدي إلى ارتباك الأنواع
  • CVE-2019-11707: تنبؤ IonMonkey بشكل غير صحيح بنوع الإرجاع لـ Array.prototype.pop، مما يؤدي إلى ارتباك الأنواع
  • CVE-2020-15656: ارتباك نوع للوسائط الخاصة في IonMonkey
  • CVE-2021-29982: تخصيص سجل غير صحيح (تم العثور عليه بواسطة JIT-Picker)
  • CVE-2021-29984: إعادة ترتيب التعليمات مع GC غير متوقع قد يؤدي إلى تلف الذاكرة
  • CVE-2022-28285: AliasSet لـ MLoadTypedArrayElementHole متساهل جدًا
  • CVE-2022-31745: خطأ في GC التدريجي
  • CVE-2022-42928: تعليقات KeepAlive مفقودة لبعض عمليات BigInt قد تؤدي إلى تلف الذاكرة
  • CVE-2022-45406: استخدام بعد التحرير لـ JavaScript Realm
  • CVE-2023-4577: تلف الذاكرة بسبب تفاعل GC والتعبيرات العادية
  • CVE-2023-5171: تسبب GC في حدوث استخدام بعد التحرير أثناء الترجمة

كروميوم/v8* Issue 939316: قد يقرأ Turbofan مؤشر Map خارج الحدود عند تحسين Reflect.construct

  • Issue 944062: يفشل JSCallReducer::ReduceArrayIndexOfIncludes في إدراج فحوصات Map
  • CVE-2019-5831: معالجة غير صحيحة للخريطة في V8
  • Issue 944865: تمثيل قيمة غير صالح في V8
  • CVE-2019-5841: خطأ في إرشادية التضمين (inlining heuristic)
  • CVE-2019-5847: العناصر المختومة/المجمدة في V8 تسبب تعطلًا
  • CVE-2019-5853: فساد الذاكرة في فحص طول التعبير النمطي
  • Issue 992914: ترحيل الخريطة لا يحترم أنواع العناصر، مما يؤدي إلى ارتباك النوع
  • CVE-2020-6512: ارتباك النوع في V8
  • CVE-2020-16006: فساد الذاكرة بسبب معالجة غير صحيحة لتصادم التجزئة في DescriptorArray
  • CVE-2021-37991: حالة سباق أثناء الترجمة الفورية المتزامنة (JIT)
  • Issue 1359937: إلغاء تسلسل BigInts قد يؤدي إلى قيمة -0n غير صالحة
  • Issue 1377775: فحص نوع غير صحيح عند تضمين Array.prototype.at في Turbofan

Duktape

  • Issue 2323: مؤشر valstack غير مستقر في putprop
  • Issue 2320: تجاوز مؤشر memcmp في دالة السلسلة المضمنة

JerryScript

  • CVE-2020-13991: إطلاق غير صحيح للوسائط الممتدة (spread arguments)
  • Issue 3784: فساد الذاكرة بسبب تعداد غير صحيح للخصائص
  • CVE-2020-13623: تجاوز سعة المكدس عبر مفاتيح الخصائص لكائنات Proxy
  • CVE-2020-13649 (1): فساد الذاكرة بسبب معالجة الأخطاء في حالة نفاد الذاكرة (OOM)
  • CVE-2020-13649 (2): فساد الذاكرة بسبب معالجة الأخطاء في حالة نفاد الذاكرة (OOM)
  • CVE-2020-13622: فساد الذاكرة بسبب معالجة غير صحيحة لمفاتيح الخصائص لكائنات Proxy
  • CVE-2020-14163: فساد الذاكرة بسبب حالة سباق ناتجة عن جمع القمامة عند إضافة أزواج المفتاح/القيمة
  • Issue 3813: معالجة أخطاء غير صحيحة في دالة SerializeJSONProperty
  • Issue 3814: كائن Proxy غير متوقع في تأكيد ecma_op_function_has_instance
  • Issue 3836: فساد الذاكرة بسبب تهيئة غير صحيحة لـ TypedArray
  • Issue 3837: فساد الذاكرة بسبب معالجة غير صحيحة للذاكرة في getOwnPropertyDescriptor

Hermes

  • CVE-2020-1912: فساد الذاكرة عند تنفيذ دوال المولد الداخلية التي تم تجميعها بتكاسل
  • CVE-2020-1914: فساد البايت كود عند معالجة تعليمة SaveGeneratorLong

Disclaimer

هذا ليس منتجًا مدعومًا رسميًا من Google.

تنزيل الأداة
  • CVE-2020-3901: ارتباك نوع GetterSetter في كود FTL JIT (بسبب LICM غير الآمن دائمًا)
  • CVE-2021-30851: قفل مفقود أثناء البحث المتزامن في HashTable
  • CVE-2021-30818: ارتباك نوع عند إعادة بناء الوسائط عند الخروج من DFG OSR
  • CVE-2022-46696: فشل تأكيد بسبب نقص فحص الاستثناء في الكود المترجم JIT
  • CVE-2022-46699: فشل تأكيد بسبب تخزين مؤقت غير صحيح للخصائص الخاصة في ICs
  • CVE-2022-46700: تسريب كائن JSValue فارغ إلى النص البرمجي عبر Intl.Locale.prototype.hourCycles
  • CVE-2025-43214: تلف الذاكرة أثناء JSToWasmEntry عند التكرار على المكدس
  • CVE-2025-43213: كتابة غير صالحة لعملية NewRegExpUntyped
  • CVE-2023-25735: استخدام بعد التحرير محتمل بسبب عدم تطابق المقصورة (compartment)
  • CVE-2023-25751: تلف الكود المترجم JIT
  • CVE-2023-29535: تلف الذاكرة أثناء GC للخرائط الضعيفة
  • CVE-2023-29543: تلف الذاكرة داخل Debugger
  • CVE-2023-29544: تلف الذاكرة أثناء الوسم المتوازي
  • CVE-2023-29549: تخصيص كائنات في مقصورة غير صحيحة
  • CVE-2024-0744: كان من الممكن أن يقوم الكود المترجم JIT بإلغاء الإشارة إلى قيمة مؤشر برية
  • CVE-2024-3854: قام JIT بتحسين عبارات التبديل بشكل غير صحيح وأنشأ كودًا بقراءات خارج الحدود
  • CVE-2024-3855: قام JIT بتحسين عمليات MSubstr بشكل غير صحيح، مما أدى إلى قراءات خارج الحدود
  • CVE-2024-3857: أنشأ JIT كودًا غير صحيح مما أدى إلى استخدام بعد التحرير أثناء جمع القمامة
  • CVE-2024-3858: تحوير كائن جافاسكريبت أثناء تتبع GC يتسبب في تعطل الكود المترجم JIT
  • CVE-2024-6613: إدراج غير صحيح لإطارات مكدس WASM
  • CVE-2024-6614: إدراج غير صحيح لإطارات مكدس WASM
  • CVE-2024-7521: معالجة استثناءات WebAssembly غير مكتملة
  • CVE-2024-7652: خطأ في مواصفات AsyncGeneratorPrototype
  • CVE-2024-8381: ارتباك نوع عند البحث عن اسم خاصية في كتلة "with"
  • CVE-2024-9396: تلف ذاكرة محتمل عند استنساخ كائنات معينة
  • CVE-2025-0240: عدم تطابق المقصورة عند تحليل وحدة JSON الخاصة بجافاسكريبت
  • CVE-2025-0241: تلف الذاكرة عند استخدام تجزئة النص لجافاسكريبت (JavaScript Text Segmentation)
  • CVE-2025-1012: استخدام بعد التحرير أثناء إلغاء التجميع المتزامن
  • CVE-2025-1934: GC غير متوقع أثناء معالجة انسحاب RegExp