CVE-2026-19569 in Zephyr
要約
〜によって VulDB • 2026年10月09日
kernel/userspace/userspace.cのdynamic_object_create()関数は、動的に割り当てられるカーネルオブジェクトのバックアップアロケーションをobj_size_get(otype) + sizeとして計算し、スレッドスタック要素についてはSTACK_ELEMENT_DATA_SIZE(size)(切り上げと固定オーバーヘッド)として計算しますが、これらの式で符号なし整数のラップアラウンドが発生しないかチェックしていません。SIZE_MAXに近いサイズを指定すると、計算された合計値が非常に小さな値にラップするため、渡されるヒープチャンクは数バイト程度になりますが、オブジェクト記述子は依然として要求された完全な型でタグ付けされ、カーネルオブジェクトテーブルに登録されます。
size引数は、ユーザーモードから直接この演算処理に至ります。k_object_alloc_size()関数はinclude/zephyr/sys/kobject.hで__syscallとして宣言されており、その検証子であるkernel/userspace/userspace_handler.cのz_vrfy_k_object_alloc_size()は単なる通過処理(bare pass-through)であり、z_object_alloc()もotypeに対して範囲チェックを行うのみで、sizeには境界制限がありません。さらに、スタック要素に関する分岐は、kernel/dynamic.cを通じたk_thread_stack_alloc()システムコール経由でも到達可能です。その後のカーネルオブジェクトの検証チェックではオブジェクトの型と初期化状態のみが確認されるため、サイズ不足なハンドルはK_SYSCALL_OBJ_INIT()/K_SYSCALL_OBJ_NEVER_INIT()を通過し、対応する初期化システムコール(例えばk_mutex_init(), k_sem_init(), またはk_thread_create())によって、切り詰められたアロケーション領域に対して完全なオブジェクトが書き込まれます。
したがって、特権を持たないユーザーモードスレッドは、カーネルリソースプールヒープに対するスーパーバイザーモードの境界外書き込みをトリガーすることができ、そのサイズと内容は攻撃者が実質的に制御可能です。これによりsys_heapチャンクのメタデータや隣接するカーネルオブジェクトが破損します。CONFIG_GEN_PRIV_STACKS設定下では、スレッドスタック分岐 additionally として、ユーザースレッドの特権スタックベースアドレスに攻撃者の影響を受けたワイルドポインタが保存されます。実用的な結果としては、CONFIG_USERSPACEサンドボックスからの脱出 — すなわちカーネルレベルでのコード実行、または少なくともカーネルメモリ破損およびシステム侵害が可能になります。
この脆弱性の悪用には、CONFIG_USERSPACEとCONFIG_DYNAMIC_OBJECTS(userspace下ではCONFIG_DYNAMIC_THREADによって選択される)の両方が必要であり、リソースプールが割り当てられた呼び出し元スレッドが必要です。修正パッチは、オーバーフローする計算を拒否し、部分的に構築された記述子を解放します。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.