
Dirty Frag पर एक रिपोर्ट, जो एक Linux Local Privilege Escalation (LPE) भेद्यता श्रृंखला है जो एक अविशेषाधिकार प्राप्त उपयोगकर्ता को रूट एक्सेस प्राप्त करने की अनुमति देती है।
लिनक्स कर्नेल स्थानीय विशेषाधिकार वृद्धि श्रृंखला के लिए एक्सप्लॉइट पुनरुत्पादन और डिटेक्शन लैब।
स्थिति: सत्यापित। मैंने लैब में पुनरुत्पादन, फाइललेस सत्यापन, और सिस्कॉल-स्तरीय डिटेक्शन पूरा किया (कर्नेल 6.18.9+kali-amd64)। यह दस्तावेज़ एक लैब लॉग है। नीचे दिया गया हर दावा पुनरुत्पादन रन के दौरान देखा गया था। स्क्रीनशॉट और आर्टिफैक्ट VM से वास्तविक कैप्चर हैं।
डर्टी फ्रैग लिनक्स कर्नेल में दो नियतात्मक लॉजिक बग्स को जोड़ता है। ये बग एक अनविशेषाधिकार प्राप्त स्थानीय उपयोगकर्ता को केवल-पठनीय फ़ाइलों (उदाहरण के लिए, /usr/bin/su) के पेज कैश को अधिलेखित करने और रूट शेल प्राप्त करने की अनुमति देते हैं:
दोनों वैरिएंट डर्टी पाइप और कॉपी फेल के समान रूट पैटर्न का उपयोग करते हैं। splice(2) सिस्कॉल एक फ़ाइल के पेज-कैश पेज का संदर्भ भेजने वाले पक्ष के sk_buff के frag स्लॉट में रखता है। हमलावर केवल इस फ़ाइल को पढ़ सकता है। प्राप्त करने वाले पक्ष का कर्नेल कोड फिर उस frag के ऊपर इन-प्लेस क्रिप्टो STORE करता है। यह RAM में पेज कैश को बदल देता है। कोई डिस्क राइट नहीं होती, इसलिए फ़ाइल अखंडता निगरानी (AIDE, Tripwire) इसे नहीं देख सकती। हमला नियतात्मक है। इसमें कोई रेस विंडो नहीं है और विफलता पर कोई कर्नेल पैनिक नहीं होता।
cac2661c53f3 (2017‑01) से f4c50a4034e6 (पैच 2026‑05‑05) तक2dc334f1a63a (2023‑06) से aa54b1d27fe0 (पैच 2026‑05‑10) तकCVE-2026-43284 = 8.8 (उच्च), CVE-2026-43500 = 7.8 (उच्च)डर्टी फ्रैग एक फाइललेस LPE है। यह डिस्क पर फ़ाइल को नहीं, बल्कि इन-मेमोरी पेज कैश को दूषित करता है। पारंपरिक फ़ाइल अखंडता निगरानी इसे नहीं देख सकती। डिटेक्शन सिस्कॉल स्तर पर होना चाहिए। श्रृंखला इन सिस्कॉल प्रिमिटिव का उपयोग करती है: socket(AF_ALG)/socket(AF_RXRPC), splice, और unshare(CLONE_NEWUSER|CLONE_NEWNET)। ESP पथ AF_INET UDP और नेटलिंक सॉकेट भी बनाता है। यह स्तर इस रिपो में डिटेक्शन इंजीनियरिंग का केंद्र बिंदु है।
दोनों वैरिएंट एक ही सिंक का उपयोग करते हैं: इन-प्लेस क्रिप्टो जो उस पेज-कैश पेज पर बाइट्स STORE करता है जिसे हमलावर splice(2) के साथ रखता है।
UDP_ENCAP_ESPINUDP के साथ कॉन्फ़िगर करता है।vmsplice के साथ एक पाइप में एक जाली ESP वायर हेडर (SPI, seq_no_lo, और IV) पंजीकृत करता है, फिर लक्ष्य फ़ाइल ऑफसेट पर /usr/bin/su से 16 बाइट्स splice के साथ।splice पाइप को भेजने वाले सॉकेट में धकेलता है। splice_to_socket() MSG_SPLICE_PAGES सेट करता है। यह /usr/bin/su के पेज-कैश पेज को सीधे skb->frags[0] में रखता है।xfrm4_udp_encap_rcv, फिर xfrm_input, फिर esp_input()। कमजोर skip_cow शाखा () को बायपास करती है। यह पेज-कैश पेज के साथ स्रोत और गंतव्य दोनों के रूप में करता है।हमलावर स्थान (splice ऑफसेट) और मान (4 बाइट्स) दोनों को नियंत्रित करता है। प्रमाणीकरण सत्यापन स्टोर के बाद चलता है, इसलिए क्रिप्टो परत कभी भी राइट को फ्लैग नहीं करती। इस वैरिएंट के लिए CAP_NET_ADMIN की आवश्यकता होती है और यह unshare(CLONE_NEWUSER|CLONE_NEWNET) का उपयोग करता है।
rxkad_verify_packet_1() splice-पिन किए गए skb frag पर सीधे एकल-ब्लॉक pcbc(fcrypt) डिक्रिप्ट करता है। यह पहले डेटा की प्रतिलिपि नहीं बनाता। हमलावर एक सत्र कुंजी (add_key("rxrpc", …)) चुनता है ताकि decrypt(ciphertext) desired_plaintext के बराबर हो। यह 8-बाइट STORE उत्पन्न करता है। यह वैरिएंट /etc/passwd को लक्षित करता है। इसे किसी उपयोगकर्ता नेमस्पेस की आवश्यकता नहीं होती। इसे rxrpc.ko मॉड्यूल की आवश्यकता होती है (Ubuntu पर डिफ़ॉल्ट रूप से लोड)।
सार्वजनिक PoC /usr/bin/su को लक्षित करता है। यह प्रत्येक 4 बाइट्स के 48 ESP स्टोर लिखता है (फ़ाइल ऑफसेट 0 पर 192 बाइट्स)। यह पहले पेज-कैश बाइट्स को एक स्थिर रूट-शेल ELF से बदल देता है। ELF प्रवेश बिंदु setgid(0); setuid(0); setgroups(0,NULL); execve("/bin/sh", …) चलाता है। एक एकल execve("/usr/bin/su") फिर एक रूट शेल देता है।
ESP पैच (मेनलाइन f4c50a4034e6) उन पेज फ्रैग्स को SKBFL_SHARED_FRAG फ्लैग के साथ चिह्नित करता है जो splice() के माध्यम से आते हैं। esp_input() में skip_cow शाखा अब इस फ्लैग की भी जांच करती है। साझा-frag skbs इन-प्लेस AEAD डिक्रिप्शन से पहले skb_cow_data() से गुजरते हैं।
RxRPC पैच (मेनलाइन aa54b1d27fe0) मौजूदा skb_cloned() जांच के बगल में एक skb->data_len जांच जोड़ता है। कर्नेल इन-प्लेस pcbc(fcrypt) डिक्रिप्शन से पहले पेज किए गए डेटा के साथ एक गैर-रैखिक skb की प्रतिलिपि बनाता है।
VirtualBox लैब सेटअप का स्क्रीनशॉट:

