
يحلل ثغرة CVE-2026-31431، وهي ثغرة أمنية في نواة لينكس ضمن AF_ALG AEAD، ويوفر كاشفًا آمنًا، واستغلال رفع صلاحيات محلي (LPE) مخبريًا، ومختبر نواة A/B قائم على QEMU للتحقق.
algif_aead بنواة لينكس: تحليلبحث أمني حول CVE-2026-31431 (CVSS 3.1 7.8 عالية،
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H): ثلاثة عيوب تصميمية
قابلة للتجميع في سلسلة واجهة AF_ALG AEAD تؤدي إلى كتابة حتمية
وخالية من السباقات بمقدار 4 بايت في ذاكرة التخزين المؤقت للصفحات عند أي إزاحة لأي ملف قابل للقراءة
— تبقى نسخة القرص نظيفة، لذا لا ترى المجاميع الاختبارية على القرص شيئًا.
الاستغلال العام ("فشل النسخ"، Theori/Xint) يحوّله إلى صلاحيات جذر محلية
(LPE) بـ 732 بايت من بايثون؛ العيب ظل في كل نواة
من 2017 إلى 2026.
72548b093ee3 (2017) جعل _aead_recvmsg يفك التشفير في المكان،
رابطًا صفحات وسم الطلب في SGL الوجهة القابل للكتابة.splice(file → pipe → socket) يغذي تلك الفتحات الوسمية
بصفحات ذاكرة التخزين المؤقت لأي ملف قابل للقراءة (نسخ صفري).authencesn يكتب مساحته المؤقتة ESN ذات الـ 4 بايت — القيمة توجد في
AAD[4..8) من حمولة sendmsg — بالضبط عند
، أي أول بايت وسم: إزاحة الملف التي اخترتها.
يحدث ذلك التحقق من الوسم، لذا حتى طلب
ينفذ الكتابة.dst[assoclen + cryptlen]-EBADMSG| الادعاء | الدليل |
|---|---|
| السبب الجذري مشتق من التزامات الإصلاح ومصادر النواة، وليس من المدونات | finding-sheet |
| فك ترميز PoC العام تم التحقق منه من البداية إلى النهاية مقابل تسلسل استدعاءات النظام | finding-sheet |
| نواتا المختبر A/B مع دلتا = بالضبط التزام الإصلاح، كلتاهما تُقلعان | lab/scripts/build.sh + lab/out/ab-diffstat.txt |
النواة المعيبة تنفذ فك تشفير AEAD authencesn عبر AF_ALG (اختبار دخاني) | lab/scripts/run.sh vuln → SMOKE=ok |
التراجع بدون المرافق يسبب انهيارًا في crypto_authenc_esn_decrypt (الاكتشاف الأصلي) | lab/scripts/run.sh patched → إلغاء مرجع NULL، قابل للتكرار |
| كاشف آمن: ضعيف على النواة المعيبة (الكتابة تحدث رغم EBADMSG، القرص يبقى نظيفًا)، غير مكتشف على الإصلاح الكامل | poc/detector.c في المختبر → أسطر DETECTOR-RESULT |
| إغلاق LPE داخل المختبر: المستخدم uid 1000 يعدّل 4 بايت من ذاكرة التخزين المؤقت للصفحات لملف SUID ويقرأ العلم الخاص بالجذر فقط؛ إثبات أن نسخة القرص سليمة عبر قراءة debugfs على مستوى الكتلة | poc/lpe.c + lab/rootfs/tools/secretgate.c → LPE-RESULT: ROOT-FLAG-CAPTURED، DISKCLEAN=ok |
| إعادة إنتاج كتابة ذاكرة التخزين المؤقت للصفحات العامة في مختبر مثبّت، مع الإسناد | مخرجات الكاشف أعلاه + lab README |
| اختبار إجهاد SGL: 5 أشكال على كلتا النواتين — لا انهيار، لا تعليق للنواة (نتيجة سلبية صادقة) + خاصيتان موثقتان لانحراف عقد AF_ALG | poc/sgl-stress.c في المختبر → أسطر SGL-STRESS |
# بناء النوى الثلاث + الأدوات + قرص الفحص في Docker (~15 دقيقة لأول تشغيل)
lab/scripts/build.sh
# إقلاع أوراكل A/B/C (QEMU في Docker، KVM إذا كان متاحًا)
lab/scripts/run.sh vuln # DETECTOR VULNERABLE + LPE ROOT-FLAG-CAPTURED + DISKCLEAN=ok
lab/scripts/run.sh patchedfull # DETECTOR NOT-DETECTED + LPE NOT-VULNERABLE
lab/scripts/run.sh patched # إلغاء مرجع NULL في authencesn (فجوة إصلاح المرافق)
سلسلة كتابة ذاكرة التخزين المؤقت للصفحات المكتملة تتبع النهج المنشور لـ
Theori / Xint Code ("فشل النسخ"، المُبلِّغان المنسوب إليهما) مع
الإسناد — انظر قسم الأعمال السابقة في finding-sheet.
العمل الأصلي في هذا المستودع: خريطة الآليات المرتكزة على التزام الإصلاح،
اكتشاف سلسلة الإصلاح غير المكتملة (انهيار authencesn عند التراجع بدون
المرافق ونافذة إصداره المستقر)، الكاشف التفاضلي الآمن لذاكرة
التخزين المؤقت للصفحات مقابل القرص الذي لا يلمس أبدًا ملفات لا
نملكها، إغلاق LPE داخل المختبر ضد هدف SUID مخصص
(secretgate — لا يُستهدف أي ملف ثنائي حقيقي أبدًا)، استكشاف
حواف SGL (نتيجة سلبية صادقة بالإضافة إلى خاصيتين موثقتين
لانحراف عقد AF_ALG)، وإسناد الفروع المُتحقق منه لجميع التزامات
الإصلاح الثمانية.
| المستند | ما هو |
|---|---|
| docs/finding-sheet.md | ورقة بيانات من صفحة واحدة: الإصدارات، CVSS، السبب الجذري، التزامات الإصلاح، سطح الهجوم |
| docs/report-ptes.md | تقرير منظم وفق PTES (7 مراحل) مع أدلة المختبر |
| docs/research-writeup.md | سرد التحقيق — المنهجية، الطرق المسدودة، دروس قابلة للنقل، مقارنة الأعمال السابقة |
docs/ ورقة الاكتشاف · تقرير PTES · كتابة البحث
poc/ detector.c (أوراكل آمن) · lpe.c (LPE داخل المختبر) · sgl-stress.c (استكشاف SGL)
lab/ مختبر نواة QEMU: 5.15.203 ± الإصلاح (A/B) + ما بعد المرافق 5.15.y (C)
lab/rootfs/ secretgate.c — هدف SUID مخصص (الشيء الوحيد الذي يُهاجَم على الإطلاق)
72548b093ee3 "crypto: algif_aead - copy AAD from src to dst" (2017)a664bf3d603d "crypto: algif_aead - Revert to operating out-of-place"
(+ 8 تراجعات مستقرة — انظر finding-sheet)أداة بحث تعليمية. شغّلها فقط ضد أنظمة تملكها أو مصرّح لك صراحةً باختبارها. الثغرة مصححة — شغّل نواة محدّثة من فروع 2026 المستقرة أو أحدث.