
تصحيح نواة لثغرة Dirty Frag (CVE-2026-43284, CVE-2026-43500)
سلسلة تصحيحات لفئة الثغرة Dirty Frag التي اكتشفها Hyunwoo Kim (@v4bel).
تسمح Dirty Frag لمستخدم محلي غير مميز بالكتابة فوق بايتات عشوائية من ذاكرة التخزين المؤقت للصفحات (page cache) للملفات القابلة للقراءة فقط (مثل /usr/bin/su و /etc/passwd) مما يؤدي إلى تصعيد الامتيازات المحلية إلى صلاحيات الجذر (root) على جميع توزيعات لينكس الرئيسية.
التصحيحات في هذا المستودع لم تُكتب بواسطة مُشرف هذا المستودع.
- CVE-2026-43284 (تصحيح ESP): من تأليف Hyunwoo Kim (@v4bel) و Kuan-Ting Chen. تم دمجه في النواة الرئيسية للينكس في الالتزام
f4c50a4034e6.- CVE-2026-43500 (تصحيح RxRPC): من تأليف Hyunwoo Kim (@v4bel). تم إرساله إلى القائمة البريدية netdev في
afKV2zGR6rrelPC7@v4bel، بانتظار الدمج.هذا المستودع هو نسخة منسقة من تلك التصحيحات، تم جمعها هنا للراحة بصيغة جاهزة لـ
git am. كل الفضل يعود للمؤلفين الأصليين. البحث الأصلي وPoC: https://github.com/V4bel/dirtyfrag
4.10 (الالتزام cac2661c53f3، 2017-01-17) حتى 6.x قبل f4c50a4034e66.4 (الالتزام 2dc334f1a63a، 2023-06-08) حتى أحدث إصدار (لا يوجد تصحيح مدمج بعد)git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
# تطبيق التصحيح 1 (ESP — CVE-2026-43284)
git am 0001-net-xfrm-fix-page-cache-write-via-esp-splice-CVE-2026-43284.patch
# تطبيق التصحيح 2 (RxRPC — CVE-2026-43500)
git am 0002-net-rxrpc-fix-page-cache-write-via-rxkad-splice-CVE-2026-43500.patch
patch (إذا فشل git am بسبب انحراف السياق)patch -p1 < 0001-net-xfrm-fix-page-cache-write-via-esp-splice-CVE-2026-43284.patch
patch -p1 < 0002-net-rxrpc-fix-page-cache-write-via-rxkad-splice-CVE-2026-43500.patch
إذا لم تتمكن من تطبيق التصحيح فورًا، قم بحظر الوحدات المعرضة للخطر:
sudo sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' \
> /etc/modprobe.d/dirtyfrag.conf && \
rmmod esp4 esp6 rxrpc 2>/dev/null; \
echo 3 > /proc/sys/vm/drop_caches"
تحذير: إزالة
esp4/esp6تعطل IPsec ESP. قم بتقييم التأثير قبل التطبيق على أنظمة الإنتاج.
يشترك كلا النوعين في نفس السبب الجذري: مسار splice() بنسخ صفري في النواة يضع صفحة ذاكرة تخزين مؤقت للصفحات قابلة للقراءة فقط مباشرة في جزء skb دون دلالات النسخ عند الكتابة (copy-on-write). عمليات التشفير اللاحقة في المكان (in-place) تكتب بعد ذلك في تلك الصفحة، مما يعدّل محتوى الملف المخزن مؤقتًا بشكل دائم.
splice(file_fd → pipe → socket)
│
▼
skb->frags[0].page = &page_cache_page_P <- لا يوجد CoW!
│
▼
[esp_input / rxkad_verify_packet_1]
فك تشفير AEAD/fcrypt في المكان src == dst == &P
│
▼
STORE إلى page_cache_page_P <- كتابة عشوائية إلى ذاكرة تخزين ملف للقراءة فقط
| الملف | CVE | النظام الفرعي | الحالة |
|---|
0001-net-xfrm-fix-page-cache-write-via-esp-splice-CVE-2026-43284.patch | CVE-2026-43284 | net/ipv4/esp4.c, net/ipv6/esp6.c, net/ipv4/ip_output.c, net/ipv6/ip6_output.c | ✅ مدمج في النواة الرئيسية (f4c50a4034e6) |
0002-net-rxrpc-fix-page-cache-write-via-rxkad-splice-CVE-2026-43500.patch | CVE-2026-43500 | net/rxrpc/call_event.c, net/rxrpc/conn_event.c | ⏳ تم إرساله إلى القائمة البريدية netdev (afKV2zGR6rrelPC7@v4bel)، بانتظار الدمج |
| النوع | النهج |
|---|
| ESP | وضع علامة على أجزاء splice بـ SKBFL_SHARED_FRAG؛ والتحقق من هذه العلامة في esp_input()/esp6_input() لفرض skb_cow_data() قبل التشفير في المكان |
| RxRPC | توسيع بوابة skb_cloned() إلى (skb_cloned(skb) || skb->data_len) بحيث يتم دائمًا نسخ skbs غير الخطية (التي قد تحتوي على أجزاء splice) قبل فك التشفير في المكان |