
शैक्षिक पुनर्लेखन ऑफ़ कॉपी फेल पीओसी (सीवीई-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 विकास चक्र (जुलाई 2017) में आया था। उपरोक्त श्रेणियों में CONFIG_CRYPTO_USER_API_AEAD=y और CONFIG_CRYPTO_AUTHENC=y (दोनों सामान्य डिफ़ॉल्ट) के साथ संकलित कोई भी कर्नेल कमजोर है।
सटीक सलाह स्थिति के लिए अपने वितरण के सुरक्षा ट्रैकर की जांच करें।
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]
rule CopyFail_CVE_2026_31431 {
meta:
description = "Detects Copy Fail exploit script in memory or on disk"
cve = "CVE-2026-31431"
strings:
$template = "authencesn(hmac(sha256),cbc(aes))" ascii
$splice = "os.splice" ascii
$aflag = "AF_ALG" ascii
condition:
all of them
}
/etc/audit/rules.d/cve-2026-31431.rules में जोड़ें:
-a always,exit -F arch=b64 -S socket -F a0=38 -k cve_2026_31431_afalg
फिर लॉग देखें:
ausearch -k cve_2026_31431_afalg --interpret
1. कर्नेल पैच लागू करें (अनुशंसित) कर्नेल 6.18.22, 6.19.12, 7.0-rc7 या बाद में अपग्रेड करें, या अपने वितरण का सुरक्षा अद्यतन लागू करें।
2. बिल्ड समय पर CONFIG_CRYPTO_USER_API_AEAD अक्षम करें यदि आप अपना स्वयं का कर्नेल बनाते हैं, सेट करें:
# CONFIG_CRYPTO_USER_API_AEAD is not set
यह पूरे AF_ALG AEAD इंटरफेस को हटा देता है और हमले की सतह को समाप्त करता है। अधिकांश एम्बेडेड/हार्डन्ड तैनाती को इसकी आवश्यकता नहीं होती है।
3. seccomp — AF_ALG सॉकेट परिवार अस्वीकार करें
संवेदनशील प्रक्रियाओं (या LSM नीति के माध्यम से सिस्टम-व्यापी) में एक seccomp फ़िल्टर जोड़ें जो socket(AF_ALG, ...) को अस्वीकार करता है:
// Deny socket() when domain == AF_ALG (38)
BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 38, 0, 1),
BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ERRNO | EACCES),
4. कर्नेल हार्डनिंग के माध्यम से पेज-कैश विशेषाधिकार हटाएं
vm.unprivileged_userfaultfd=0 और समान ट्यूनेबल उपयोगकर्ता-सुलभ कर्नेल मेमोरी इंटरफेस की हमले की सतह को कम करते हैं, हालांकि वे सीधे इस CVE को अवरुद्ध नहीं करते हैं।
एक्सप्लॉइट केवल इन-मेमोरी पेज कैश को संशोधित करता है; डिस्क पर बाइनरी कभी नहीं छुई जाती। मेमोरी में मूल फ़ाइल सामग्री को पुनर्स्थापित करने के लिए, कर्नेल का पेज कैश हटाएं:
echo 3 | sudo tee /proc/sys/vm/drop_caches
यह कैश से सभी स्वच्छ पृष्ठों को निष्कासित करता है। /usr/bin/su (या जो भी बाइनरी पैच की गई थी) का अगला पठन डिस्क से मूल बाइट्स को फिर से लोड करेगा।
रीबूट भी पेज कैश को पूरी तरह से साफ करता है।
MIT — LICENSE देखें।
MIT को कस्टम "केवल शैक्षिक उपयोग" लाइसेंस पर चुना गया था क्योंकि ऐसा कोई लाइसेंस मान्यता प्राप्त OSI/SPDX पहचानकर्ता के रूप में मौजूद नहीं है। MIT अनुमेय, कानूनी रूप से अच्छी तरह से समझा जाने वाला, और जिम्मेदार प्रकटीकरण रिपॉजिटरी के साथ संगत है। शैक्षिक इरादा मॉड्यूल डॉकस्ट्रिंग, इस README के अस्वीकरण अनुभाग, और --help आउटपुट में व्यक्त किया गया है — कानूनी रूप से संदिग्ध कस्टम लाइसेंस खंड में नहीं।
| शाखा | पहला कमजोर | अंतिम कमजोर | इसमें ठीक किया गया |
|---|
| मुख्यधारा | 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 |
| वितरण | भेजा गया कर्नेल (लगभग) | पैच किया गया? |
|---|
| 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) |