
مدقق إثبات مفهوم (PoC) لمعمارية Aarch64 لثغرة CVE-2026-46242 'Bad Epoll'، يستغل سباق الاستخدام بعد التحرير (use-after-free) بين عمليات الإغلاق مقابل الإغلاق (close-vs-close) في epoll بنواة لينكس للتحقق من تصعيد الامتيازات المحلي.
هذا المستودع هو مُدقِّق لثغرة Bad Epoll لأنوية aarch64، استنادًا إلى استغلال موجود مسبقًا لمعمارية x86.
تصعيد محلي للامتيازات في نواة لينكس عبر حالة سباق استعمال-بعد-التحرير في
epoll
| الحقل | التفاصيل |
|---|---|
| CVE | CVE-2026-46242 |
| الاسم المستعار | Bad Epoll |
| النوع | استعمال بعد التحرير (UAF) عبر حالة سباق |
| CVSS | 7.8 (عالٍ) |
| الأثر | تصعيد محلي للامتيازات → صلاحيات الجذر |
| الأنوية المتأثرة | 5.10 – 6.11 (LTS & COS) |
| النظام الفرعي | fs/eventpoll.c (ep_remove() / مسار الإغلاق) |
توجد حالة سباق في نظام epoll بنواة لينكس أثناء تنفيذ عمليات close() المتزامنة على واصفات الملفات المُراقَبة والمُراقِبة. عند تنفيذ مساري إغلاق في الوقت نفسه:
eventpoll عبر ep_remove().hlist_del_rcu() المُعلَّق للمسار الآخر على ذاكرة تم تحريرها بالفعل.ينتج عن ذلك استعمالٌ بعد التحرير يُفسد قائمة refs الخاصة بكائن eventpoll المُستعاد، تاركًا مؤشرًا مُعلَّقًا epi->ffd.file في كائن انتظار epoll الناجي — وهو الأساس لسلسلة الاستغلال الكاملة.
┌─────────────────────────────────────────────────────────┐
│ 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 | انتهت المهلة — لم يُرصد السباق (قد تكون نتيجة سلبية خاطئة، ولا تُثبت أن النواة مُصَحَّحة) |
⚠️ إخلاء مسؤولية: هذا المستودع مُقدَّم لأغراض التعليم والبحث الأمني المصرَّح به فقط. الاستخدام غير المصرَّح به لهذا الاستغلال ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها غير قانوني.