.
├── README.md # यह लैब लॉग
├── detection/
│ ├── dirtyfrag.rules # auditd सिस्कॉल‑स्तरीय डिटेक्शन नियम
│ ├── ausearch_dirtyfrag_observed.txt # वास्तविक एक्सप्लॉइट डिटेक्शन आउटपुट
│ ├── sigma/
│ │ └── dirty_frag_exploit.yml # SIEM डिटेक्शन के लिए सिग्मा नियम
│ └── yara/
│ └── dirty_frag_exploit.yar # डिस्क/मेमोरी पर PoC कोड के लिए YARA नियम
├── mitigation/
│ └── dirtyfrag_mitigation.sh # मॉड्यूल ब्लैकलिस्ट + पेज कैश फ्लश
├── poc/
│ └── check_vulnerable.py # गैर‑विनाशकारी प्री‑फ्लाइट चेकर
├── reports/
│ └── incident-dirtyfrag.md # घटना प्रतिक्रिया प्लेबुक
└── screenshots/ # लैब VM से वास्तविक कैप्चर
poc/check_vulnerable.py चलाएं और कर्नेल/मॉड्यूल/userns की पुष्टि करेंtestuser बनाएं/usr/bin/su हैश कैप्चर करेंdrop_caches या रिबूट)detection/dirtyfrag.rules तैनात करें और auditd अलर्ट मान्य करेंcat /etc/os-release | head -3
uname -r
कर्नेल संस्करण सत्यापन का स्क्रीनशॉट:

