
रस्ट में लिखा गया CVE-2026-31431 के लिए एक्सप्लॉइट, जो AF_ALG splice के माध्यम से Linux कर्नेल पेज-कैश राइट प्रिमिटिव है, जो /etc/passwd पैचिंग या शेलकोड निष्पादन के जरिए रूट तक विशेषाधिकार वृद्धि को सक्षम बनाता है।
CVE-2026-31431 (कॉपी फेल) का Rust कार्यान्वयन — AF_ALG splice के माध्यम से Linux कर्नेल पेज-कैश राइट प्रिमिटिव।
Linux कर्नेल का algif_aead कार्यान्वयन एक अनप्रिविलेज्ड उपयोगकर्ता को splice() सिस्कॉल के माध्यम से किसी भी पठनीय फ़ाइल के पेज कैश में मनमाना डेटा लिखने की अनुमति देता है। authencesn AEAD एल्गोरिदम seqno_lo (उपयोगकर्ता-नियंत्रित AAD बाइट्स 4-7) को ऑफसेट assoclen + cryptlen पर डेस्टिनेशन स्कैटरलिस्ट में लिखता है, जो — splice() के माध्यम से पेज-कैश पेजों से जुड़ने पर — एक मनमाना 4-बाइट राइट का परिणाम देता है। डिस्क पर मौजूद सामग्री अपरिवर्तित रहती है, लेकिन बाद के सभी पाठक दूषित पेज-कैश डेटा देखते हैं।
प्रभावित कर्नेल: Linux < 6.12.23, < 6.13.11, < 6.14.2
1. --uid — पेज-कैश राइट के माध्यम से /etc/passwd में वर्तमान उपयोगकर्ता के UID फ़ील्ड को 0000 में बदलता है। पैचिंग के बाद, अपने स्वयं के पासवर्ड के साथ su <username> एक रूट शेल देता है। टूल प्रमाणीकरण के बाद और शेल शुरू करने से पहले पेज कैश को साफ़ करने का प्रयास करता है, जिससे SSH द्वारा खाते को UID 0 के रूप में देखे जाने की संभावना कम हो जाती है। रूट पासवर्ड संशोधन की आवश्यकता नहीं है। किसी भी 4-अंकीय UID (1000-9999) के लिए काम करता है।
2. --escalate — पेज-कैश राइट के माध्यम से /etc/passwd में रूट लाइन पैच करता है: root:x:0:0:root:... → root::0:0:root :...। लाइन की लंबाई समान रखने के लिए कमेंट फ़ील्ड को स्पेस से पैड किया जाता है। पैचिंग के बाद, su root बिना पासवर्ड के काम करता है।
3. --set-password — पहले एस्केलेट करता है (रूट पासवर्ड हटाता है), फिर stdin से नया पासवर्ड पढ़ता है और chpasswd के साथ लागू करता है।
4. डिफ़ॉल्ट मोड (कोई फ़्लैग नहीं) — su बाइनरी के पेज कैश को आर्किटेक्चर-विशिष्ट शेलकोड पेलोड (x86_64, x86, aarch64) के साथ अधिलेखित करता है, फिर रूट शेल प्राप्त करने के लिए su निष्पादित करता है।
cargo build
cargo build --release
cargo test
cargo clippy
./copyfail-rs --check
./copyfail-rs --uid
./copyfail-rs --escalate
printf '%s\n' 'mypassword' | ./copyfail-rs --set-password
./copyfail-rs --backup /tmp/su.bak
./copyfail-rs --exec /bin/bash
पेज-कैश संशोधन अस्थिर होते हैं — कैश साफ़ करने से मूल डिस्क सामग्री पुनर्स्थापित हो जाती है:
echo 3 > /proc/sys/vm/drop_caches
यह प्रोजेक्ट केवल अधिकृत सुरक्षा परीक्षण और शैक्षिक उद्देश्यों के लिए प्रदान किया गया है।
| फ़्लैग | विवरण |
|---|
--check | सुरक्षित प्रीफ़्लाइट: हल किए गए su लक्ष्य का निरीक्षण करें और बाहर निकलें |
--escalate | रूट पासवर्ड हटाने के लिए पेज कैश में /etc/passwd पैच करें, फिर su root |
--set-password | पहले एस्केलेट करें, फिर stdin से नया रूट पासवर्ड पढ़ें और chpasswd के माध्यम से लागू करें |
--uid | /etc/passwd में वर्तमान उपयोगकर्ता की UID को 0 में बदलें, फिर su <username> |
--backup <path> | अधिलेखित करने से पहले su बाइनरी का बैकअप लें |
--exec <path> | अधिलेखन के बाद रूट के रूप में एक विशिष्ट कमांड चलाएँ |
| OS | कर्नेल | परिणाम |
|---|
| Ubuntu 22.04.2 LTS | 6.8.0-87-generic | --escalate पास, --set-password पास, --uid पास |
| Ubuntu 22.04.2 LTS | 6.8.0-107-generic | --escalate पास, --uid पास |
| Ubuntu 25.10 | 6.17.0-5-generic | splice EINVAL, कर्नेल पैच किया गया |
| Ubuntu 25.10 | 6.17.0-8-generic | --uid पास |
| Alpine Linux edge | 6.19.12 | एक्सप्लॉइट चलता है, पेज-कैश राइट कर्नेल फिक्स द्वारा अवरुद्ध |