
Aarch64 प्रूफ-ऑफ-कॉन्सेप्ट चेकर CVE-2026-46242 'Bad Epoll' के लिए, जो Linux कर्नेल की epoll close-vs-close use-after-free रेस को ट्रिगर करके स्थानीय विशेषाधिकार वृद्धि (local privilege escalation) को सत्यापित करता है।
यह रिपॉजिटरी aarch64 कर्नेल के लिए एक bad Epoll वैलिडेटर है, जो x86 के लिए पहले से मौजूद एक्सप्लॉइट पर आधारित है।
epollUse-After-Free रेस कंडीशन के माध्यम से Linux कर्नेल स्थानीय विशेषाधिकार वृद्धि
| फ़ील्ड | विवरण |
|---|---|
| CVE | CVE-2026-46242 |
| उपनाम | Bad Epoll |
| प्रकार | रेस कंडीशन के माध्यम से Use-After-Free (UAF) |
| CVSS | 7.8 (उच्च) |
| प्रभाव | स्थानीय विशेषाधिकार वृद्धि → रूट |
| प्रभावित कर्नेल | 5.10 – 6.11 (LTS & COS) |
| सबसिस्टम | fs/eventpoll.c (ep_remove() / क्लोज़ पथ) |
Linux कर्नेल के epoll सबसिस्टम में, मॉनिटर किए जा रहे और मॉनिटरिंग फ़ाइल डिस्क्रिप्टरों पर समवर्ती close() संचालन के दौरान एक रेस कंडीशन मौजूद है। जब दो क्लोज़ पथ एक साथ निष्पादित होते हैं:
ep_remove() के माध्यम से eventpoll ऑब्जेक्ट को मुक्त (free) करता है।hlist_del_rcu() राइट पहले से मुक्त मेमोरी पर पहुँचता है।इससे एक Use-After-Free उत्पन्न होता है जो पुनः प्राप्त (reclaimed) eventpoll की refs सूची को दूषित कर देता है, जिससे बचे हुए epoll वेटर में एक डैंगलिंग epi->ffd.file पॉइंटर रह जाता है — यही पूरी एक्सप्लॉइट श्रृंखला का आधार है।
┌─────────────────────────────────────────────────────────┐
│ 1. KASLR Leak (prefetch side-channel via libxdk) │
├─────────────────────────────────────────────────────────┤
│ 2. Race Trigger (close-vs-close UAF on eventpoll) │
│ ├─ Adaptive timer: stat/exec phases calibrate ahead │
│ ├─ False-sharing: dup()+close() widens race window │
│ └─ Oracle: EPOLL_CTL_ADD depth-3 → ELOOP? │
├─────────────────────────────────────────────────────────┤
│ 3. Reclaim (freed eventpoll → ep_uaf_target) │
│ └─ Dangling epi->ffd.file in ep_uaf_waiter │
├─────────────────────────────────────────────────────────┤
│ 4. Cross-Cache (filp slab → buddy → pipe_buffer) │
│ ├─ Drain per-CPU partial list │
│ ├─ Free enclosing objects → slab page freed │
│ └─ Reclaim as pipe pages (256 × 4 KiB) │
├─────────────────────────────────────────────────────────┤
│ 5. Constrained AAR (fdinfo ino:/sdev: as read oracle) │
│ ├─ Fake file spray tiles forged struct file in pipe │
│ ├─ 8B read: ino: ← i_ino at controlled offset │
│ ├─ 4B read: sdev: ← sigaltstack(sas_ss_sp) cursor │
│ └─ Walk: init_task → find exploit task → resolve │
│ files → fdt → fd[] → pipe_buffer → struct page │
├─────────────────────────────────────────────────────────┤
│ 6. RIP Control (f_op→poll hijack → JOP → ROP) │
│ ├─ Forge f_op = virt, f_count = virt - 1 │
│ ├─ JOP pivot chain lands rsp on controlled page │
│ └─ libxdk ROP: commit_creds(init_cred) + ns switch │
├─────────────────────────────────────────────────────────┤
│ 7. Ret2Usr execve("/bin/bash") as root │
└─────────────────────────────────────────────────────────┘
# aarch64 (cross-compile or native)
aarch64-linux-gnu-gcc -O2 -Wall -pthread -march=armv8-a \
race_check_aarch64.c -o race_check
./race_check [timeout_seconds] # default: 300s (5 min)
./race_check 120 # 2-minute timeout
| कोड | अर्थ |
|---|---|
0 | रेस जीत गया — कर्नेल भेद्य है |
1 | टाइमआउट — रेस का पता नहीं चला (संभावित गलत-नकारात्मक, यह साबित नहीं करता कि कर्नेल पैच किया गया है) |
⚠️ अस्वीकरण: यह रिपॉजिटरी केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान की गई है। उन सिस्टमों के विरुद्ध इस एक्सप्लॉइट का अनधिकृत उपयोग, जिनके आप स्वामी नहीं हैं या जिनके परीक्षण की आपको स्पष्ट अनुमति नहीं है, अवैध है।