कर्नेल मई 2026 फिक्स (f4c50a4034e6 / aa54b1d27fe0) से पुराना होना चाहिए। यदि आपने उस तिथि के बाद apt upgrade चलाया है, तो एक्सप्लॉइट विफल हो जाएगा। समस्या निवारण देखें।
एक सुरक्षित चेकर रिपोर्ट करता है कि VM एक संभावित लक्ष्य है या नहीं। यह चल रहे कर्नेल, esp4/esp6/rxrpc मॉड्यूल की उपस्थिति, और अनविशेषाधिकार उपयोगकर्ता नेमस्पेस उपलब्ध हैं या नहीं, की जांच करता है। ESP वैरिएंट को इन नेमस्पेस की आवश्यकता होती है।
python3 poc/check_vulnerable.py
अपेक्षित निर्णय: [*] potentially vulnerable -- proceed in a disposable VM only
एक अनविशेषाधिकार प्राप्त testuser विशेष अधिकारों के बिना एक हमलावर का अनुकरण करता है।
sudo useradd -m testuser
sudo passwd testuser
su - testuser
id
स्क्रीनशॉट: id UID 1001 दिखाता है। यह गैर-रूट पहुंच की पुष्टि करता है।

अनविशेषाधिकार प्राप्त खाते से:
git clone https://github.com/V4bel/dirtyfrag.git
cd dirtyfrag
gcc -O0 -Wall -o exp exp.c -lutil
./exp
सफलता पर, एक्सप्लॉइट /usr/bin/su के पेज कैश को पैच करता है। यह प्रत्येक 4 बाइट्स के 48 ESP स्टोर लिखता है (फ़ाइल ऑफसेट 0 पर एक 192-बाइट रूट-शेल ELF)। फिर यह forkpty के साथ एक इंटरैक्टिव रूट शेल छोड़ता है।
मॉड्यूल उपलब्धता, स्रोत समीक्षा, और स्वच्छ संकलन का स्क्रीनशॉट:

id
whoami
स्क्रीनशॉट: ./exp के बाद id uid=0(root) दिखाता है।

sha256sum पेज कैश के माध्यम से पढ़ता है। जबकि एक्सप्लॉइट की राइट सक्रिय है, हैश मूल से अलग है। फ्लश के बाद, हैश मूल पर लौट आता है। यह पहले/बाद का जोड़ा साबित करता है कि डिस्क पर बाइनरी कभी नहीं छुआ गया था।
sha256sum /usr/bin/su # 1) जबकि पेज कैश दूषित है -> अलग हैश
स्क्रीनशॉट: हैश पैकेज हैश से अलग है (RAM जहर, डिस्क बरकरार)।

देखा गया दूषित (पेज-कैश) हैश: 3fc29078bd77150b5d6fbb368f632bf02c1a3704816f03fb694ec2e81e77bde4
एक्सप्लॉइटेशन के बाद, पेज कैश में दूषित डेटा होता है। इसे हमेशा फ्लश करें:
echo 3 | sudo tee /proc/sys/vm/drop_caches
# या VM को रिबूट करें
फिर पुनर्स्थापना सत्यापित करें (testuser के रूप में):
sha256sum /usr/bin/su # अब मूल पैकेज हैश से मेल खाता है
su - # फिर से पासवर्ड मांगता है — कोई ऑटो-रूट नहीं
स्क्रीनशॉट: पुनर्स्थापित (मूल ऑन-डिस्क) हैश।

