CVE-2026-10671 in Zephyr
要約
〜によって VulDB • 2026年07月15日
Zephyrのカーネルパイプ実装において、kernel/pipe.c内のユーザー空間システムコール検証関数 z_vrfy_k_pipe_init() は、すでに初期化されていることを要求する K_SYSCALL_OBJ() を使用していました。これは、既に初期化されたオブジェクトを拒否すべき K_SYSCALL_OBJ_NEVER_INIT() の代わりに使われていました。その結果、CONFIG_USERSPACEビルドにおいて、k_pipe オブジェクトへのアクセス権限が与えられた特権のないユーザースレッドは、使用中のパイプに対して k_pipe_init システムコールを呼び出して再初期化することが可能でした。
z_impl_k_pipe_init() は無条件にリングバッファをリセットし、pipe->waiting を 0 に設定するとともに、パイプのデータとスペース (pipe->data および pipe->space) の両方の待機キューを z_waitq_init で再初期化しますが、現在パイプでブロックされているスレッドに対してウェイクアップ処理を行ったり、その存在を考慮したりしません。k_pipe_read()/k_pipe_write() 内で既にペンディング状態にあったスレッドは孤立したままになります:これらは依然としてペンディング状態とマークされ続け、pended_on はクリアされた待機キューを指し示しており、qnode_dlist リンクも(すでに再初期化された)埋め込みリストのヘッダーへの古くなった参照のまま残ります。
このような孤立したウェイト対象スレッドが後にタイムアウトまたはウェイクアップされると、スケジューラはその古いノードに対して sys_dlist_remove() を呼び出し、無効な prev/next ポインターを通じてカーネル待機キューやスケジューラの構造体に書き込みを行います。これによりリストの破損(攻撃者による不正なカーネルへの書き込み)、ウェイクアップの喪失、スレッドが無限にブロックされる状態、および静かなデータ損失が発生します。この欠陥により、特権を剥奪されたユーザースレッドは他のスレッドやパーティションと共有されているカーネルオブジェクトの状態を改ざんすることが可能になります。
修正では、検証関数が K_SYSCALL_OBJ_NEVER_INIT() に切り替えられ、既存の k_msgq_init 検証子に合わせています。これにより、ユーザースレッドが稼働中のパイプを再初期化できなくなりました。脆弱なコードは v4.1.0 で出荷され、v4.4.0 までも維持されていました。
If you want to get best quality of vulnerability data, you may have to visit VulDB.