
تنفيذ بلغة Go لثغرة dirtyfrag (CVE-2026-43284 / CVE-2026-43500)
خطأان. شيل واحد. لا كتابة على القرص.
نسخة Go من dirtyfrag (CVE-2026-43284 / CVE-2026-43500).
فئة الخطأ تكمن في نظام XFRM الفرعي في نواة لينكس. عندما يتم تمرير صفحة ملف عبر splice() إلى أنبوب (pipe) ثم إلى مقبس مشفّر بـ ESP، تقوم النواة بفك تشفير حمولة ESP في مكانها - مباشرةً إلى صفحة ذاكرة التخزين المؤقت للصفحات (page cache) الخاصة بالملف المصدر. الملف للقراءة فقط. أما ذاكرة التخزين المؤقت للصفحات فلا.
يربط dirtyfrag بين خطأين مستقلين يستغلان هذه الأولية:
CVE-2026-43284 - مسار ESP/XFRM
يُثبّت 48 SA في وضع النقل عبر NETLINK_XFRM. كل SA يُرمّز 4 بايتات من حمولة الشيلكود في حقل seq_hi لحالة إعادة التشغيل ESN الخاصة به. سلسلة vmsplice + splice تُطلق فك تشفير ESP في المكان لكل SA، فتُكتب تلك البايتات الأربعة إلى إدخال صفحة /usr/bin/su في ذاكرة التخزين المؤقت. 48 إطلاقًا، 192 بايتًا مكتوبًا، دون حالة سباق.
CVE-2026-43500 - مسار RxRPC/rxkad
يكسر 3 مفاتيح جلسة PCBC(fcrypt) دون اتصال تُنتج تسلسلات البايت المطلوبة عند فك تشفيرها. يُطلق مشغّل مقبس AF_RXRPC لكل مفتاح لتعديل الإدخال الجذري في /etc/passwd إلى root::0:0 (nullok). بعدها يقبل su - كلمة مرور فارغة.
كلا المسارين يعملان ضمن مساحة أسماء للمستخدم والشبكة (CLONE_NEWUSER | CLONE_NEWNET) لتجنب الحاجة إلى CAP_NET_ADMIN على المضيف.
go build -o dirtyfrag-go .
./dirtyfrag-go
# Force a specific path
./dirtyfrag-go --force-esp
./dirtyfrag-go --force-rxrpc
# Verbose output
./dirtyfrag-go -v
يحاول الثنائي مسار ESP أولاً. إذا لم يتم تعديل /usr/bin/su بعد ذلك، يتراجع إلى مسار RxRPC (حتى 3 محاولات). عند النجاح، يفتح شيل جذر عبر PTY جديدة.
يلمس الاستغلال ذاكرة التخزين المؤقت للصفحات فقط. الملفات الثنائية على القرص و/etc/passwd لا تُمس. تستعيد إعادة التشغيل كل شيء. لإخلاء الذاكرة فورًا دون إعادة تشغيل:
echo 1 | tee /proc/sys/vm/drop_caches
esp4, esp6 (مسار ESP) و/أو rxrpc (مسار RxRPC)جميع النوى قبل التصحيحات:
rmmod esp4 esp6 rxrpc
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' \
> /etc/modprobe.d/dirtyfrag.conf
بيئة تشغيل Go متعددة الخيوط منذ البداية، لذا فإن unshare(CLONE_NEWUSER) غير مسموح. تعيد نسخة Go تنفيذ نفسها كعملية فرعية مع ضبط SysProcAttr.Cloneflags، والذي يستدعي clone() قبل تهيئة بيئة تشغيل Go.
| C (الأصل) | Go |
|---|
| التبعيات الخارجية | لا شيء | لا شيء |
| ملف واحد | لا | لا |
| ثنائي ثابت | نعم | نعم |
| مسار RxRPC | نعم | نعم |
| مسار ESP | نعم | نعم |
| عزل مساحات الأسماء | unshare() | إعادة تنفيذ مع Cloneflags |