
استغلال تصعيد الصلاحيات المحلية لثغرة CVE-2026-31431، وهي ثغرة في نواة لينكس تتعلق بـ AF_ALG + استبدال ذاكرة التخزين المؤقت للصفحات عبر splice. يتضمن إثبات المفهوم (PoC)، وسكربت كشف باستخدام BPFtrace، وبيئة اختبار QEMU لأغراض البحث الأمني المصرح به.
تصعيد صلاحيات محلي في نواة لينكس عبر AF_ALG + استبدال صفحة ذاكرة التخزين المؤقت
لأغراض البحث الأمني المصرح به، واختبار الاختراق، والتعليم فقط. لا تستخدم ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها.
CVE-2026-31431 هي ثغرة تصعيد صلاحيات محلي (LPE) في نواة لينكس. يمكن لمستخدم محلي غير مميز الحصول على صلاحيات الجذر من خلال الجمع بين واجهة مقبس AF_ALG مع splice() لتنفيذ كتابة موثقة مباشرة في صفحة ذاكرة تخزين مؤقت تخص ملفًا ثنائيًا setuid.
يستغل الاستغلال ملف su الثنائي في ذاكرة التخزين المؤقت دون تعديل inode على القرص، متجاوزًا آليات التكامل التي تعتمد فقط على بيانات تعريف الملف أو المجاميع الاختبارية على مستوى الكتلة.
.
├── exploit.py # PoC — استبدال صفحة ذاكرة التخزين المؤقت وتصعيد الصلاحيات
├── detect.bt # سكربت BPFtrace للكشف في الوقت الفعلي
├── run-vm.sh # أتمتة بيئة اختبار QEMU (اختياري)
├── PAYLOAD.md # تحليل ترميز الحمولة (hex → zlib → ELF → shellcode)
└── LICENSE
شغّل exploit.py كمستخدم محلي غير مميز على أي نظام ضعيف — لا حاجة إلى sudo:
python3 exploit.py
ينفذ السكربت الخطوات التالية:
AF_ALG (algif_aead) ويحدد موقع ملف su الثنائي.su الثنائي كوصف ملف خام ويستبدل صفحات ذاكرة التخزين المؤقت الخاصة به عبر AF_ALG + sendfile.البنى المدعومة:
راقب محاولات الاستغلال في الوقت الفعلي باستخدام detect.bt. يتطلب صلاحيات الجذر:
sudo bpftrace detect.bt
# أو
doas bpftrace detect.bt
يتتبع السكربت ثلاثة مؤشرات لكل PID باستخدام قناع بتات في @suspect[pid]:
يتم إطلاق تنبيه عندما تكون جميع البتات الثلاثة مضبوطة (@suspect[pid] == 0x7) على نفس PID.
exploit.pyAF_ALG/algif_aeaddetect.btbpftrace ≥ 0.12# Ubuntu/Debian
sudo apt install bpftrace
# RHEL/CentOS/Fedora
sudo dnf install bpftrace
# Amazon Linux
sudo yum install bpftrace
# SUSE
sudo zypper install bpftrace
# Alpine
sudo apk add bpftrace
قم بتحديث حزمة نواة توزيعتك إلى إصدار يتضمن الالتزام الرئيسي
a664bf3d603d،
الذي يعكس تحسين algif_aead الموضعي لعام 2017 بحيث لا يمكن لصفحات ذاكرة التخزين المؤقت أن تنتهي في قائمة scatterlist الوجهة القابلة للكتابة. معظم التوزيعات الرئيسية تقوم الآن بتوفير الإصلاح.
algif_aead (أثناء انتظار التصحيح)يمكن تجاوز blacklist باستخدام modprobe algif_aead صريح. توجيه install .../bin/false يتجاوز أمر التثبيت بالكامل، مما يجعل كل محاولة تحميل تفشل:
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead 2>/dev/null || true
الأنظمة الفرعية في صف "لا" تستخدم واجهة برمجة التشفير داخل النواة مباشرة — لا تمر أبدًا عبر AF_ALG. يعود الأداء إلى مكتبات التشفير العادية في مساحة المستخدم، وهو ما تستخدمه تقريبًا كل الأشياء الأخرى بالفعل.
للتحقق مما إذا كان أي شيء على نظامك يستخدم AF_ALG بنشاط قبل تعطيله:
lsof | grep AF_ALG
ss -xa | grep alg
امنع إنشاء socket(AF_ALG, ...) لأحمال العمل غير الموثوقة بغض النظر عن حالة التصحيح. أضف AF_ALG (العائلة 38) إلى قائمة الحظر seccomp الخاصة بك، أو استخدم سياسة AppArmor/SELinux تقيد استدعاءات socket للعمليات غير المميزة.
detect.btانشر سكربت الكشف المرفق على أي مضيف لا يمكن تصحيحه أو تقييده فورًا. سينبه على أي عملية تنفذ بدائية الاستغلال الكاملة المكونة من ثلاث خطوات.
يقوم run-vm.sh بأتمتة إنشاء جهاز افتراضي Ubuntu 24.04 QEMU للاختبار في بيئة خاضعة للتحكم. يعمل exploit.py و detect.bt مباشرة على أي مضيف ضعيف — QEMU غير مطلوب.
| التبعية | ملاحظات |
|---|---|
qemu-system-x86_64 + KVM | راجع أوامر التثبيت أدناه |
wget أو curl | تنزيل صورة السحابة |
cloud-image-utils | توليد صورة البذور (يمكن لـ Docker أن يحل محلها على المضيفات غير Debian) |
# Ubuntu/Debian
sudo apt install qemu-system-x86 cloud-image-utils wget
# Fedora/RHEL
sudo dnf install qemu-system-x86 wget
# Arch
sudo pacman -Sy qemu
# Alpine
sudo apk add qemu-system-x86 qemu-ui-gtk wget
sh run-vm.sh
1. بدء/إنشاء الجهاز الافتراضي
2. الاتصال عبر SSH
3. رفع الملفات إلى الجهاز الافتراضي (exploit.py, detect.bt)
4. تشغيل الاستغلال داخل الجهاز الافتراضي
5. تشغيل detect.bt داخل الجهاز الافتراضي
6. التحقق من حالة الجهاز الافتراضي
7. إيقاف الجهاز الافتراضي
8. تنظيف ملفات الجهاز الافتراضي
0. خروج
| الحقل | القيمة |
|---|---|
| المستخدم | ubuntu |
| كلمة المرور | cve123 |
| منفذ SSH | 2222 |
crypto/af_alg.c — مصدر النواةmm/splice.c — مصدر النواةهذا المشروع مرخص بموجب رخصة جنو العمومية العامة الإصدار 3.0 أو الأحدث. راجع LICENSE للنص الكامل.
إخلاء مسؤولية: هذا المستودع مقدم لأغراض البحث الأمني المصرح به، واختبار الاختراق، والتعليم فقط. لا يتحمل المؤلفون أي مسؤولية عن أي إساءة استخدام أو ضرر ناتج عن هذا البرنامج.
| الحقل | القيمة |
|---|
| معرّف CVE | CVE-2026-31431 |
| النوع | تصعيد صلاحيات محلي (LPE) |
| درجة CVSS v3.1 | 7.8 عالية — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (المصدر: kernel.org) |
| أنظمة النواة الفرعية | crypto/af_alg.c, mm/splice.c |
| ناقل الهجوم | محلي — يتطلب حساب مستخدم غير مميز |
| السبب الجذري | algif_aead يقبل sendfile() عبر مقبس AEAD دون فرض دلالات النسخ عند الكتابة على صفحة ذاكرة التخزين المؤقت المعينة قبل اكتمال نقل splice() |
| التوزيعة | إصدار النواة | البنية |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | x86_64 |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | x86_64 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | x86_64 |
| SUSE 16 | 6.12.0-160000.9-default | x86_64 |
| Raspberry Pi OS (Pi 5) | 6.12.75+rpt-rpi-2712 | aarch64 |
| البنية | المتغيرات |
|---|
| x86_64 | — |
| aarch64 | — |
| riscv64 | — |
| ppc64le | — |
| arm | armv5l, armv6l, armv7l |
| x86 32-bit | i386, i486, i586, i686 |
| MIPS 64-bit | mips64, mips64el |
| LoongArch | loong64, loongarch64 |
| s390x | — |
| البت | استدعاء النظام | المؤشر |
|---|
0x1 | socket(AF_ALG, SOCK_SEQPACKET) | تم إنشاء مقبس AF_ALG |
0x2 | setsockopt(SOL_ALG, ...) | تم تكوين عملية التشفير |
0x4 | sendmsg(MSG_MORE) + splice() | تمت محاولة استبدال صفحة ذاكرة التخزين المؤقت |
| متأثر؟ | النظام الفرعي/حالة الاستخدام |
|---|
| لا | dm-crypt/LUKS, kTLS, IPsec/XFRM, TLS داخل النواة |
| لا | OpenSSL, GnuTLS, NSS البنيات الافتراضية |
| لا | SSH, تشفير keyring النواة |
| ربما | OpenSSL مع تمكين محرك afalg صراحة |
| ربما | مسارات تفريغ التشفير المدمجة أو التطبيقات التي تربط مقابس aead/skcipher/hash مباشرة |