
CVE-2026-31431 के लिए डिटेक्टर और प्रूफ-ऑफ-कॉन्सेप्ट, जो algif_aead में Linux कर्नेल पेज-कैश राइट भेद्यता है, जिसमें एक गैर-विनाशकारी स्कैनर और एक स्थानीय विशेषाधिकार वृद्धि एक्सप्लॉइट शामिल है।
इस रिपॉजिटरी में Linux algif_aead / authencesn पेज-कैश स्क्रैच-राइट भेद्यता
CVE-2026-31431 के लिए डिटेक्टर और PoC शामिल हैं।
प्रकटीकरण लेख: https://xint.io/blog/copy-fail-linux-distributions
केवल उन होस्टों पर उपयोग करें जिनके आप स्वामी हैं या जिनके लिए आपके पास स्पष्ट प्राधिकरण है। डिटेक्टर गैर-विनाशकारी है, यह केवल अस्थायी निर्देशिका में sentinel फ़ाइलों पर कार्य करता है; PoC और LPE मेमोरी में पेज-कैश स्थिति को संशोधित करते हैं, जो वास्तविक स्थानीय विशेषाधिकार वृद्धि तकनीक है, बिना प्राधिकरण के चलाना आमतौर पर अवैध है।
algif_aead AEAD ऑपरेशन को इन-प्लेस तरीके से निष्पादित करता है, अर्थात req->src == req->dst। जब इनपुट डेटा splice() के माध्यम से सामान्य फ़ाइल से भेजा जाता है, तो लक्ष्य scatterlist में उस फ़ाइल के पेज-कैश पृष्ठों के संदर्भ शामिल होते हैं, जिससे कर्नेल फ़ाइल के पेज-कैश कॉपी में लिख सकता है।
authencesn(hmac(sha256),cbc(aes)) AAD में seqno_lo फ़ील्ड (AAD के बाइट 4 से 7) पर एक 4-बाइट स्क्रैच राइट करता है। उपरोक्त इन-प्लेस AEAD और splice() पथ के साथ संयुक्त होने पर, हमलावर इन 4 बाइट्स को पठनीय फ़ाइल के पेज-कैश पृष्ठ पर गिरा सकता है।
यह संशोधन डिस्क पर वापस नहीं लिखा जाता है, यह केवल वर्तमान कर्नेल पेज-कैश को प्रभावित करता है। इसलिए डिस्क पर फ़ाइल की सामग्री अपरिवर्तित रहती है, लेकिन उस पेज-कैश को साझा करने वाले पाठक दूषित सामग्री देखेंगे। /etc/passwd और /usr/bin/su जैसी world-readable फ़ाइलें लक्ष्य बन सकती हैं।
मशीन पर Rust टूलचेन और Cargo स्थापित होना आवश्यक है।
सभी Rust बाइनरी संकलित करें:
cargo build --release --bins
संकलन पूर्ण होने पर निम्न उत्पन्न होंगे:
target/release/cve_2026_31431_detector
target/release/cve_2026_31431_poc
यदि रिपॉजिटरी में पूर्व-संकलित फ़ाइलें जमा करनी हों, तो उन्हें यहाँ रखें:
dist/linux-x86_64/cve_2026_31431_detector
dist/linux-x86_64/cve_2026_31431_poc
dist/linux-x86_64/SHA256SUMS
पूरे target/ निर्देशिका को जमा न करें; इसमें Cargo मध्यवर्ती उत्पाद और स्थानीय कैश शामिल हैं।
केवल गैर-विनाशकारी डिटेक्टर संकलित करें:
cargo build --release --bin cve_2026_31431_detector
केवल poc.py का Rust संस्करण संकलित करें:
cargo build --release --bin cve_2026_31431_poc
Rust गैर-विनाशकारी डिटेक्टर की अनुशंसा की जाती है:
./target/release/cve_2026_31431_detector
echo $?
इसे सीधे Cargo के माध्यम से भी चलाया जा सकता है:
cargo run --release --bin cve_2026_31431_detector
echo $?
Python डिटेक्टर उपयोग:
python3 test_cve_2026_31431.py
echo $?
निकास कोड का अर्थ:
| निकास कोड | अर्थ |
|---|---|
0 | कोई भेद्यता नहीं पाई गई, या पूर्व-शर्तें पूरी नहीं हुईं, जैसे AF_ALG / authencesn उपलब्ध नहीं है। |
सामान्य आउटपुट निर्णय:
डिटेक्टर द्वारा किए गए ऑपरेशन:
AF_ALG और authencesn(hmac(sha256),cbc(aes)) उपलब्ध हैं या नहीं।sendmsg के माध्यम से AAD भेजें, और AAD के seqno_lo को marker PWND पर सेट करें।splice() के माध्यम से sentinel फ़ाइल के पेज-कैश पृष्ठ को AF_ALG op socket में भेजें।recv() कॉल करें।डिटेक्टर /usr/bin/su, /etc/passwd या अन्य सिस्टम फ़ाइलों को संशोधित नहीं करता। अस्थायी sentinel फ़ाइलें बाहर निकलने पर हटा दी जाती हैं।
poc.py का Rust संस्करण:
./target/release/cve_2026_31431_poc
या:
cargo run --release --bin cve_2026_31431_poc
ध्यान दें: यह PoC poc.py के लॉजिक के अनुसार /usr/bin/su खोलता है, भेद्यता प्राइमिटिव के माध्यम से इसके पेज-कैश कॉपी को दूषित करता है, फिर su निष्पादित करता है। यह गैर-विनाशकारी डिटेक्शन प्रक्रिया नहीं है, इसे केवल प्राधिकृत परीक्षण वातावरण में चलाया जाना चाहिए।
python3 exploit_cve_2026_31431.py
python3 exploit_cve_2026_31431.py --shell
यह स्क्रिप्ट /etc/passwd में वर्तमान उपयोगकर्ता का UID फ़ील्ड ढूंढती है, और पेज-कैश में UID को 0000 में बदलने का प्रयास करती है। डिस्क पर /etc/passwd संशोधित नहीं होता, लेकिन सिस्टम प्रक्रियाएँ पेज-कैश पढ़ते समय दूषित सामग्री देख सकती हैं।
सीमाएँ:
1000 से 9999।nscd, sssd, systemd-userdbd, /etc/passwd के पेज-कैश परिवर्तनों को छिपा सकती हैं।/etc/passwd का पेज-कैश patch और su निष्पादन के बीच मौजूद रहना चाहिए।पेज-कैश साफ़ करना:
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)"
यदि root shell पहले ही प्राप्त हो चुका है, तो निम्न भी निष्पादित किया जा सकता है:
echo 3 > /proc/sys/vm/drop_caches
रीबूट भी पेज-कैश स्थिति को साफ़ कर देगा।
डिस्ट्रो कर्नेल फिक्स से पहले, algif_aead को अक्षम किया जा सकता है:
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
शमन लागू करने के बाद, डिटेक्टर को आमतौर पर 检测结论:未发现漏洞 आउटपुट देना चाहिए, और बताना चाहिए कि ट्रिगर पूर्व-शर्तें पूरी नहीं हुईं, निकास कोड 0।
अपस्ट्रीम फिक्स का दृष्टिकोण AEAD ऑपरेशन को इन-प्लेस प्रोसेसिंग से गैर-इन-प्लेस प्रोसेसिंग में पुनर्स्थापित करना है, ताकि पेज-कैश पृष्ठ लिखने योग्य destination scatterlist में प्रवेश न करें।
| फ़ाइल | विवरण |
|---|
test_cve_2026_31431.py | Python गैर-विनाशकारी डिटेक्टर। केवल अस्थायी sentinel फ़ाइलों पर कार्य करता है, सिस्टम फ़ाइलों को नहीं छूता। |
src/main.rs | Rust गैर-विनाशकारी डिटेक्टर। डिटेक्शन लॉजिक और निकास कोड Python डिटेक्टर के समान हैं। |
src/bin/poc.rs | poc.py का Rust संस्करण। /usr/bin/su के पेज-कैश को दूषित करता है और su निष्पादित करता है। |
poc.py | Python PoC। |
exploit_cve_2026_31431.py | Python LPE। /etc/passwd पेज-कैश को दूषित करके root shell प्राप्त करने का प्रयास करता है। |
2 | CVE-2026-31431 के प्रति संवेदनशील पाया गया। |
1 | परीक्षण प्रक्रिया में त्रुटि, परिणाम भेद्यता निर्णय के आधार के रूप में उपयोग नहीं किया जा सकता। |
| आउटपुट | निष्कर्ष |
|---|
检测结论:未发现漏洞 | कोई भेद्यता नहीं पाई गई, या ट्रिगर पूर्व-शर्तें पूरी नहीं हुईं। |
检测结论:存在 CVE-2026-31431 漏洞 | marker PWND सफलतापूर्वक spliced पेज-कैश पृष्ठ पर गिरा, भेद्यता मौजूद है। |
检测结论:存在疑似 CVE-2026-31431 漏洞 | पेज-कैश संशोधित हुआ, भले ही marker अपेक्षित स्थान पर न गिरा हो, इसे प्रभावित माना जाना चाहिए। |
测试过程出错,无法判断是否存在漏洞 | डिटेक्शन विफल, निकास कोड 1, त्रुटि संदेश के आधार पर जाँच कर पुनः चलाएँ। |