
लिनक्स पेज-कैश लेखन भेद्यताओं के लिए डिटेक्टर + PoC: Copy Fail (CVE-2026-31431) और Dirty Frag (CVE-2026-43284/43500)। केवल अधिकृत सुरक्षा अनुसंधान के लिए।
एक एकीकृत डिटेक्टर और PoC हार्नेस, Copy Fail और Dirty Frag लिनक्स पेज-कैश लेखन भेद्यता परिवारों के लिए।``` ██████╗ ██╗██████╗ ████████╗██╗ ██╗███████╗ █████╗ ██╗██╗ ██╔══██╗██║██╔══██╗╚══██╔══╝╚██╗ ██╔╝██╔════╝██╔══██╗██║██║ ██║ ██║██║██████╔╝ ██║ ╚████╔╝ █████╗ ███████║██║██║ ██║ ██║██║██╔══██╗ ██║ ╚██╔╝ ██╔══╝ ██╔══██║██║██║ ██████╔╝██║██║ ██║ ██║ ██║ ██║ ██║ ██║██║███████╗ ╚═════╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝
DIRTYFAIL एक छोटा, अच्छी तरह से प्रलेखित C टूल है जो सुरक्षा शोधकर्ताओं के लिए है।
यह पता लगाता है कि कोई Linux होस्ट इस परिवार के तीन CVEs के लिए
असुरक्षित है या नहीं, और — स्पष्ट, टाइप की गई पुष्टि के साथ — एक वास्तविक
proof-of-concept चलाता है जो कॉल करने वाले को असुरक्षित सिस्टम पर
root शेल में डाल देता है।
| CVE / वैरिएंट | नाम | DIRTYFAIL कवरेज |
|---|---|---|
| **CVE-2026-31431** | Copy Fail (algif_aead `authencesn` पेज-कैश लेखन) | पता लगाना + पूर्ण PoC |
| **CVE-2026-43284 v4** | Dirty Frag — IPv4 xfrm-ESP पेज-कैश लेखन | पता लगाना + पूर्ण PoC |
| **CVE-2026-43284 v6** | Dirty Frag — IPv6 xfrm-ESP पेज-कैश लेखन (`esp6`) | पता लगाना + पूर्ण PoC |
| **CVE-2026-43500** | Dirty Frag — RxRPC पेज-कैश लेखन | पता लगाना + पूर्ण PoC |
| Copy Fail GCM वैरिएंट | xfrm-ESP `rfc4106(gcm(aes))` पेज-कैश लेखन | पता लगाना + पूर्ण PoC |
**बोनस मोड:**
- **`--scan --active`** — sentinel-STORE सक्रिय प्रोब। डिफ़ॉल्ट `--scan`
प्रति-CVE पूर्वशर्तें (कर्नेल, मॉड्यूल, LSM स्थिति) के साथ-साथ एक
Copy Fail प्रिमिटिव का सक्रिय प्रोब रिपोर्ट करता है। `--active` जोड़ने से
sentinel-फ़ाइल STORE प्रोब अन्य चारों प्रिमिटिव (ESP v4,
ESP v6, RxRPC, GCM) तक विस्तृत होता है: प्रत्येक `/tmp` sentinel के विरुद्ध
कर्नेल ट्रिगर चलाता है और केवल तभी VULNERABLE रिपोर्ट करता है जब मार्कर बाइट्स वास्तव में
पहुँचते हैं। यह पूर्ण exploit चलाए बिना backport-पैच किए गए
कर्नेल (पूर्वशर्तें असुरक्षित कहती हैं लेकिन प्रोब सुरक्षित कहता है) को
बिना-पैच वाले कर्नेल से अलग करने का एकमात्र तरीका है। `/etc/passwd` को
कभी स्पर्श नहीं किया जाता। V6 STORE शिफ्ट प्रति कर्नेल बिल्ड स्वतः कैलिब्रेट करता है।
- **`--exploit-backdoor`** — लगातार बना रहने वाला uid-0 बैकडोर: लंबाई-मिलान वाला
`/etc/passwd` में `nologin`/`false`/`sync` पंक्ति का अधिलेखन
`dirtyfail::0:0:<pad>:/:/bin/bash` के साथ। पेज निकाले जाने तक शेल से बाहर निकलने के बाद भी
बना रहता है। `--cleanup-backdoor` के लिए स्थिति `/var/tmp/.dirtyfail.state` पर
संग्रहीत होती है। `dirtyfail` उपयोगकर्ता नाम जानबूझकर
इस प्रोजेक्ट से मेल खाता है ताकि इसे किसी भी ऑडिट में तुरंत पहचाना जा सके —
यदि आपको अधिकृत red-team अभ्यास के लिए कोई अलग पहचानकर्ता चाहिए तो
`src/backdoor.c` में `NEW_USER` बदलें।
- **AppArmor बायपास** — Ubuntu की
`apparmor_restrict_unprivileged_userns=1` नीति को एकल-हॉप
`change_onexec("crun")` पुनः-निष्पादन के माध्यम से एक unconfined प्रोफ़ाइल में पराजित करता है जो
userns क्षमताएँ बनाए रखती है। प्रत्येक exploit मोड इसे
आंतरिक रूप से fork के माध्यम से संभालता है: पैरेंट init नेमस्पेस में रहता है, चाइल्ड
बायपास करतब करता है, पैरेंट वैश्विक पेज कैश पढ़ता है और REAL init-ns root के लिए
`su` चलाता है। विरासती `--aa-bypass` फ़्लैग अभी भी
बायपास तंत्र को अलग से डीबग करने के लिए मौजूद है। देखें [§8.5 आर्किटेक्चर](#85-architecture-outerinner-fork-based-bypass)।
## सत्यापित कार्यक्षमता
DIRTYFAIL को कई डिस्ट्रो और कर्नेल संस्करणों पर **अनुभवजन्य रूप से एंड-टू-एंड सत्यापित** किया गया है।
नीचे दिया गया मैट्रिक्स प्रत्येक डिस्ट्रो की नई स्थापना के विरुद्ध
प्रत्येक `--exploit-*` मोड चलाने के प्रति-मोड परीक्षण परिणाम
दर्शाता है।
| डिस्ट्रो | कर्नेल | LSM | Copy Fail | xfrm-ESP v4 | xfrm-ESP v6 | RxRPC | GCM | Backdoor | SU shellcode |
|---|---|---|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| Ubuntu 24.04 LTS | `6.8.0-111-generic` | AppArmor | 🛡² | ✅ | ✅ | ✅ | ✅¹ | ✅¹ | (परीक्षण नहीं किया गया) |
| Debian 13.4 | `6.12.86+deb13` | कोई नहीं | 🛡 | 🛡 | 🛡 | 🛡 | 🛡 | 🛡 | 🛡⁵ |
| AlmaLinux 10.1 | `6.12.0-124.8.1.el10_1` | SELinux | ✅ | ✅ | ✅ | ⏭³ | ✅ | ✅ | ✅ |
| Fedora 44 (Server) | `6.19.10-300.fc44` | SELinux | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Ubuntu 26.04 LTS | `7.0.0-15-generic` | AppArmor (सख्त) | 🛡 | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁵ |
**संकेत:** ✅ exploit पहुँचा और वास्तविक init-ns root उत्पन्न किया · 🛡 शमित — exploit कर्नेल बग तक नहीं पहुँच सकता (कर्नेल पैच किया गया या LSM अविशेषाधिकृत पथ को रोकता है) · ⏭ लागू नहीं (पूर्वशर्त गायब)
### सक्रिय-प्रोब सत्यापन (`--scan --active`)
`--active` फ़्लैग पता लगाने के दौरान प्रति CVE एक sentinel-फ़ाइल STORE प्रोब जोड़ता है
। हमने प्रोब आउटपुट को उपरोक्त समान 4 डिस्ट्रो के विरुद्ध सत्यापित किया
(Debian, Fedora, AlmaLinux, Ubuntu 26.04) — नीचे दिया गया मैट्रिक्स
प्रति-मोड प्रोब परिणाम दिखाता है और पूर्ण-exploit
वास्तविकता से एक-से-एक मेल खाता है:
| डिस्ट्रो | Copy Fail प्रोब | ESP v4 प्रोब | ESP v6 प्रोब | RxRPC प्रोब | GCM प्रोब |
|---|:-:|:-:|:-:|:-:|:-:|
| Debian 13.4 | अक्षत 🛡 | अक्षत 🛡 | अक्षत 🛡 | अक्षत 🛡 | अक्षत 🛡 |
| Fedora 44 | marker @0 ✅ | STORE @0 ✅ | STORE @8 ✅ | बाइट परिवर्तन ✅ | sentinel[0] 0x41→0x27 ✅ |
| AlmaLinux 10.1 | marker @0 ✅ | STORE @0 ✅ | STORE @8 ✅ | पूर्वशर्तें ⏭ | sentinel बदला ✅ |
| Ubuntu 26.04 | अक्षत 🛡 | LSM-अवरुद्ध 🛡 | LSM-अवरुद्ध 🛡 | LSM-अवरुद्ध 🛡 | LSM-अवरुद्ध 🛡 |
V6 प्रोब का STORE लैंडिंग ऑफ़सेट (Fedora और Alma पर 8) अनुभवजन्य
`V6_STORE_SHIFT` से मेल खाता है जिसे `calibrate_v6_shift()` रनटाइम पर
खोजता है — यह पुष्टि करता है कि स्वतः-कैलिब्रेशन पहले से
हार्ड-कोडित स्थिरांक को कर्नेल बिल्ड में सही ढंग से बदल देता है।
¹ GCM और Backdoor के लिए `algif_aead` लोड करने योग्य होना आवश्यक है। Ubuntu 24.04
`/etc/modprobe.d/disable-algif_aead.conf` भेजता है जो इसे Copy Fail शमन के रूप में
ब्लैकलिस्ट करता है। ब्लैकलिस्ट हटाए जाने पर (जैसे शमन से पहले के कर्नेल पर)
दोनों मोड एंड-टू-एंड काम करते हैं।
² Copy Fail का algif_aead पथ modprobe ब्लैकलिस्ट द्वारा शमित है;
कर्नेल में अंतर्निहित CVE प्रिमिटिव समान है चाहे
`authencesn` पहुँच योग्य हो या नहीं। xfrm-ESP, RxRPC, और GCM वैरिएंट सभी
उसी कर्नेल पर पहुँचते हैं क्योंकि वे algif_aead से नहीं जाते।
³ AlmaLinux 10 का `kernel-modules-extra` पैकेज डिफ़ॉल्ट रूप से
Minimal इंस्टॉल में स्थापित नहीं होता, इसलिए `rxrpc.ko` डिस्क पर गायब है।
EPEL या AlmaLinux extras रिपॉजिटरी से `kernel-modules-extra-$(uname -r)` स्थापित करने से
मॉड्यूल वापस आ जाता है; स्टॉक minimal इंस्टॉल पर RxRPC
अप्राप्य है।
⁴ **Ubuntu 26.04 LTS अविशेषाधिकृत शोषण को व्यापक रूप से रोकता है।**
शिप किया गया कर्नेल `7.0.0-15.15` (रिलीज़ 2026-04-22) **मेनलाइन पैच
`f4c50a4034e6` (विलय 2026-05-07) से ~2 सप्ताह पूर्व** का है — इसलिए
बग अभी भी कर्नेल में मौजूद है। Ubuntu की सुरक्षा
**AppArmor कड़ाई के माध्यम से रक्षा-गहराई** है, न कि कर्नेल पैच:
- `apparmor_restrict_unprivileged_userns=1` डिफ़ॉल्ट रूप से सक्षम है।
- `unshare(CLONE_NEWUSER)` पर, कर्नेल-स्तरीय AppArmor प्रवर्तन
किसी भी प्रोफ़ाइल (जिसमें `(unconfined)`-चिह्नित
जैसे `crun`, `chrome`, डिफ़ॉल्ट `unconfined` शामिल हैं) को स्वतः ही
`<profile>//&unprivileged_userns (mixed)` उप-प्रोफ़ाइल में स्थानांतरित कर देता है जिसमें
`audit deny capability` होता है। नए userns के अंदर uid 0 को कोई कैप नहीं मिलती।
- `change_onexec` किसी भिन्न प्रोफ़ाइल पर मदद नहीं करता — यहाँ तक कि
`crun` प्रोफ़ाइल (जिसमें स्पष्ट `userns,` अनुमति और
`flags=(unconfined)` है) भी unshare पर स्वतः स्थानांतरित हो जाती है। इसके माध्यम से सत्यापित
`aa-exec -p crun bash -c 'unshare -U -n cat /proc/self/attr/current'`
→ `crun//&unprivileged_userns (mixed)`।
- `newuidmap`/`newgidmap` (setuid root) सफलतापूर्वक uid_map लिखते हैं,
लेकिन `setresuid(0)` तब सफल होता है जबकि `ioctl(SIOCSIFFLAGS)` और
हर अन्य CAP_NET_ADMIN-गेटेड syscall EPERM लौटाता है क्योंकि
क्षमता अस्वीकृति प्रति-नेमस्पेस है, प्रति-uid नहीं।