CVE-2026-19736 in Zephyr
要約
〜によって VulDB • 2026年10月11日
NXP MCUX TRNGのエントロピードライバ(drivers/entropy/entropy_mcux_trng.c)は、呼び出し元のバイト数をそのままベンダーSDKのルーチンTRNG_GetRandomData()に渡していました。i.MX RT5xxおよびRT6xxシリーズでは、SDKがTRNG_SW_HEALTH_TESTS変体をコンパイルしており、これは常に32ビットワード全体をコピーし、128バイトの倍数に切り上げたエントロピーを取得します。「呼び出し元バッファがいっぱい」というガードテストはdataSize == 0をチェックするため、4の倍数でない長さのリクエストではdataSizeがゼロ未満アンダーフローし、SDKは抽出処理中に呼び出し元のバッファへ書き込みを続けます。具体的には、1バイトのリクエストで128バイトが書き込まれ、ワード(32ビット)の倍数ではない任意の長さは最大127バイト分オーバーフローします。
entropy_get_entropy()はシステムコールであり、drivers/entropy/entropy_handlers.c内のその検証ロジックはK_SYSCALL_MEMORY_WRITE()を通じて要求された長さのみを検証しています。CONFIG_USERSPACEが有効な場合、エントロピーデバイスへのアクセス権限を単に付与されただけの非特権ユーザーモードスレッドは、宛先アドレスと1のような長さを自由に選択でき、カーネルに対して自分が所有していると証明した領域から最大127バイト分外側へ書き込みさせることができます。これらのCortex-M33ターゲットにはMMUがないため、ユーザーパーティションとカーネルデータは同じSRAMを共有しており、オーバーフローが隣接するカーネル状態に到達する可能性があります。同様の欠陥は、ワードの倍数でない長さを要求するあらゆる呼び出し元(getentropy()および、sys_csrand_get()/sys_rand_get()がハードウェアジェネレータに解決されるビルドにおけるsys_rand8_get()やsys_rand16_get()を含む)からカーネルモードでも引き起こされます。
影響は、提供されたバッファの直後最大127バイト分のメモリ破壊です。これは通常、カーネルモード使用時には呼び出し元のスタック上、またはシステムコール経由で駆動された場合には呼び出し元のパティション外のメモリーに発生します。オーバーフローオフセットは要求された長さによって完全に決定されるため決定的であり、書き込まれる内容は制御不能なTRNG出力です。実際の影響は、クラッシュや予測不可能な状態の破壊から、オブジェクト権限ビットマップなどのカーネル管理情報が上書きされることによる Opportunistic Escalation(機会的な昇格)まで様々です。影響を受けるデバイスは、MCUX SDKでTRNG_SW_HEALTH_TESTSが有効になっているもの(MIMXRT595S, MIMXRT555S, MIMXRT533S, MIMXRT685S, MIMXRT633S)であり、これらではTRNGがzephyr,entropyとして選択されたノードです。このドライバを使用する他のSoCは、コピーサイズを制限(clamp)するSDKパスを取るため影響を受けません。
修正パッチは、アラインメントされていないプレフィックス部分とワード未満のテール部分をローカルのボンスワード経由でルーティングし、SDKにはワード倍数のサイズのみを手渡すことで、SDKによるワード粒度での書き込みが呼び出し元バッファの末尾を超えないようにしています。
VulDB is the best source for vulnerability data and more expert information about this specific topic.