
# أداة بحث عن ثغرات نواة لينكس مبنية على الأدلة أداة بحث عن ثغرات نواة لينكس تعتمد على الأدلة، استُخدمت في التحقيق في الثغرة الأمنية 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، وقد أُعلن عن هذا الخلل باسم . هذا التنفيذ ليس محللًا ثابتًا دقيقًا، بل هو سير عمل بحثي يحد من نطاق تحقيق 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)
هذه الدرجة ليست مقياسًا للاحتمال أو قابلية الاستغلال. كل عنصر يوفر فقط ترتيبًا نسبيًا لمساعدة النموذج في تحديد الملف الذي يجب فحصه أولاً. يجمع التنفيذ الحالي جميع التطابقات على مستوى السطر ويحد فقط من الإشارات الأعلى التي سيتم عرضها في المطالبة. تفترض إعادة حساب نفس النتيجة نفس شجرة المصدر والملف الشخصي وملفات syzbot JSON المخزنة. يتم تطبيق وزن syzbot بعديًا على الملفات التي أصبحت مرشحة أولاً من خلال الاستدلالات القائمة على المسار والسطر، ولا يؤدي وجود hit في syzbot وحده إلى إنشاء ملفات مرشحة جديدة.
الإشارات الثابتة الرئيسية هي:
ioctl، ومعالجات التوافق (compat handlers)، وخطافات عمليات الملفاتcopy_from_user، وcopy_to_user، و__userkmalloc، وkzalloc، وkvmalloc، وتخصيصات الذاكرة المؤقتة (cache allocations) ومسارات التحريرالملفات الشخصية المدمجة هي default وnet وfs وio_uring وbpf وdrivers. يحدد الملف الشخصي مسارات التضمين والأنماط والأوزان وعدد الإشارات التي يجب الاحتفاظ بها في ملف واحد. بدلاً من تطبيق سياسة تسجيل واحدة على النواة بأكملها، تعكس هذه الملفات سطح الهجوم وخصائص العمر الافتراضي لكل نظام فرعي.
يستخرج syzbot-fetch معلومات العنوان والنظام الفرعي ونوع الخلل وملف:سطر من صفحات أخطاء syzbot العامة لمشروع syzkaller [2] ويخزنها في ذاكرة تخزين مؤقتة بصيغة JSON. يُستخدم التداخل الدقيق في الملفات كإشارة خارجية قوية، بينما يُستخدم تداخل النظام الفرعي كإشارة خارجية ضعيفة. نظرًا لأن لوحة المعلومات المباشرة قد تتغير، فإن وحدة إعادة الإنتاج هي ملفات JSON المخزنة وقت الجلب. معلومات الأعطال هي مجرد نقطة انطلاق لاصطياد المتغيرات (variant hunting) ولا تُعامل كدليل على ثغرات جديدة.
ينشئ scan بيانًا بالمرشحين مرتبًا وحزمة مطالبات عليا. تتضمن كل مطالبة مسار الهدف، وسبب الدرجة، وإشارات السطر، وسياق syzbot، وإجراءات التدقيق.
يتم توحيد استجابة النموذج إلى أحد الأحكام التالية:
cve_candidateplausible_security_buglatent_bugnot_cve_candidateneeds_more_contextتتضمن الاستجابة هدفًا تاليًا واحدًا أفضل وملخصًا قصيرًا. يتم أرشفة الاستجابات القديمة التي لا تحتوي على أهداف معلقة بشكل منفصل دون ربطها بأهداف جديدة.
git clone https://github.com/foxirain/linux-kernel-codex-harness.git
cd linux-kernel-codex-harness
python3 -m venv .venv
source .venv/bin/activate
python -m pip install .
يتم تضمين ملفات JSON الشخصية المدمجة في حزمة wheel. يمكن تمرير قواعد JSON الخارجية عبر --config /path/to/profile.json.
# 1. إنشاء جلسة مرتبة.
kernel-harness scan /path/to/linux \
--profile net \
--limit 80 \
--top 20 \
--out artifacts
# 2. فحص المرشحين ذوي الأولوية العالية.
kernel-harness inspect artifacts/session-YYYYMMDDTHHMMSSZ --top 10
# 3. عرض مطالبة مركزة واحدة.
kernel-harness codex artifacts/session-YYYYMMDDTHHMMSSZ \
--rank 1 \
--include-snippet
--limit هو عدد المرشحين الذين سيتم الاحتفاظ بهم في البيان، و--top هو عدد حزم المطالبات التي سيتم إنشاؤها مسبقًا في البداية. يمكن أيضًا إنشاء حزم للمراتب اللاحقة عند الطلب.
kernel-harness autopilot artifacts/session-YYYYMMDDTHHMMSSZ \
--duration 30m \
--per-run-timeout 10m \
--include-snippet
الصندوق الرمل (sandbox) الافتراضي هو read-only. يجب تحديد --sandbox workspace-write فقط إذا كان تعديل الملفات ضروريًا تمامًا أثناء التحليل.
kernel-harness syzbot-fetch https://syzkaller.appspot.com/upstream \
--out artifacts/syzbot/upstream.json \
--limit 50
kernel-harness scan /path/to/linux \
--profile fs \
--syzbot-json artifacts/syzbot/upstream.json \
--out artifacts
artifacts/session-<timestamp>/
├── SESSION.md
├── targets.json
├── finding_template.json
├── review_state.json
├── codex_response.txt # موجود أثناء انتظار استجابة
├── bundles/
│ ├── <rank>-<target>.md
│ └── <rank>-<target>.snippet.txt
├── responses/
└── autopilot/
├── AUTOPILOT_STATUS.txt
├── AUTOPILOT_PROGRESS.txt
├── AUTOPILOT_FINDINGS.txt
├── prompts/
├── exec/
└── findings/
لم يقتصر هذا الإصدار على إثبات المفهوم، بل تم استخدامه في تحقيق فعلي في ثغرات نواة Linux.
الجدول الثاني — نتيجة الثغرة المُعلنة
| النتيجة العامة | المنطقة المتأثرة | الخطورة / CVSS | الثغرة | نموذج التحقيق |
|---|---|---|---|---|
| CVE-2026-31720 | صوت USB gadget · drivers/usb/gadget/function/f_uac1_legacy.c | يمكن أن يتجاوز طول الطلب الذي يتحكم فيه المضيف كائنًا على المكدس بحجم أربعة بايتات | ظهرت النتيجة أثناء تحقيق بمساعدة v1؛ وبقي التحقق والإفصاح بقيادة بشرية |
CVE-2026-31720: NVD CVSS 3.1 · 7.8 High · CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hيركز التحقق على الانحدارات في التنفيذ وقابلية النشر، وليس على معيار دقة الكشف.
الجدول الثالث — نطاق التحقق الهندسي
| عنصر التحقق | الخاصية المتوقعة |
|---|---|
| انحدار الموزعات | اكتشاف kmalloc وkvmalloc كإشارات موزعات |
| موارد الملفات الشخصية | تحميل 6 ملفات شخصية مدمجة من نسخة المصدر، واختبار دخاني لملف default من حزمة wheel المثبتة |
| عقد الحكم | عدم الخلط بين not_cve_candidate وfinding إيجابي |
| سياسة المتابعة | السماح بمتابعتين يدويتين، ومنع الطلب الثالث |
| معالجة الاستجابات القديمة | أرشفة الاستجابات بدون أهداف معلقة وعدم إعادة استخدامها |
| الافتراضي الآمن | القيمة الافتراضية لصندوق الطيار الآلي الرملي هي read-only |
| مصفوفة CI | تشغيل مجموعة اختبارات الانحدار على Python 3.11 و3.12 |
python -m unittest discover -s tests -v
يشغل GitHub Actions اختبارات الانحدار للوحدات، ثم يثبت حزمة wheel في بيئة جديدة ويجري اختبارًا دخانيًا لفحص الملف الشخصي default. الحالة العامة أعلاه هي نتيجة تشغيلية من تحقيق فعلي، ولكنها ليست معيارًا للدقة أو الاستدعاء أو معدل اكتشاف CVEs مُقاسًا على مجموعة أشجار Linux ممثلة.
read-only.--dangerously-bypass-approvals-and-sandbox في بيئات بدون صندوق رملي خارجي.منذ الإصدار الأول المسجل في سجل Git، كان الهدف أقرب إلى "التحكم في أي كود يجب فحصه أولاً وما هي الأدلة المطلوبة" منه إلى "جعل LLM يجد الثغرات بنفسه". قدم التحقيق المدعوم بـ v1 الذي اكتشف CVE-2026-31720 مثالاً على تطبيق وحدة التحقيق الضيقة وعقد الأدلة في بحث فعلي. v2 وسّع سير العمل هذا ليشمل فرزًا واعيًا بالمصدر (provenance-aware triage) يحافظ على حالة المستودع والمراجع المعروفة معًا. إذا أعدت التنفيذ الآن، فسأعطي الأولوية لما يلي:
review وrunner،ومع ذلك، فإن المبدأ المركزي الذي أريد الحفاظ عليه هو الإشارة الخارجية. لا تترك LLM يستكشف قاعدة البيانات بأكملها بشكل غامض؛ بل كرر وحدات التحقيق المضيقة بإشارات خارجية حول قابلية الوصول والثوابت.
لا يحل Kernel Codex Harness محل اكتشاف ثغرات نواة Linux. بدلاً من ذلك، يحول الإشارة الخارجية إلى ترتيب قابل للتفسير، ويقيد مراجعة LLM في عملية تحقيق قصيرة وذات حالة. استُخدم هذا الهيكل في تحقيق فعلي لاكتشاف CVE-2026-31720. النتيجة الأساسية للمشروع ليست في الادعاء بخوارزمية تحليل جديدة، بل في تعريف مراجعة أمان LLM كمسألة توزيع انتباه بالإشارة الخارجية، وعقد أدلة، وتنسيق قابل لإعادة الإنتاج وتطبيق ذلك في سير عمل بحثي عملي.
.
├── .github/workflows/ci.yml
├── docs/
│ ├── assets/kernel-harness-architecture.svg
│ ├── AUTOPILOT.md
│ ├── CODEX_CLI.md
│ ├── CODEX_WORKFLOW.md
│ └── SYZBOT.md
├── kernel_harness/
│ ├── resources/
│ │ ├── linux-kernel-default.json
│ │ └── profiles/
│ ├── autopilot.py
│ ├── bundle.py
│ ├── cli.py
│ ├── ingest.py
│ ├── models.py
│ ├── prompting.py
│ ├── session.py
│ ├── syzbot.py
│ └── targeting.py
├── tests/test_regressions.py
├── README.md
└── pyproject.toml
يمكن الاطلاع على الإجراءات التشغيلية التفصيلية في docs/.
[1] Protect AI, "vulnhuntr," مستودع GitHub. https://github.com/protectai/vulnhuntr
[2] Google, "syzkaller and syzbot," مستودع GitHub. https://github.com/google/syzkaller
[3] OpenAI, "Codex CLI." https://developers.openai.com/codex/cli/
مرخص بموجب رخصة Apache 2.0.