देखा गया मूल (ऑन-डिस्क) हैश: 2b4f8770bd35bba5cdc5cfe292bc1d988e92ec1786bf91cf83e0e86fac056eb6
रिबूट के बाद, dpkg -V util-linux ने कोई आउटपुट नहीं लौटाया। डिस्क पर /usr/bin/su पैकेज से बिल्कुल मेल खाता है, इसलिए दूषित 3fc29078… हैश केवल पेज कैश में मौजूद था।
drop_cachesजहर वाले पेज को बाहर नहीं निकाल सकता। ऐसा तब होता है जब एक चल रही प्रक्रिया अभी भी पेज को पिन करती है। उस स्थिति में,sha256sumऔरdpkg -Vदूषित सामग्री दिखाते रहते हैं। विश्वसनीय फिक्स रिबूट है। ध्यान दें किdpkg -Vभी पेज कैश के माध्यम से पढ़ता है। जबकि पेज जहर है, यह??5??????रिपोर्ट करता है (MD5 अलग है; आकार, मोड, स्वामी, और mtime सभी मेल खाते हैं)। यह रिबूट के बाद फिर से शांत हो जाता है। यह साबित करता है कि डिस्क पर फ़ाइल कभी संशोधित नहीं हुई थी।
फ्लशिंग एक्सप्लॉइट को अक्षम नहीं करती। यह केवल जहर वाले पेज कैश को साफ करती है। आपको मॉड्यूल को अलग से अक्षम करना होगा (शमन देखें)। एक शोषित होस्ट पर पहले से लोड किए गए मॉड्यूल को हटाने के लिए रिबूट की आवश्यकता होती है।
डर्टी फ्रैग फ़ाइल अखंडता निगरानी के लिए अदृश्य है। डिटेक्शन उन सिस्कॉल प्रिमिटिव पर केंद्रित है जिन्हें श्रृंखला को उपयोग करना चाहिए।
detection/dirtyfrag.rules)# /etc/audit/rules.d/dirtyfrag.rules
-a always,exit -F arch=b64 -S socket -F a0=38 -F uid!=0 -k dirtyfrag_af_alg
-a always,exit -F arch=b64 -S socket -F a0=33 -F uid!=0 -k dirtyfrag_rxrpc
-a always,exit -F arch=b64 -S splice -F uid!=0 -k dirtyfrag_splice
-a always,exit -F arch=b64 -S unshare -F uid!=0 -k dirtyfrag_namespace
-w /usr/bin/su -p r -k dirtyfrag_suid_read
नोट: लिनक्स पर
AF_ALG = 38औरAF_RXRPC = 33(देखें/usr/include/bits/socket.h)। पहले के ड्राफ्ट मेंa0=21का उपयोग किया गया था। वह मान गलत है। AF_RXRPC 33 है, 21 नहीं।
तैनात करें और सत्यापित करें:
sudo cp detection/dirtyfrag.rules /etc/audit/rules.d/
sudo systemctl restart auditd # या: sudo auditctl -D && sudo auditctl -R /etc/audit/rules.d/dirtyfrag.rules
sudo auditctl -l
एक्सप्लॉइट को फिर से चलाने के बाद अपेक्षित अलर्ट (PID द्वारा सहसंबंधित करें):
ausearch -k dirtyfrag_af_alg
ausearch -k dirtyfrag_rxrpc
ausearch -k dirtyfrag_splice
ausearch -k dirtyfrag_namespace
सभी पांच नियम लोड हुए (auditctl -R, प्रत्येक CONFIG_CHANGE के लिए res=1)। नियमों ने एक्सप्लॉइट के नेमस्पेस सेटअप को पकड़ा:
time->Wed Aug 5 08:26:37 2026
type=PROCTITLE msg=audit(1785932797.328:592): proctitle="./exp"
type=SYSCALL msg=audit(1785932797.328:592): arch=c000003e syscall=272 success=yes exit=0 a0=50000000 a1=0 a2=0 a3=0 items=0 ppid=5198 pid=5199 auid=1000 uid=1001 gid=1001 euid=1001 suid=1001 fsuid=1001 egid=1001 sgid=1001 fsgid=1001 tty=pts2 ses=2 comm="exp" exe="/home/testuser/dirtyfrag/exp" subj=unconfined key="dirtyfrag_namespace"
डिकोड किया गया: syscall=272 (unshare), a0=50000000 CLONE_NEWUSER | CLONE_NEWNET के बराबर है, uid=1001 (अनविशेषाधिकार प्राप्त testuser), comm="exp"। पूरा लॉग detection/ausearch_dirtyfrag_observed.txt में है।
स्क्रीनशॉट: ausearch आउटपुट नियम लोड और एक्सप्लॉइट घटना दिखाता है।

