
dirtyfrag (CVE-2026-43284 / CVE-2026-43500) का एक Go कार्यान्वयन
दो बग। एक शेल। कोई डिस्क राइट नहीं।
dirtyfrag का Go पोर्ट (CVE-2026-43284 / CVE-2026-43500)।
यह बग Linux कर्नेल XFRM सबसिस्टम में है। जब किसी फ़ाइल पेज को splice() करके एक पाइप में और फिर एक ESP-एन्क्रिप्टेड सॉकेट में डाला जाता है, तो कर्नेल ESP पेलोड को इन-प्लेस डिक्रिप्ट करता है - सीधे स्रोत फ़ाइल के पेज-कैश पेज में। फ़ाइल केवल-पठनीय है। पेज कैश नहीं है।
dirtyfrag इस प्रिमिटिव का शोषण करने वाले दो स्वतंत्र बगों को जोड़ता है:
CVE-2026-43284 - ESP/XFRM पथ
NETLINK_XFRM के माध्यम से 48 XFRM ट्रांसपोर्ट-मोड SA स्थापित करता है। प्रत्येक SA अपनी ESN रीप्ले स्थिति के seq_hi फ़ील्ड में शेलकोड पेलोड के 4 बाइट एन्कोड करता है। एक vmsplice + splice श्रृंखला प्रत्येक SA के लिए ESP इन-प्लेस डिक्रिप्शन ट्रिगर करती है, उन 4 बाइट्स को /usr/bin/su पेज-कैश एंट्री में लिखती है। 48 ट्रिगर, 192 बाइट लिखे गए, कोई रेस कंडीशन नहीं।
CVE-2026-43500 - RxRPC/rxkad पथ
डिक्रिप्ट होने पर लक्षित बाइट अनुक्रम उत्पन्न करने वाली 3 PCBC(fcrypt) सत्र कुंजियों को ऑफ़लाइन ब्रूट-फोर्स करता है। प्रत्येक कुंजी के लिए /etc/passwd में रूट एंट्री को root::0:0 (nullok) में पैच करने हेतु एक AF_RXRPC सॉकेट ट्रिगर फायर करता है। su - तब एक खाली पासवर्ड स्वीकार करता है।
दोनों पथ होस्ट पर CAP_NET_ADMIN की आवश्यकता से बचने के लिए यूज़र + नेटवर्क नेमस्पेस (CLONE_NEWUSER | CLONE_NEWNET) में चलते हैं।
go build -o dirtyfrag-go .
./dirtyfrag-go
# Force a specific path
./dirtyfrag-go --force-esp
./dirtyfrag-go --force-rxrpc
# Verbose output
./dirtyfrag-go -v
बाइनरी पहले ESP पथ आज़माता है। यदि उसके बाद /usr/bin/su पैच नहीं होता है, तो यह RxRPC पथ पर वापस आ जाता है (अधिकतम 3 पुनःप्रयास)। सफलता पर यह एक नए PTY के माध्यम से रूट शेल में प्रवेश करता है।
एक्सप्लॉइट केवल पेज कैश को छूता है। डिस्क पर मौजूद बाइनरी और /etc/passwd अछूते रहते हैं। रीबूट सब कुछ बहाल कर देता है। बिना रीबूट किए तुरंत निकालने के लिए:
echo 1 | tee /proc/sys/vm/drop_caches
esp4, esp6 (ESP पथ) और/या rxrpc (RxRPC पथ)पैच से पहले के सभी कर्नेल:
rmmod esp4 esp6 rxrpc
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' \
> /etc/modprobe.d/dirtyfrag.conf
Go का रनटाइम शुरू से ही मल्टी-थ्रेडेड होता है, इसलिए unshare(CLONE_NEWUSER) की अनुमति नहीं है। Go पोर्ट SysProcAttr.Cloneflags सेट करके स्वयं को एक चाइल्ड प्रोसेस के रूप में पुनः-निष्पादित करता है, जो Go रनटाइम के आरंभ होने से पहले clone() को कॉल करता है।
| C (मूल) | Go |
|---|
| बाहरी निर्भरताएँ | कोई नहीं | कोई नहीं |
| एकल फ़ाइल | नहीं | नहीं |
| स्टैटिक बाइनरी | हाँ | हाँ |
| RxRPC पथ | हाँ | हाँ |
| ESP पथ | हाँ | हाँ |
| नेमस्पेस अलगाव | unshare() | Cloneflags के साथ पुनः-निष्पादन |