
CVE_2026_31431 के लिए एक्सप्लॉइट POC
लिनक्स algif_aead के लिए डिटेक्टर और प्रूफ-ऑफ-कॉन्सेप्ट LPE /
authencesn पेज-कैश स्क्रैच-राइट बग जो 2026-04-29 को प्रकट किया गया।
प्रकटीकरण विवरण: https://xint.io/blog/copy-fail-linux-distributions
केवल उन होस्ट्स पर उपयोग करें जिनके आप स्वामी हैं या जिनके मूल्यांकन के लिए आपको स्पष्ट रूप से नियुक्त किया गया है। LPE इन-मेमोरी स्थिति (पेज कैश) को संशोधित करता है लेकिन तकनीक वास्तविक विशेषाधिकार वृद्धि है — बिना प्राधिकरण के सिस्टम पर इसे चलाना अधिकांश क्षेत्राधिकारों में अवैध है।
algif_aead AEAD ऑपरेशनों को इन-प्लेस (req->src == req->dst) चलाता है।
जब स्रोत डेटा को splice() के माध्यम से एक नियमित फ़ाइल से फीड किया जाता है,
गंतव्य स्कैटरलिस्ट में फ़ाइल के पेज-कैश पृष्ठों के संदर्भ होते हैं
— यानी कर्नेल उनमें लिखेगा।
authencesn(hmac(sha256), cbc(aes)) एल्गोरिथ्म फिर एक 4-बाइट
AAD के seqno_lo फ़ील्ड (sendmsg द्वारा आपूर्ति किए गए AAD के बाइट 4–7) का "स्क्रैच" राइट
उस गंतव्य में करता है, जिससे फ़ाइल की पेज-कैश
प्रति भ्रष्ट हो जाती है।
क्योंकि डिस्क-पर मौजूद फ़ाइल कभी संशोधित नहीं होती, कोई डिस्क-पर
हस्ताक्षर नहीं होता; भ्रष्टाचार केवल उन रीडर्स द्वारा देखा जाता है जो साझा करते हैं
पेज कैश। /etc/passwd और /usr/bin/su दोनों वर्ल्ड-रीडेबल हैं, इसलिए
एक अन-प्रिविलेज्ड स्थानीय उपयोगकर्ता चालू कर्नेल के दृष्टिकोण में से किसी को
भ्रष्ट कर सकता है।
प्रभावित: कमिट 72548b093ee3 (इन-प्लेस AEAD, 2017) वाले कर्नेल
जिनमें अपस्ट्रीम रिवर्ट नहीं है। प्रकटीकरण ने Ubuntu 24.04 LTS,
Amazon Linux 2023, RHEL 14.3, और SUSE 16 की पुष्टि की, लेकिन अंतर्निहित प्रिमिटिव
उस सीमा से पहले का है।
| फ़ाइल | उद्देश्य |
|---|---|
test_cve_2026_31431.py | गैर-विनाशकारी डिटेक्टर। टेम्प निर्देशिका में एक सेंटिनल फ़ाइल पर कार्य करता है; सिस्टम बाइनरी को कभी नहीं छूता। |
exploit_cve_2026_31431.py | LPE। /etc/passwd के पेज कैश में चालू उपयोगकर्ता के UID को 0 में बदलता है, फिर रूट शेल के लिए su को आमंत्रित करता है। |
दोनों स्क्रिप्ट शुद्ध Python 3.10+ stdlib हैं।
# 1. Detect
python3 test_cve_2026_31431.py
# exit 0 = not vulnerable, 2 = vulnerable, 1 = test error
# 2. Exploit (interactive — su will prompt for your own password)
python3 exploit_cve_2026_31431.py --shell
python3 test_cve_2026_31431.py
यह निम्न कार्य करता है:
AF_ALG और authencesn(hmac(sha256),cbc(aes))
एल्गोरिथ्म एक अन-प्रिविलेज्ड प्रक्रिया से पहुंच योग्य हैं।sendmsg+cmsg के माध्यम से seqno_lo को मार्कर PWND पर सेट करके
8 बाइट AAD इनलाइन भेजता है, फिर सेंटिनल के पेज-कैश पृष्ठ के 32 बाइट्स
AF_ALG op सॉकेट में os.splice() करता है।recv() को कॉल करता है। प्रमाणीकरण जांच
EBADMSG के साथ विफल हो जाती है; स्क्रैच राइट फिर भी होता है।आउटपुट श्रेणियाँ:
Precondition not met — AF_ALG या authencesn अनुपलब्ध। Exit 0.VULNERABLE to CVE-2026-31431 — मार्कर PWND स्प्लाइस किए गए
पृष्ठ में पहुंच गया। Exit 2.Page cache MODIFIED via in-place AEAD splice path — पृष्ठ में लेखन हुआ
लेकिन मार्कर अपेक्षित स्थिति पर नहीं पहुंचा।
इसे भेद्य मानें। Exit 2.Page cache intact — पैच किया हुआ। Exit 0.डिटेक्टर /usr/bin/su, /etc/passwd, या अपने द्वारा बनाई गई टेम्प निर्देशिका के बाहर की किसी भी अन्य
फ़ाइल को कभी नहीं छूता, और वह फ़ाइल बाहर निकलते समय
हटा दी जाती है।
python3 exploit_cve_2026_31431.py # patch only, print next steps
python3 exploit_cve_2026_31431.py --shell # patch and exec `su <user>`
यह निम्न कार्य करता है:
/etc/passwd में चालू उपयोगकर्ता की UID पंक्ति खोजता है और
4-वर्ण UID फ़ील्ड का बाइट ऑफसेट ढूंढता है।write4 लागू करता है, UID को
0000 से बदलता है।pwd.getpwnam(user) को कॉल करता है कि libc अब UID 0 की रिपोर्ट करता है।--shell के साथ, execvp("su", ["su", user])। अपना स्वयं का
पासवर्ड दर्ज करें। PAM /etc/shadow (अछूता) के विरुद्ध सत्यापित करता है, फिर
setuid(getpwnam(user).pw_uid) 0 पर पहुंच जाता है।write4 को तदनुसार बढ़ाएँ।nscd, sssd, systemd-userdbd) /etc/passwd रीड्स को मास्क नहीं कर रहा है।
यदि पैच के बाद भी getpwnam वास्तविक UID लौटाता है,
तो कैश को पुनरारंभ करें या बायपास करें, या कोई भिन्न उपयोगकर्ता चुनें।/etc/passwd पृष्ठ को पैच और su exec के बीच कैश में रहना चाहिए।
व्यवहार में यह सामान्य मेमोरी दबाव वाले किसी भी सिस्टम पर
विश्वसनीय है।डिस्क-पर मौजूद /etc/passwd अपरिवर्तित है।
ड्राई-रन (exploit_cve_2026_31431.py बिना --shell) बाहर निकलते समय
POSIX_FADV_DONTNEED के माध्यम से भ्रष्ट पृष्ठ को स्वतः बाहर निकाल देता है, इसलिए UID→नाम
लुकअप तुरंत सामान्य हो जाते हैं।
--shell के बाद, जब तक आप इसे साफ़ नहीं करते, पृष्ठ भ्रष्ट छोड़ दिया जाता है।
जब यह भ्रष्ट है, UID 1000 → नाम से हल करने वाली कोई भी चीज़ (जैसे ls,
फ़ाइल प्रबंधक, scp/sftp स्वामित्व जाँच) विफल हो जाएगी या संख्यात्मक
ID दिखाएगी। साफ़ करने के लिए:
# unprivileged - request page-cache eviction for /etc/passwd:
python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); \
os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)"
# from the root shell:
echo 3 > /proc/sys/vm/drop_caches
रीबूट भी इसे साफ़ करता है।
write4 कैसे काम करता हैsendmsg([8-byte AAD], cmsg=[ALG_SET_OP=DECRYPT, ALG_SET_IV, ALG_SET_AEAD_ASSOCLEN=8],
flags=MSG_MORE)
splice(target_fd, pipe_w, 32, offset_src=file_offset)
splice(pipe_r, op_fd, 32)
recv(op_fd) # EBADMSG; scratch write has already landed
AAD की स्थिति 4–7 (seqno_lo) के 4 बाइट्स निम्न द्वारा लिखे जाते हैं
authencesn द्वारा गंतव्य स्कैटरलिस्ट में, जो इस कोड पथ पर
वह पेज-कैश पृष्ठ है जिसे हमने target_fd से स्प्लाइस किया था। पृष्ठ के भीतर लैंडिंग ऑफसेट
उस offset_src के अनुरूप है जिसे हमने splice() को पारित किया था।
जब तक पैच किया गया कर्नेल आपके डिस्ट्रो तक नहीं पहुंचता:
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
लागू करने के बाद, test_cve_2026_31431.py को Precondition not met रिपोर्ट करना चाहिए और Exit 0 देना चाहिए।
अपस्ट्रीम फिक्स इन-प्लेस AEAD ऑपरेशनों को आउट-ऑफ-प्लेस में बदल देता है, जिससे पेज-कैश पृष्ठ लिखने योग्य स्कैटरलिस्ट से बाहर रहते हैं।