पूरी प्लेबुक reports/incident-dirtyfrag.md में है: कार्यकारी सारांश, समयरेखा, IoC, MITRE ATT&CK मैपिंग, रोकथाम, उन्मूलन, पुनर्प्राप्ति, और सीखे गए पाठ।
तत्काल रनटाइम शमन। यह पहले से लोड किए गए मॉड्यूल के लिए रिबूट से बच नहीं पाता (नीचे नोट देखें):
sudo mitigation/dirtyfrag_mitigation.sh
यह क्या करता है:
esp4, esp6, और rxrpc को ब्लॉक करने के लिए /etc/modprobe.d/dirtyfrag.conf लिखता है। इसमें blacklist और alias … off लाइनें शामिल हैं। एक साधारण एक-लाइनर इन लाइनों को छोड़ देता है (अन्यथा alias द्वारा ऑटोलोड अभी भी काम करता था)।प्रभाव: इन मॉड्यूल को अक्षम करने से IPsec VPN (ESP) और AFS फाइलसिस्टम (RxRPC) कार्यक्षमता काम करना बंद कर देती है।
स्थायी फिक्स: एक कर्नेल में अपग्रेड करें जिसमें अपस्ट्रीम पैच शामिल हों। या बूट पर मॉड्यूल को ब्लैकलिस्ट करें (initcall_blacklist=esp4,esp6,rxrpc)।
| लक्षण | संभावित कारण | फिक्स |
|---|---|---|
./exp failed / post-write verify failed प्रिंट करता है | कर्नेल पैच किया गया है (मई 2026 या बाद से) |
| वैरिएंट | CVE | सिंक | ट्रिगर पथ | अनविशेषाधिकार userns की आवश्यकता |
|---|
| xfrm‑ESP पेज‑कैश राइट | CVE‑2026‑43284 | crypto_authenc_esn_decrypt() इन esp_input() | socket(AF_INET) UDP‑encap के साथ, फिर xfrm_input() | हाँ (CAP_NET_ADMIN) |
| RxRPC पेज‑कैश राइट | CVE‑2026‑43500 | rxkad_verify_packet_1() (pcbc(fcrypt)) | socket(AF_RXRPC) | नहीं |
!skb_cloned() && !skb_has_frag_list()skb_cow_data()crypto_authenc_esn_decrypt() ESN के उच्च-क्रम 32 बिट्स का STORE उत्सर्जित करता है। वह मान replay_esn->seq_hi है। हमलावर SA पंजीकरण के समय XFRMA_REPLAY_ESN_VAL नेटलिंक विशेषता के साथ इस मान को चुनता है।| घटक | विवरण |
|---|
| हाइपरवाइज़र | VirtualBox |
| लक्ष्य VM | काली लिनक्स 2026.1 (स्नैपशॉट एक कमजोर स्थिति में पुनर्स्थापित) |
| कर्नेल | 6.18.9+kali‑amd64 (मई 2026 फिक्स से पुराना) |
| एक्सप्लॉइट PoC | V4bel/dirtyfrag (एकल C फ़ाइल) |
| डिटेक्शन | auditd (नियम detection/dirtyfrag.rules में) |
| परत | यह क्या देखती है | स्थिति |
|---|
| auditd | AF_ALG और AF_RXRPC सॉकेट, splice, unshare, SUID रीड | हाँ। तैनात और मान्य (नियम फ़ाइल detection/dirtyfrag.rules) |
| सिग्मा | SIEM के लिए सिस्कॉल पैटर्न | हाँ। नियम तैयार (detection/sigma/dirty_frag_exploit.yml) |
| YARA | डिस्क या मेमोरी पर PoC कोड | हाँ। नियम तैयार (detection/yara/dirty_frag_exploit.yar) |
| FIM (AIDE/Tripwire) | फ़ाइल परिवर्तन | नहीं। अंधा, क्योंकि कोई डिस्क राइट नहीं होती |