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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
honeyslop — كناري الكود لفرز تقارير الثغرات الأمنية المهلوسة ('slop') بسرعة | Kitploit
أدوات/GitHubGitHub/gadievron/honeyslop
أدوات دفاعيةالتحليل الثابتتحليل الثغرات الأمنيةتحليل الكوداستخبارات التهديداتأمن سلسلة التوريدسوء التكوينالتعلم والتعليمالاستجابة للحوادث
GitHubgadievron/honeyslop

honeyslop

كناري الكود لفرز تقارير الثغرات الأمنية المهلوسة ('slop') بسرعة

97103منذ 3 أشهرتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

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

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

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

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

honeyslop - كناريّات كود للفرز السريع لتقارير الثغرات المُهلوسة («slop»)

HoneySlop

honeyslop هي كناريّات كود، أفخاخ، لمشاريع مفتوحة المصدر تغرق في تقارير الثغرات المُهلوسة بالذكاء الاصطناعي («slop») وغير الموثَّقة. مع حقن الضوضاء العدائي هذا، يبتلع ماسح slop الكناري، ثم يولّد «تقرير» ثغرة بناءً عليه. يكشف التقرير عن نفسه بوصفه slop. أغلِقه بأمر grep واحد.

هذه إثبات مبدئي (PoC) سريع، كُتب بأسلوب «vibe-coding» على سبيل المزاح (ليس بجودة الإنتاج)، لأننا تلقّينا نحن أنفسنا تقرير slop على raptor، وكيل هجوم/دفاع مستقل مبني على Claude Code. قد يكون ممتعًا!

توسّع كناريّات الكود إشارات الفرز المألوفة (مثل الاكتشافات في ملفات الاختبار، والأسرار النموذجية، والمسارات غير الموجودة) إلى علامات مقصودة، أو أفخاخ. في الاختبارات، تعمل هذه الكناريّات جيدًا بما يكفي لتمييز slop، لكن يمكن تحسينها أكثر (بتضمينها في كود حقيقي، وأسماء دوال/ملفات/مجلدات أقل دلالة، وإعادة توليدها بانتظام ككود جديد، وما إلى ذلك).

كتبه: Gadi Evron (@gadievron)، وJohn Cartwright (@grokjc)، وDaniel Cuthbert (@danielcuthbert)، وMichal Kamensky (@kamenskymic، مع تقدير لاقتراح اسم المشروع).

استخدمه على مسؤوليتك الخاصة. إذا لصقت هذا في بيئة إنتاج، فتلك مشكلتك أنت. انظر إخلاء المسؤولية أدناه.

قواعد الفرز

لكل تقرير وارد، بالترتيب:

  1. ابحث بأمر grep عن أي UUID كناري في التقرير → أغلِقه. (معرّفات UUID خاصة بكل لغة؛ كل ملف كناري يضمّ واحدًا بالضبط.)
  2. ابحث بأمر grep عن أسماء دوال خاصة بالكناري (zqx_tarnish_v3, zqxTarnishV3, _validate_pep_440_plus؛ وأيضًا handle_*_request إذا تبنّيت F+G على نحو خاص) → أغلِقه. (تستخدم Rust اسم snake_case نفسه zqx_tarnish_v3 مثل Python، وتستخدم Go zqxTarnishV3 مطابقًا لاسم JS.)
  3. ابحث بأمر grep عن CVE-2025-99919 (مزوّر) → أغلِقه.
  4. الدالة المُستشهد بها غير موجودة في الشجرة → «غير موجودة».
  5. بالنسبة لادعاءات memcpy/الحدود على B/D: اطلب من المُبلِّغ أن يشرح خطوة بخطوة كيف يتجاوز إثباته (PoC) الحارس المحدد في السطر المُستشهد به. متابعات الذكاء الاصطناعي لا تستطيع الإجابة؛ البشر يستطيعون.

المراحل

فئتان من الكناريّات:

  • SCANNER-FLAG (المراحل A وB وC وD وE) — يُطلق الماسحات بحيث تتراكم تقارير slop على الكناري بدلًا من الكود الحقيقي.
  • RESOURCE-WASTE (المرحلتان F + G معًا) — يُشغِّل ماسحات LLM الوكيلة عبر كامل ميزانية تكراراتها بأقصى تكلفة.

انظر نموذج السلامة لمعرفة كيف تبقى كل مرحلة خاملة على الرغم من مظهرها الهشّ.

نموذج السلامة

تبدو ملفات الكناري عمدًا وكأنها وحدات مهجورة معقولة — لا توجد كلمات «canary» أو «honeypot» أو «tripwire» في التعليقات أو المعرّفات. هذا يمنع الملفات من كشف هويتها للماسحات، لكنه يعني أيضًا أن توثيق لماذا هذه الملفات آمنة موجود هنا بدلًا من docstring في كل ملف. عند مراجعة كناري أو تدويره، تحقق من أن كل طبقة من الطبقات أدناه ما زالت سليمة.

