
copyfail (CVE-2026-31431) का एक Bash कार्यान्वयन
कोई रेस नहीं। कोई ऑफसेट नहीं। कोई प्रीबिल्ट बाइनरी नहीं जिस पर आँख बंद करके भरोसा करना पड़े।
CVE-2026-31431 (Copy Fail) का एक bash कार्यान्वयन। यह स्क्रिप्ट रनटाइम पर एक न्यूनतम C हेल्पर को इनलाइन संकलित करती है। bash परत आर्किटेक्चर पहचान, पेलोड डीकंप्रेसन और लक्ष्य चयन को संभालती है; C परत वास्तविक कर्नेल इंटरैक्शन (AF_ALG सॉकेट, splice, sendmsg) करती है जिसे bash अपने आप तक नहीं पहुँच सकता।
पूर्ण तकनीकी विवरण के लिए copy.fail देखें।
बग algif_aead में है, जो कर्नेल का AF_ALG AEAD सॉकेट इंटरफ़ेस है। 2017 का एक इन-प्लेस ऑप्टिमाइज़ेशन पेज-कैश पेजों को authencesn डिक्रिप्शन ऑपरेशन की लिखने योग्य गंतव्य स्कैटरलिस्ट में समाप्त करने देता है। इसे splice() के माध्यम से सही इनपुट दें और आपको किसी भी पठनीय फ़ाइल के पेज कैश में एक नियतात्मक 4-बाइट राइट मिलता है, जिसमें setuid बाइनरी भी शामिल हैं जिनके मालिक आप नहीं हैं।
/usr/bin/su को एक बार में 4 बाइट्स शेलकोड से अधिलेखित करें, इसे चलाएँ, रूट शेल पाएँ। कोई रेस विंडो नहीं, कोई कर्नेल-विशिष्ट सिंबल नहीं, कोई पुनः प्रयास नहीं।
chmod +x copyfail.sh
# कुछ भी करने से पहले जाँचें कि सिस्टम असुरक्षित है या नहीं
./copyfail.sh -c
# एक्सप्लॉइट चलाएँ (non-root होना आवश्यक है)
./copyfail.sh
# कोई भिन्न setuid लक्ष्य निर्दिष्ट करें
./copyfail.sh -t /usr/bin/passwd
# सिस्टम पर सभी setuid-root उम्मीदवारों की सूची बनाएँ
./copyfail.sh -s
एक्सप्लॉइट केवल मेमोरी में पेज कैश को अधिलेखित करता है, डिस्क पर फ़ाइल अछूती रहती है। रीबूट सब कुछ पुनर्स्थापित कर देता है। यदि आप तुरंत सफाई करना चाहते हैं:
# अपने रूट शेल के अंदर
/usr/bin/su --version # पेज कैश हटा दिए जाने पर भी डिस्क से काम करता है
# या बस रीबूट करें
यदि आपने su के अलावा किसी और चीज़ के साथ -t का उपयोग किया है, तो भी यही स्थिति है। केवल पेज कैश, डिस्क साफ है।
gccpython3 (एक-लाइनर, कोई पैकेज आवश्यक नहीं)algif_aead, authencesn, hmac, cbcयदि एल्गो उपलब्ध नहीं है:
sudo modprobe algif_aead authencesn hmac cbc
कुछ डिस्ट्रो अस्थायी कार्यसमाधान के रूप में /etc/modprobe.d/ में एक ब्लॉक भेजते हैं। यदि मौजूद हो तो उसे हटाएँ:
sudo rm /etc/modprobe.d/disable-algif{_,-}aead.conf 2>/dev/null
floor: torvalds/linux 72548b093ee3 August 2017, v4.14
(AF_ALG iov_iter rework that introduced
the file-page write primitive via splice
into the AEAD scatterlist)
ceiling: torvalds/linux a664bf3d603d April 2026, mainline
(reverts the 2017 in-place optimization;
source and destination scatterlists are
now separate, page-cache pages can no
longer end up as writable crypto output)
इन दो कमिट्स के बीच: हर बड़ा डिस्ट्रो जिसने फिक्स बैकपोर्ट नहीं किया। Ubuntu, RHEL, SUSE, Amazon Linux, Debian सभी को प्रकटीकरण के समय असुरक्षित पुष्टि की गई थी। डिस्ट्रो बैकपोर्ट लगभग 2026-04-29 के आसपास आने शुरू हुए। किसी विशिष्ट कर्नेल की जाँच करने के लिए, चेंजलॉग में a664bf3d603d (या उसका डिस्ट्रो बैकपोर्ट) देखें।
| Arch | Status |
|---|---|
| x86_64 | ✓ |
| aarch64 | ✓ |
| i386 / i686 | ✓ |
| armv7l | ✓ |
स्थायी: अपने कर्नेल को अपडेट करें।
कार्यसमाधान (AF_ALG सॉकेट को ब्लॉक करता है; IPsec/XFRM को प्रभावित नहीं करता जो सीधे कर्नेल क्रिप्टो API का उपयोग करता है):
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
sudo rmmod algif_aead 2>/dev/null
कंटेनर: एक seccomp प्रोफ़ाइल जोड़ें जो AF_ALG सॉकेट निर्माण को ब्लॉक करती है, और अपने पॉड सुरक्षा संदर्भ में allowPrivilegeEscalation: false सेट करें। यह no_new_privs सक्षम करता है जो कर्नेल को execve() पर setuid बिट्स का सम्मान करने से रोकता है।
| Python | Go | Bash | |
|---|---|---|---|
| निर्भरता | python3 | कोई नहीं (static binary) | gcc + python3 |
| प्रीबिल्ट बाइनरी | नहीं | हाँ | नहीं |
| एकल फ़ाइल | हाँ | नहीं | हाँ |
| संकलन चरण | नहीं | नहीं | हाँ (इनलाइन, स्वचालित) |
bash संस्करण निर्भरता के मामले में नहीं जीतेगा, लेकिन यह एक एकल स्क्रिप्ट है जिसे आप चलाने से पहले शुरू से अंत तक पढ़ सकते हैं। C हेल्पर रनटाइम पर एक heredoc से उत्पन्न और संकलित होता है, अलग से ऑडिट करने के लिए कोई बाइनरी ब्लॉब नहीं।
केवल अधिकृत सुरक्षा परीक्षण और शोध के लिए। इसे उन सिस्टमों पर न चलाएँ जिनके मालिक आप नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति नहीं है।