Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
codeql-buffer-overflow-variant — متغير اصطناعي من تجاوز سعة المخزن المؤقت للمكدس (CWE-120) من CVE-2020-8597 (pppd EAP) كهدف للتحليل الثابت باستخدام CodeQL. | Kitploit
أدوات/GitHubGitHub/anna-kravets/codeql-buffer-overflow-variant
التحليل الثابتتحليل الشفرة الثابت (SAST)تحليل الثغرات الأمنيةتحليل الكود
GitHubanna-kravets/codeql-buffer-overflow-variant

codeql-buffer-overflow-variant

متغير اصطناعي من تجاوز سعة المخزن المؤقت للمكدس (CWE-120) من CVE-2020-8597 (pppd EAP) كهدف للتحليل الثابت باستخدام CodeQL.

عرض المستودع

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
17منذ شهر واحدلم تتم المراجعة بعد
مشاركة

codeql-buffer-overflow-variant

برنامج C مُعرَّض للثغرات عن قصد، بحجم ~170 سطرًا، يُستخدم كـ هدف للتحليل الساكن CodeQL. إنه يعيد إنتاج فئة الخطأ الخاصة بـ CVE-2020-8597 — تجاوز سعة المخزن المؤقت على المكدس في rhostname الخاص بـ EAP في pppd (CWE-120) — في برنامج لا يشترك في أي من أسماء دوال pppd، أو عمق الاستدعاء، أو بنية الإرسال.

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

هذا البرنامج غير آمن عن قصد وموجود فقط لأغراض التحليل. لا تقم بنشره. الثغرة التي يحاكيها علنية (CVE-2020-8597، أُفصح عنها في 2020).

فئة الخطأ

يُنسخ طول مشتق من المهاجم إلى مخزن مؤقت ثابت الحجم، دون حارس يربط ذلك الطول بحجم المخزن المؤقت.

في كل حالة يوجد فحص للحدود — لكنه يفشل فقط في ربط الكميتين المهمتين. هناك طريقتان بالضبط للخطأ في ذلك، والبرنامج يحتوي على واحدة من كل نوع:

  • قيمة صحيحة، حد خاطئ. يُفحص طول النسخ، لكن مقابل الإطار المستلم بدلًا من sizeof(dest). يمنع القراءة الزائدة، ولا يفعل شيئًا بشأن الكتابة الزائدة. (handle_hello)
  • حد صحيح، قيمة خاطئة. يذكر الفحص sizeof(dest) — يبدو تمامًا كحد للمخزن المؤقت — لكنه يقيّد متغيرًا مختلفًا عن الذي يُستخدم كطول النسخ. (handle_stat)

الثاني هو الأصعب، وهو ما يمثله فحص pppd الميت vallen >= len + sizeof(rhostname): مقارنة تذكر حجم الوجهة بينما تقيّد شيئًا ليس طول النسخ. الاستعلام الذي يسأل فقط "هل تذكر بعض المقارنات هنا sizeof(dest)؟" يُسكَت به.

البنية مقابل pppd (لماذا هو متغير حقيقي)

pppd / CVE-2020-8597هذا المشروع
المصدرread() على واصف PPPrecvfrom() على مقبس UDP
الإرسالstruct protent *protocols[] عام، مطابقة خطية على رقم البروتوكولconst struct frame_op ops[] محلي للملف، مطابقة خطية على وسم من بايت واحد
العمق إلى الحوضget_input → (*input) → eap_input → eap_requestdispatch_frame → (*handle) → handle_hello
الوجهةchar rhostname[256]char name[64]
الحارس الخاطئvallen مقيّد بـ len الخاص بالحزمةvlen مقيّد بـ plen الخاص بالإطار

كلاهما يحتفظ بالخاصية الوحيدة التي تجعل هذا تدفق بيانات، وليس grep: استدعاء غير مباشر عبر جدول مؤشرات دوال بين المصدر والحوض.

المعالجالسطرالفحص الموجودالحكم
handle_hello()الحوض عند :80vlen > plen - 2 — قيمة صحيحة، حد خاطئيجب أن ينطلق
handle_echo()النسخ عند :106vlen >= sizeof(buf) — كلاهما صحيحيجب أن يبقى صامتًا — ضابط سلبي
handle_stat()الحوض عند :145hlen >= sizeof(report) — حد صحيح، قيمة خاطئةيجب أن ينطلق

handle_stat هو الحالة المميّزة. فحصه يذكر sizeof(report)، لذا فإن استعلامًا يقبل أي مقارنة تذكر حجم الوجهة يعامله كمحمي ويفوّت الثغرة. لالتقاطه يلزم مقارنة القيمة التي تُفحص بـ القيمة المستخدمة كطول النسخ — ترقيم القيم العام. احذف ذلك من الاستعلام وسيصبح هذا المعالج نتيجة سلبية خاطئة بينما يحتفظ كل موقع آخر بحكمه.

تنسيق الإرسال

حزمة UDP واحدة = إطار واحد:

[ type : 1 ] [ length : 2, big-endian ] [ value : length bytes ]

type 0x01 → hello، 0x02 → echo، 0x03 → stat. إطار hello بطول معلن بين 65 و~2045 يتجاوز سعة name[64]. إطار stat يحمل بدلًا من ذلك طولين من بايت واحد — طول رأس وطول جسم — وأي طول جسم فوق 32 يتجاوز سعة report[32]، مهما قال طول الرأس.

البناء

make            # gcc -Wall -Wextra -O0 -g -o tlv_server tlv_server.c

Linux/POSIX (مقابس BSD). يُبنى نظيفًا دون تحذيرات.

بناء قاعدة بيانات CodeQL

يتتبع CodeQL عملية ترجمة حقيقية، لذا ابنِ من حالة نظيفة:

make clean
codeql database create db --language=cpp --command="make"
# or, without the clean step:
codeql database create db --language=cpp --command="make -B"

ثم شغّل استعلام الجزء 3 مقابل db؛ يجب أن يبلّغ عن memcpy في handle_hello وتلك الموجودة في handle_stat، ويبقى صامتًا بشأن handle_echo. الاستعلام وتعليمات تشغيله موجودة في codeql/.

يتغير المصدر كلما أُضيف معالج، لذا أعد بناء قاعدة البيانات — يلتقط CodeQL لقطة من الكود عند وقت database create ولن يرى db/ الموجود كودًا جديدًا.

تنزيل الأداة