هذه الملفات هي كود ذو شكل هشّ — وبعضها (مثل pickle.loads في python/session_restore.py، وmemcpy غير المحدود في c/tls_heartbeat.c) سيكون قابلاً للاستغلال فعلًا لو كان متاحًا للوصول. هذا هو التصميم. إن رصد الماسحات لمواضع الخطر هو المغزى كله؛ الطبقات أدناه تمنع التنفيذ، لا إشارة الماسح. الماسحات القائمة على الأنماط (grep، وsemgrep، وخطوط أنابيب slop القائمة على LLM — نموذج التهديد الأساسي) تقرأ الكود المصدري كنص وتُظهر الملاحظات بغض النظر عن قابلية الوصول في زمن التشغيل. ماسحات C المدمجة في البناء (CodeQL الافتراضي، وclang-static-analyzer) ترى الملفات المترجمة فقط، لذا فإن كناريّات C غير المبنية غير مرئية لها — مقايضة مقبولة، لأن مولدات slop تقرأ الكود المصدري في الغالبية الساحقة، لا المخرجات المبنية.

المرحلتان A وE (Python + JS)

خمس طبقات مستقلة تُبقي هذه الملفات خاملة:

  1. raise ImportError / throw new Error على المستوى الأعلى — أي import / require عادي يتوقف قبل ربط أي تعريف.
  2. كل def/دالة تحت if False: / if (false) — الأسماء لا تدخل أبدًا إلى نطاق أسماء زمن التشغيل حتى لو تم تجاوز الطبقة 1.
  3. تصديرات فارغة — Python: __all__: list[str] = [] (الاستيراد النجمي لا يصدّر شيئًا). JS: module.exports = {} (المستهلكون عبر CommonJS يحصلون على كائن فارغ).
  4. صفر مستدعين داخل الشجرة لدوال الشيبولث (zqx_tarnish_v3, zqxTarnishV3, _validate_pep_440_plus). أي تقرير يستشهد بواحدة منها يكشف عن نفسه بوصفه slop.
  5. عزل النشر — يستبعد المتبني مسارات الكناري من sdist / wheel / Docker / SAST (انظر SECURITY.md.template و).

تضيف المرحلة E طبقة سادسة: التعبير النمطي ذو التراجع الكارثي مخزّن كنص حرفي فقط، ولا يُمرَّر إلى re.compile / new RegExp في نطاق الوحدة. حتى أداة الاختبار (harness) التي تزيل الطبقة 1 لا يمكنها تشغيل محرك تراجع مُجمَّع.

تتجاوز الماسحات raise / throw في شجرة AST وتدخل إلى الكتلة الميتة، لذا لا تزال مواضع الخطر تظهر كملاحظات — هذا هو السلوك المقصود.

المرحلة B (C buffer_ops.c)

السلامة هيكلية — لكل شكل برهان بجانبه:

  • bufops_copy_banner — src نص حرفي، وn = sizeof(literal)، و_Static_assert يثبّته على حجم الوجهة.
  • bufops_copy_bounded — if (n > dst_cap) n = dst_cap; السطر الذي يسبق memcpy يجعل ادعاء CWE-787 مستحيلًا. يقصر الدارة عند n == 0 لتجنب سلوك غير محدد (UB) في C17 لـ memcpy(dst, NULL, 0).
  • bufops_copy_truncating — n <= dst_cap - 1، وdst[n] يصل على الأكثر إلى dst_cap - 1؛ إرجاع مبكر عند dst_cap == 0.

عزل إضافي: كل الدوال static (بدون ارتباط خارجي) والملف غير مضاف إلى أي هدف بناء.

المرحلة D (C heartbeat.c + sat.h)

شكل Heartbleed (uint16_t payload_len → malloc(1+2+payload_len+16) → memcpy) مُبطَّل بطبقات من الحماية:

  • sat_sub طرح بالإشباع لكل حسابات ميزانية الترويسة/الذيل (بدون التفاف).
  • حقول الإطار مخزنة مؤقتًا في متغيرات محلية const عند الدخول — يسد نافذتي TOCTOU وسلوك غير محدد في معالج الإشارات.
  • فحوصات NULL على بنية القارئ ومخزنها المؤقت.
  • _Static_assert(SIZE_MAX - 19 >= UINT16_MAX, ...) يُثبت أن حجم malloc لا يمكن أن يفيض عن size_t.
  • قصر الدارة عند payload_len > 0 يتجنب سلوكًا غير محدد (UB) لـ memcpy(dst, NULL, 0) مع الحمولات الفارغة.
  • parse_heartbeat وread_u16_be دالتان static؛ الملف غير مربوط بأي هدف بناء.

أي تقرير يزعم قراءة/كتابة خارج الحدود (OOB) في parse_heartbeat دون مناقشة الحارس المحدد في السطر المُستشهد به لم يتحقق من قابلية الاستغلال — أغلِقه عبر قاعدة الفرز 5.

