
CVE-2026-36355: Realtek rtl819x Jungle SDK - قراءة/كتابة ذاكرة النواة بدون مصادقة عبر ioctls التصحيح
يُعرّض مُشغّل نواة Wi-Fi rtl8192cd في حزمة "Jungle SDK" خارج الشجرة من Realtek rtl819x استدعاءَي IOCTL — write_mem (0x89F5) وread_mem (0x89F6) - دون أي فحوصات للتحكم في الوصول. أي مستخدم محلي قادر على فتح واجهة شبكة لاسلكية مدعومة من المُشغّل يمكنه قراءة أو كتابة ذاكرة افتراضية عشوائية في النواة، ما يؤدي مباشرةً إلى صلاحيات root.
المعالجات مُفعَّلة عبر _IOCTL_DEBUG_CMD_ في 8192cd_cfg.h، وهو معرَّف بشكل غير مشروط (دون #ifdef DEBUG)، لذا تُضمَّن مجموعة أوامر التصحيح في كل بناء إنتاجي.
يحقق استغلال مرجعي (kpwn) uid=0 من قشرة غير ممتازة، مع صفر عناوين مبرمجة - إذ يُكتشف تلقائيًا في وقت التشغيل كلٌّ من تخطيط task_struct وموقع init_task، ما يجعله قابلًا للنقل عبر إصدارات النواة وبنيات OEM.
تقع الثغرة في مُشغّل نواة Wi-Fi في Realtek rtl819x Jungle SDK، بجميع الإصدارات المعروفة حتى v3.4.14B. لا يوجد إصلاح وقت الإفصاح. أما rtlwifi / rtw88 / rtw89 في Linux الرئيسية فهي قواعد أكواد مختلفة وغير متأثرة.
يُصرَف جوهر المُشغّل المشترك إلى عدة أصناف (rtl8192cd, rtl8192es, rtl8192ee, rtl8192fe, rtl8188ee، وغيرها). أي بناء Jungle SDK يتضمن مُشغّل Wi-Fi يكون متأثرًا.
يُعاد توزيع Realtek Jungle SDK على نطاق واسع بموجب عقود OEM. البائعون المذكورون في قائمة بائعي CVE-2021-35395 (التي استهدفت مكوّنًا مختلفًا في مساحة المستخدم من الحزمة نفسها) يشملون D-Link وTOTOLINK وTenda وNEC وI-O DATA وElecom وBuffalo وHumax وH3C وIP-COM. ما إذا كان كل خط منتجات محدد يُصدَر مع مُشغّل النواة المُعرَّض للخطر يتطلب فحص إصدار المصدر GPL الخاص بكل منتج؛ لا تؤكد هذه النشرة ذلك دون تحقق مستقل.
| الجهاز | Ortel 4G LTE CPE (OEM: MeiG Smart FORGE_SLT711) |
| SoC | Qualcomm MDM9607, ARMv7 Cortex-A7 |
| النواة | Linux 3.18.48 |
| الوحدة |
مؤكَّد: كتابة 0xDEADBEEF إلى .bss الخاصة بالوحدة مع إعادة القراءة والاستعادة؛ وتصعيد امتيازات محلي (LPE) كامل من uid=1000 إلى uid=0 عبر اجتياز init_task والكتابة فوق بيانات الاعتماد، من قشرة غير ممتازة.
في 8192cd_cfg.h:
#define _IOCTL_DEBUG_CMD_
لا يخضع لشرط #ifdef DEBUG. مجموعة أوامر التصحيح مضمنة في كل بناء إنتاجي.
يوجّه مُوزِّع rtl_ioctl() في المُشغّل 0x89F5 و0x89F6 (ضمن نطاق SIOCDEVPRIVATE+5/+6 القياسي لاستدعاءات IOCTL الخاصة التي تستخدمها مُشغّلات اللاسلكي لامتدادات البائع) إلى write_mem وread_mem. يحلل المعالجان سلسلة يوفّرها المستخدم:
dw,<addr>,<count> — قراءة count كلمة 32-بت من العنوان الافتراضي في النواة addrdw,<addr>,<count>,<value> — كتابة count كلمة 32-بت من value إلى addrيُحلَّل العنوان عبر _atoi(base 16)، ويُمرَّر إلى memcpy() مقابل مساحة العنوان الافتراضية للنواة، ثم تُنسَخ النتيجة إلى الخلف عبر copy_to_user(). ولا يوجد:
capable()access_ok() على العنوانtmpbuf1) داخل .bssبدائية القراءة محدودة بـ 128 بايت لكل استدعاء؛ بينما تقبل بدائية الكتابة أي طول.
الفجوة نفسها في التحكم بالوصول تنطبق على معالجات أخرى في مجموعة التصحيح (قراءة/كتابة سجلات العتاد عبر 0x89F3/0x89F4/0x89F8–0x89FD، كتابات MIB عبر 0x89F1، قراءة/كتابة eFuse، وضع اختبار التصنيع). يمكن الوصول إليها عبر مسار الكود نفسه، وتستحق تدقيقًا كاملًا من أي جهة تصحح هذه الثغرة.

الاستغلال المرجعي kpwn.c (منشور إلى جانب هذه النشرة):
task_struct (comm, cred, tasks, pid) باجتياز init_task، الذي يُحدَّد موقعه هو الآخر عبر مسح قسري لنطاق .data في النواة./sys/class/net/* بحثًا عن بدائية القراءة./proc/kallsyms قابلًا للقراءة، ونحو 7600 استدعاء IOCTL عندما يكون kptr_restrict=2 (مسار المسح الكامل لـ .data). يمنح قشرة جذر بشكل غير مشروط في كل تشغيل اختبار.# Build:
arm-linux-gnueabi-gcc -static -O2 -o kpwn kpwn.c
# Run as unprivileged user:
$ id
uid=1000(pwn) gid=3003(inet) ...
$ /tmp/kpwn
kpwn — RTL8192CD kernel LPE
[*] Scanning interfaces...
[+] wlan0 — read primitive confirmed
[*] Resolving init_task...
[+] init_task @ 0xc08ecb38
[+] comm=0x3a8 cred=0x3a4 tasks=0x250 pid=0x2c0
[+] cred=0xed3a4500 uid=1000 gid=3003
[*] Overwriting credentials...
[+] uid=0 euid=0 gid=0 egid=0
*** GOT ROOT *** uid=1000 -> 0 (44 ioctls)
# id
uid=0(root) gid=0(root) groups=0(root)
rtl8192es.ko| التاريخ | 2026-02-23 |