
# أداة بحث عن ثغرات نواة لينكس مبنية على الأدلة أداة بحث عن ثغرات نواة لينكس تعتمد على الأدلة، استُخدمت في التحقيق في الثغرة الأمنية CVE-2026-31720
أداة بحث · الاستيراد الأصلي: 3 أبريل 2026 · مراجعة التوثيق: 11 يوليو 2026
الفلسفة الأساسية — الإشارة الخارجية
دع الملاحظات القابلة لإعادة الإنتاج خارج استدلال النموذج توجّه الانتباه؛ ولا تخلط أبدًا بين الأولوية والإثبات.
حالة المشروع. هذا المستودع هو إصدار مبكر من بيئة البحث المدعومة بـ LLM التي تم بناؤها واستخدامها للتحقيق الفعلي في ثغرات نواة Linux. تم استخدام هذا الإصدار لاكتشاف الثغرة المُعلنة باسم CVE-2026-31720. تقوم البيئة بترتيب أولويات أهداف التحقيق ولكنها لا تثبت الثغرات تلقائيًا ولا تضمن أمان النواة؛ فالتحقق النهائي والإبلاغ يتمان بواسطة البشر.
الملخص— عند ترك LLM يستكشف قاعدة بيانات ضخمة مثل نواة Linux مباشرة، يتشتت السياق بسرعة، ويحدث خلط سهل بين وجود واجهات برمجية خطرة وإمكانية الاستغلال الفعلي. يعرّف Kernel Codex Harness هذه المشكلة ليس كمسألة اكتشاف تلقائي للثغرات، بل كمسألة تحديد أولويات التحقيق والتنسيق القائم على الحالة. يطلق هذا المشروع على المبدأ الذي يتحكم في انتباه النموذج من خلال ملاحظات قابلة لإعادة الإنتاج تُحسب خارج استدلال LLM اسم الإشارة الخارجية. يتم دمج مسارات النواة، وحدود مساحة المستخدم، والإشارات الثابتة المتعلقة بالعمر الافتراضي (lifetime) ونسخ المستخدم (usercopy) وعدادات المرجعية (refcount) والحجم، مع ذكاء اختيار اختياري من syzbot، لترتيب الملفات المرشحة، ثم تحويل كل مرشح إلى حزمة مطالبات (prompt) ضيقة. تستخدم المراجعة اليدوية والطيار الآلي القائم على ميزانية الوقت نفس عقد الاستجابة وحالة الجلسة. تم استخدام هذه البيئة في تحقيق فعلي في نواة Linux لاكتشاف كتابة خارج الحدود على المكدس (stack out-of-bounds write) في مسار صوت USB gadget، وقد أُعلن عن هذا الخلل باسم CVE-2026-31720. هذا التنفيذ ليس محللًا ثابتًا دقيقًا، بل هو سير عمل بحثي يحد من نطاق تحقيق LLM باستخدام استدلالات قابلة للتفسير، وتتطلب جميع النتائج إعادة تحقق بشرية من قابلية الوصول (reachability) وكسر الثوابت (invariant break) والأثر الملموس (concrete impact).
مصطلحات الفهرس— نواة Linux، أبحاث الثغرات، الإشارة الخارجية، تنسيق LLM، تحديد الأولويات الاستدلالي، syzbot، تحليل البرامج، Codex.
هناك نوعان من مشاكل الحجم في مراجعة أمان نواة Linux. أولاً، شجرة المصدر الكاملة كبيرة جدًا بحيث لا يمكن تغطيتها في سياق LLM واحد. ثانيًا، الإشارات مثل copy_from_user، وموزعات الذاكرة (allocators)، وعدادات المرجعية (refcount)، والأقفال (locks) شائعة ولكنها لا تعني بحد ذاتها وجود ثغرة. يجب على المحلل أولاً تحديد "أين ينظر"، ثم إثبات قابلية الوصول من مساحة المستخدم والانتقالات المحددة للحالة بشكل منفصل.
الفلسفة الأساسية لهذا المشروع هي الإشارة الخارجية.
لا نترك LLM يقرر بنفسه أين ينظر. الإشارات القابلة لإعادة الإنتاج خارج استدلال النموذج هي التي توزع الانتباه، لكن استنتاجات الثغرات تُحدد فقط من خلال أدلة قابلية الوصول والثوابت.
لذلك، لا تجعل البيئة النموذج يستكشف النواة بأكملها بشكل غامض. فهي ترتب الملفات حسب الأولوية، وتقدم فرع تحقيق واحد فقط في كل مرة، وتطلب بنية الأدلة قبل الاستنتاجات.
الإشارة الخارجية ليست حكمًا يولده LLM، بل هي ملاحظة تُحدد قبل تشغيل النموذج ويمكن إعادة حسابها من نفس شجرة المصدر والملف الشخصي (profile) وملفات syzbot JSON المخزنة. أوزان المسارات، ونتائج التعبيرات النمطية، والتداخل المخزن مع syzbot هي أمثلة على ذلك. تُستخدم هذه الإشارات فقط لترتيب المرشحين وسياق المطالبات، ولا يتم ترقيتها إلى حكم أو إثبات.
تشير الإشارة الخارجية في هذا المستند إلى فلسفة المشروع بأكملها. نموذج البيانات ExternalSignal في الكود يمثل حاليًا فقط الإشارات المشتقة من syzbot، لذا فإن نطاق المصطلحين مختلف.
نتائج التعبيرات النمطية، والمسارات عالية الخطورة، والتداخل مع syzbot كلها إشارات لترتيب التحقيق. حتى لو كانت النتيجة عالية، إذا كانت مسارات الاستدعاء الفعلية، والصلاحيات، وإعدادات النواة، ومساحات الأسماء (namespaces)، وتوافر الأجهزة لا تسمح بوصول المهاجم، فهي ليست نتيجة أمنية.
يفحص التدقيق أولاً الحدود التي تبدأ من مساحة المستخدم مثل syscall، وioctl، وnetlink، وprocfs، وأنظمة الملفات، وBPF، وخطافات برامج التشغيل (driver hooks). فقط بعد ذلك يتم تقييم فئات الثغرات مثل UAF، وOOB، وrefcount، والسباق (race)، وتسريب المعلومات (info leak)، وفحوصات الصلاحيات (capability checks).
تقتصر وحدة التحقيق الواحدة افتراضيًا على ملف واحد ومسارات الاستدعاء والتفكيك والتحرير القريبة منه. يُسمح بمتابعة يدوية واحدة أو اثنتين كحد أقصى يوصي بها النموذج. هذا القيد ليس لتقليل القدرة الاستكشافية، بل للحفاظ على الاستنتاجات ضمن نطاق قابل للتحقق.
تتطلب المطالبات أن يشرح أي finding قوي العناصر التالية على الأقل:
إذا كانت الأدلة غير كافية، يعيد النموذج هدفًا واحدًا واحدًا للتحقق التالي بدلاً من الادعاء بقوة بوجود ثغرة. هذا هو عقد الأدلة على مستوى المطالبة (prompt-level evidence contract)، والمحلل الحالي لا يتحقق تلقائيًا من اكتمال كل دليل. بما أن عملية الاستيعاب (ingestion) توحد الحكم والهدف التالي، فإن التحقق النهائي من الأدلة يقع على عاتق البشر.
انطلق تدفق التحقيق الأولي من فكرة التحليل لكل ملف، وتوسيع السياق المحدود، والمخرجات المنظمة التي استخدمها vulnhuntr من Protect AI [1]. في هذا المشروع، لم يتم تطبيق ذلك مباشرة على تحليل تطبيقات Python، بل تمت إعادة تصميمه حول سطح النواة الذي يمكن الوصول إليه من مساحة المستخدم، والعمر الافتراضي لكائنات النواة، ومسارات التفكيك، والتداخل مع syzbot. على وجه الخصوص، فصل إشارات الأولوية عن إثبات الثغرات، والتحقق من قابلية الوصول قبل فئة الثغرة هما خيارا التصميم الأساسيان لبيئة النواة هذه.
الشكل 1. تحوّل طبقة الإشارة الخارجية الملاحظات المحسوبة قبل استدلال النموذج إلى وحدات مراجعة مرتبة. إنها توزع الانتباه ولكنها لا تثبت وجود ثغرة.
الجدول الأول — مسؤوليات الوحدات الرئيسية
| الوحدة | المسؤولية |
|---|---|
targeting.py | استكشاف ملفات النواة وتسجيل درجات المسارات والأنماط وإشارات syzbot |
models.py | نماذج البيانات Candidate وSignal وExternalSignal المشتقة من syzbot |
bundle.py | إنشاء البيان (manifest) وفهرس الجلسة وحزم المطالبات/المقتطفات |
prompting.py | مطالبات تدقيق النواة المرتكزة على قابلية الوصول والثوابت |
session.py | تخزين حالة المراجعات المعلقة والسجل وعمق المتابعة |
ingest.py | توحيد الحكم الصارم والهدف التالي |
autopilot.py | إدارة codex exec القائم على ميزانية الوقت والسجلات والأرشيف والنتائج |
syzbot.py | جمع صفحات syzbot العامة وإنشاء ذاكرة تخزين مؤقتة محلية بصيغة JSON |
cli.py | ربط الأوامر مثل scan وinspect وcodex وloop وautopilot |
يجتاز الماسح ملفات .c و.h ضمن دليل التضمين (include directory) في الملف الشخصي. تتكون درجة أولوية الملف f من الناحية المفاهيمية مما يلي:
Score(f) = Σ path_weight(f)
+ Σ line_signal_weight(f)
+ Σ syzbot_overlap_weight(f)