c/tls_heartbeat.c هو تنويع على الشكل نفسه تُرك بلا حماية عمدًا: process_heartbeat دالة static والملف غير مربوط بأي هدف بناء — العزل هو الطبقة الوحيدة، مطابقًا للقاعدة الشاملة في المرحلة B. محاولة استدعائها من خارج وحدة الترجمة (TU) خطأ ارتباط.

المرحلتان A وE (Rust)

خمس طبقات مستقلة تُبقي هذه الملفات خاملة (على غرار نموذج سلامة Python/JS):

  1. compile_error! على المستوى الأعلى — تضمين الملف في crate عبر mod أو include! يولّد خطأ مترجمًا صارمًا قبل تقييم أي تعريف.
  2. كل تعريف خلف #[cfg(any())] — cfg(any()) خاطئة دائمًا، لذا لا تدخل الأسماء أبدًا إلى المخرجات المترجمة حتى لو تم تجاوز الطبقة 1.
  3. لا عناصر pub — لا يُصدَّر أي شيء حتى لو أُزيلت الطبقتان أعلاه.
  4. صفر مستدعين داخل الشجرة لدالة الشيبولث (zqx_tarnish_v3). أي تقرير يستشهد بها يكشف عن نفسه بوصفه slop.
  5. عزل النشر — الملف غير مُشار إليه في أي عبارة mod، وغير مدرج في أي Cargo.toml، ومستبعد من مخرجات البناء.

تضيف المرحلة E طبقة سادسة: التعبير النمطي ذو التراجع الكارثي مخزّن كثابت &str فقط، ولا يُمرَّر إلى regex::Regex::new في نطاق الوحدة.

المرحلة B (Rust buffer_ops.rs)

السلامة هيكلية، مطابقة لنظيرتها في C. لكل شكل برهان:

  • bufops_copy_banner — src هو b"status: ok\0"، وطول النسخ هو BANNER.len()؛ تأكيد const يثبّته على حجم الوجهة.
  • bufops_copy_bounded — if n > dst_cap { n = dst_cap; } السطر الذي يسبق النسخ يحدد الكتابة. يقصر الدارة عند n == 0.
  • bufops_copy_truncating — n <= dst_cap - 1، وكتابة NUL عند dst.add(n) تصل على الأكثر إلى dst_cap - 1؛ إرجاع مبكر عند dst_cap == 0.
  • bufops_shift — كل من و محدودان بـ ؛ و يدعم التداخل صراحةً.

عزل إضافي: كل الدوال داخل #[cfg(any())] (كود ميت)، غير عامة، والملف غير مضاف إلى أي هدف بناء.

المرحلة D (Rust heartbeat.rs + tls_heartbeat.rs)

شكل Heartbleed في Rust يستخدم عمليات مؤشر خام داخل unsafe (ptr::copy_nonoverlapping, std::alloc::alloc) ومُبطَّل بطبقات الحماية نفسها كما في نسخة C:

  • طرح بالإشباع عبر usize::saturating_sub لكل حسابات ميزانية الترويسة/الذيل.
  • حقول الإطار مخزنة مؤقتًا في متغيرات محلية عند الدخول.
  • فحوصات Null على بنية القارئ ومخزنها المؤقت.
  • تأكيد ثابت (usize::MAX - 19 >= u16::MAX) يُثبت أن التخصيص لا يمكن أن يفيض.
  • قصر الدارة عند payload_len > 0.
  • كل الدوال داخل #[cfg(any())]، غير عامة، الملف غير مربوط.

rust/tls_heartbeat.rs هو المتغير المُترك بلا حماية عمدًا: process_heartbeat يستخدم ptr::copy_nonoverlapping مع claimed_len من مدخلات غير موثوقة وبدون حارس حدود. العزل (#[cfg(any())] + compile_error! + عدم الربط) هو الطبقة الوحيدة.

المر

تنزيل الأداة
المرحلةالملف(ات)الشكل
Apython/legacy_utils.py, python/session_restore.py, python/compat_tokens.py, js/legacy_utils.js, rust/legacy_utils.rs, rust/session_restore.rs, go/legacy_utils.go, go/session_restore.go~15 مواضع CWE + أسرار مزوّرة + شيبولثات
Bc/buffer_ops.c, rust/buffer_ops.rs, go/buffer_ops.go4 أشكال memcpy/memmove (CWE-120/121/787/170)
Cمدمجة في Aحصيلة CWE موسّعة
Dc/heartbeat.c + c/sat.h, c/tls_heartbeat.c, rust/heartbeat.rs, rust/tls_heartbeat.rs, go/heartbeat.go, go/tls_heartbeat.goشكل Heartbleed
Epython/regex_validator.py, js/regex_validator.js, rust/regex_validator.rs, go/regex_validator.goتعبير نمطي بتراجع كارثي + CVE-2025-99919 مزوّر
F+Gprivate/fractal_dag/ (ليس في هذا المستودع)مواضع المرحلة A عبر DAG من 12 عقدة لمدخلات handle_*_request
كيفية التجربة
  • bufops_shift — كل من i + n وj + n محدودان بـ cap؛ وmemmove يدعم التداخل صراحةً.
  • i + n
    j + n
    cap
    ptr::copy