
Dirty Frag पर एक रिपोर्ट, जो एक Linux Local Privilege Escalation (LPE) भेद्यता श्रृंखला है जो एक अविशेषाधिकार प्राप्त उपयोगकर्ता को रूट एक्सेस प्राप्त करने की अनुमति देती है।
लिनक्स कर्नेल स्थानीय विशेषाधिकार वृद्धि श्रृंखला के लिए एक्सप्लॉइट पुनरुत्पादन और डिटेक्शन लैब।
स्थिति: सत्यापित। मैंने लैब में पुनरुत्पादन, फाइललेस सत्यापन, और सिस्कॉल-स्तरीय डिटेक्शन पूरा किया (कर्नेल 6.18.9+kali-amd64)। यह दस्तावेज़ एक लैब लॉग है। नीचे दिया गया हर दावा पुनरुत्पादन रन के दौरान देखा गया था। स्क्रीनशॉट और आर्टिफैक्ट VM से वास्तविक कैप्चर हैं।
डर्टी फ्रैग लिनक्स कर्नेल में दो नियतात्मक लॉजिक बग्स को जोड़ता है। ये बग एक अनविशेषाधिकार प्राप्त स्थानीय उपयोगकर्ता को केवल-पठनीय फ़ाइलों (उदाहरण के लिए, /usr/bin/su) के पेज कैश को अधिलेखित करने और रूट शेल प्राप्त करने की अनुमति देते हैं:
| वैरिएंट | 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) | नहीं |
दोनों वैरिएंट डर्टी पाइप और कॉपी फेल के समान रूट पैटर्न का उपयोग करते हैं। 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 शाखा (!skb_cloned() && !skb_has_frag_list()) skb_cow_data() को बायपास करती है। यह पेज-कैश पेज के साथ स्रोत और गंतव्य दोनों के रूप में इन-प्लेस AEAD डिक्रिप्शन करता है।crypto_authenc_esn_decrypt() ESN के उच्च-क्रम 32 बिट्स का STORE उत्सर्जित करता है। वह मान replay_esn->seq_hi है। हमलावर SA पंजीकरण के समय XFRMA_REPLAY_ESN_VAL नेटलिंक विशेषता के साथ इस मान को चुनता है।हमलावर स्थान (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 |
| लक्ष्य VM | काली लिनक्स 2026.1 (स्नैपशॉट एक कमजोर स्थिति में पुनर्स्थापित) |
| कर्नेल | 6.18.9+kali‑amd64 (मई 2026 फिक्स से पुराना) |
| एक्सप्लॉइट PoC | V4bel/dirtyfrag (एकल C फ़ाइल) |
| डिटेक्शन | auditd (नियम detection/dirtyfrag.rules में) |
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 अलर्ट मान्य करेंreports/incident-dirtyfrag.md)