
शैक्षिक पुनर्लेखन ऑफ़ कॉपी फेल पीओसी (सीवीई-2026-31431) — लिनक्स कर्नेल एलपीई algif_aead इन-प्लेस क्रिप्टो + splice() पेज-कैश राइट के माध्यम से
Theori/Xint के प्रूफ-ऑफ-कॉन्सेप्ट का शैक्षिक पुनर्लेखन CVE-2026-31431 के लिए,
जो लिनक्स कर्नेल के algif_aead क्रिप्टो सॉकेट इंटरफेस में एक स्थानीय विशेषाधिकार वृद्धि भेद्यता है।
यह 4.14 (जुलाई 2017) से 6.18.21 तक के हर मुख्यधारा कर्नेल, और 6.19.11 तक की 6.19 स्थिर शाखा को प्रभावित करता है।
केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान के लिए। उन सिस्टमों पर न चलाएं जिनके आप मालिक नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति नहीं है। इसे कमजोर होस्ट पर चलाने से किसी भी अन-प्रिविलेज्ड स्थानीय उपयोगकर्ता को तुरंत रूट एक्सेस मिल जाता है। लेखक दुरुपयोग के लिए कोई जिम्मेदारी नहीं लेते हैं।
लिनक्स कर्नेल ने कर्नेल 3.2 से AF_ALG सॉकेट परिवार (<linux/if_alg.h>) के माध्यम से उपयोगकर्ता स्थान को एक इन-कर्नेल क्रिप्टोग्राफी API उजागर किया है। उपयोगकर्ता स्थान
एक SOCK_SEQPACKET सॉकेट खोलता है, इसे एक एल्गोरिदम टेम्पलेट (जैसे
"aead" / "authencesn(hmac(sha256),cbc(aes))") से बांधता है, और एन्क्रिप्शन या डिक्रिप्शन के लिए डेटा भेजता है।
2017 में, एक प्रदर्शन अनुकूलन मर्ज किया गया था जो AEAD एल्गोरिदम को डेटा को इन-प्लेस एन्क्रिप्ट या डिक्रिप्ट करने की अनुमति देता है जब कर्नेल पता लगाता है कि स्रोत और गंतव्य समान अंतर्निहित पृष्ठ साझा करते हैं। यह प्रत्येक ऑपरेशन पर एक अनावश्यक मेमोरी कॉपी से बचाता है।
authencesn टेम्पलेट (जो प्रमाणित एन्क्रिप्शन में विस्तारित अनुक्रम संख्या समर्थन जोड़ता है) में डिक्रिप्शन के दौरान एक स्क्रैच-राइट होता है: यह
प्रमाणीकरण जांच चलने से पहले ऑपरेशन के डेटा बफर के भीतर एक विशिष्ट ऑफसेट पर ESN बाइट्स लिखता है। जब ऑपरेशन के स्रोत पृष्ठ splice() के माध्यम से एक नियमित फ़ाइल के पेज कैश से प्राप्त किए गए थे, और
इन-प्लेस अनुकूलन सक्रिय है, तो यह स्क्रैच राइट सीधे उन कैश्ड पृष्ठों में वापस चला जाता है।
क्योंकि कर्नेल का पेज कैश एक साझा मैपिंग है — कोई भी प्रक्रिया जो समान फ़ाइल खोलती है वह समान भौतिक पृष्ठ देखती है — एक अन-प्रिविलेज्ड उपयोगकर्ता यह कर सकता है:
/usr/bin/su) को O_RDONLY के साथ खोलें।AF_ALG ऑपरेशन सॉकेट में splice करें।authencesn डिक्रिप्शन ट्रिगर करें; ESN स्क्रैच राइट नियंत्रित ऑफसेट पर हमलावर-नियंत्रित बाइट्स के साथ पृष्ठ को दूषित करता है।ऑफ-होस्ट अखंडता स्कैनर (AIDE, Tripwire, IMA/EVM) जो डिस्क पर फ़ाइलों के चेकसम की तुलना करते हैं, इस हमले के प्रति पूरी तरह से अंधे हैं। पेज-कैश निष्कासन या रीबूट के बाद लेखन गायब हो जाता है, जिससे डिस्क पर कोई फोरेंसिक निशान नहीं रहता।
/usr/bin/su (एक setuid root बाइनरी) को लक्षित करके और PAM प्रमाणीकरण जांच की रक्षा करने वाली शाखा को अधिलेखित करके, हमलावर एक पासवर्ड-रहित रूट शेल प्राप्त करता है।
| शाखा | पहला कमजोर | अंतिम कमजोर | इसमें ठीक किया गया |
|---|---|---|---|
| मुख्यधारा | 4.14 | 6.18.21 | 6.18.22 |
| 6.19 स्थिर | 6.19.0 | 6.19.11 | 6.19.12 |
| 7.0-rc | 7.0-rc1 | 7.0-rc6 | 7.0-rc7 |
बग पेश करने वाला अनुकूलन कमिट 4.14 विकास चक्र (जुलाई 2017) में आया था। उपरोक्त श्रेणियों में CONFIG_CRYPTO_USER_API_AEAD=y और CONFIG_CRYPTO_AUTHENC=y (दोनों सामान्य डिफ़ॉल्ट) के साथ संकलित कोई भी कर्नेल कमजोर है।
| वितरण | भेजा गया कर्नेल (लगभग) | पैच किया गया? |
|---|---|---|
| Debian 12 (Bookworm) | 6.1.x | हाँ (बैकपोर्ट) |
| Debian 13 (Trixie) | 6.12.x / 6.14.x | हाँ (बैकपोर्ट) |
| Ubuntu 24.04 LTS | 6.8.x | हाँ (USN-7xxx) |
| Ubuntu 24.10 | 6.11.x | हाँ |
| RHEL 9.x | 5.14.x (रीबेस्ड) | हाँ (RHSA) |
| Alpine 3.20 | 6.6.x | हाँ (बैकपोर्ट) |
| Arch Linux | रोलिंग (≥ 6.18.22 अब) | हाँ |
| Kali Linux 2026.1 | 6.18.12 | कमजोर |
| Kali Linux 2026.2+ | 6.18.22+ | ठीक किया गया |
| Linux Mint 22 | 6.8.x (Ubuntu आधार) | हाँ (Ubuntu USN) |
सटीक सलाह स्थिति के लिए अपने वितरण के सुरक्षा ट्रैकर की जांच करें।
os.splice Python 3.10 में जोड़ा गया था)/usr/bin/su, विश्व-पठनीय क्योंकि यह setuid है)# दिखाएं कि कर्नेल को छुए बिना क्या लिखा जाएगा (सुरक्षित):
python3 copy_fail_exploit.py --dry-run
# /usr/bin/su पेज कैश पैच करें (कमजोर कर्नेल आवश्यक):
# चेतावनी: कमजोर कर्नेल आवश्यक है -- केवल उन सिस्टमों पर उपयोग करें जिनके आप मालिक हैं
python3 copy_fail_exploit.py
# पैच करें और तुरंत रूट तक बढ़ाएं:
python3 copy_fail_exploit.py --spawn-shell
# कस्टम लक्ष्य बाइनरी और पेलोड का उपयोग करें:
python3 copy_fail_exploit.py --target /usr/bin/sudo --payload-file ./custom_patch.bin
# विस्तृत आउटपुट (प्रत्येक 4-बाइट लेखन प्रिंट करें):
python3 copy_fail_exploit.py --verbose --dry-run
डिफ़ॉल्ट रूप से --spawn-shell बंद है। पैचिंग के बाद, स्क्रिप्ट प्रिंट करती है:
[+] Patch applied to page cache of '/usr/bin/su' (disk unchanged).
Run `su` to escalate, or re-run with --spawn-shell.
To restore: echo 3 | sudo tee /proc/sys/vm/drop_caches
आपको --spawn-shell के साथ शेल स्पॉन में ऑप्ट-इन करना होगा। यह जानबूझकर है:
यह आपको परिणाम निष्पादित करने से पहले समझने के लिए मजबूर करता है कि एक्सप्लॉइट ने क्या किया।
प्रिमिटिव सेट करना।
एक्सप्लॉइट एक AF_ALG सॉकेट खोलता है और इसे डमी ऑल-शून्य कुंजी के साथ authencesn(hmac(sha256),cbc(aes)) टेम्पलेट से बांधता है। यह
फिर ALG_SET_AEAD_AUTHSIZE के माध्यम से प्रमाणीकरण टैग आकार को 4 बाइट्स पर कॉन्फ़िगर करता है।
नियंत्रण सॉकेट पर accept() एक ऑपरेशन सॉकेट उत्पन्न करता है जो व्यक्तिगत डिक्रिप्ट अनुरोध सबमिट कर सकता है।
पेज-कैश लेखन ट्रिगर करना।
पैच पेलोड के प्रत्येक 4-बाइट चंक के लिए, एक्सप्लॉइट MSG_MORE सेट के साथ ऑपरेशन सॉकेट पर sendmsg() कॉल करता है, 8 बाइट्स संबद्ध डेटा (AAD) पास करता है: 4 बाइट्स फिलर के बाद 4 पेलोड बाइट्स। MSG_MORE कर्नेल को अधिक डेटा आने तक ऑपरेशन को रोकने के लिए कहता है। यह फिर एक पाइप बनाता है और दो splice() कॉल जारी करता है — file_fd → pipe → op_sock — फ़ाइल के अपने पेज-कैश पृष्ठों को डिक्रिप्शन ऑपरेशन के इनपुट के रूप में दान करता है। जब recv() अंततः कॉल किया जाता है, कर्नेल authencesn डिक्रिप्शन चलाता है। इन-प्लेस अनुकूलन सक्रिय होता है (स्रोत और गंतव्य समान पृष्ठ हैं), और ESN स्क्रैच राइट हमारे पेलोड बाइट्स को लक्ष्य ऑफसेट पर कैश पृष्ठ में कॉपी करता है। recv() EBADMSG लौटाता है क्योंकि प्रमाणीकरण टैग सत्यापित नहीं हो सकता — यह अपेक्षित और हानिरहित है। लेखन पहले ही हो चुका है।
बाइनरी पैच करना।
एम्बेडेड पेलोड (Theori PoC से शब्दशः लिया गया) /usr/bin/su में एक शाखा निर्देश को स्टॉक util-linux बिल्ड से अधिलेखित करता है, PAM प्रमाणीकरण लागू करने वाली सशर्त जंप को बिना शर्त फॉल-थ्रू में बदल देता है। पैचिंग के बाद, बिना पासवर्ड के su चलाना सफल होता है और एक रूट शेल छोड़ता है। डिस्क पर बाइनरी अछूती है; पेज-कैश प्रविष्टियों को हटाना (echo 3 > /proc/sys/vm/drop_caches) परिवर्तन को तुरंत वापस कर देता है।
गहन तकनीकी विश्लेषण के लिए नीचे दिए गए संदर्भ देखें, विशेष रूप से Xint ब्लॉग पोस्ट और Theori PoC रिपॉजिटरी।
- rule: AF_ALG socket opened by unprivileged process
desc: >
CVE-2026-31431 — an unprivileged process opened an AF_ALG (family 38)
socket, which is the first step of the Copy Fail exploit.
condition: >
evt.type = socket and
evt.arg.domain = 38 and
not user.uid = 0
output: >
AF_ALG socket opened (user=%user.name uid=%user.uid
pid=%proc.pid comm=%proc.name)
priority: WARNING
tags: [host, network, privilege_escalation, CVE-2026-31431]