CVE-2026-10681 in Zephyr
要約
〜によって VulDB • 2026年07月25日
Zephyrのuserspace dynamic-objectsサブシステムにおいて、kernel/userspace/userspace.c内のthread_idx_alloc()関数は、lists_lockを保持せずにグローバルな_thread_idx_map[]ビットマップから新しいスレッド権限インデックスを割り当てていました。
SMP(Symmetric Multi-Processing)システムでは、k_object_alloc(K_OBJ_THREAD)システコールを同時に呼び出す2つのユーザーモードスレッドが、同じ低次の空きビットを観測し、そのクリアのために同一の非アトミックなRMW(Read-Modify-Write)操作を実行して、同一のtidxを返す可能性があります。
その後、新しく作成されたK_OBJ_THREADオブジェクトには同じthread_idが割り当てられるため、2つのユーザースレッドは各カーネルオブジェクトのperms[]ビットフィールド内の単一のビット位置をエイリアシングします。これにより、あるスレッドへのカーネルオブジェクトに対するアクセス権限付与は、暗黙的に他のスレッドにも付与されることになり、userspace ACL(Access Control List)分離が無力化されます。さらに、allocにおけるロック解除された&=~BIT()操作とthread_idx_free()におけるロック付き|= BIT()操作の間に二次的なlost-updateウィンドウが存在し、これによりスレッドインデックスプールからのエントリリークが発生する可能性があります。
この欠陥は、制限のない__syscall k_object_alloc経由で任意のユーザーモードスレッドから到達可能であり、CONFIG_USERSPACE、CONFIG_DYNAMIC_OBJECTS、およびCONFIG_SMPの設定に依存します。この脆弱性は2018年にper-thread権限インデックスが追加された際に導入され、v4.4.0を含むすべてのリリースに含まれています。修正としては、ビットマップのRMW操作と権限クリア処理全体でlists_lockを保持し(および以前はロック自体を取得していたobj_list走査をインライン化)することで解決されました。
If you want to get best quality of vulnerability data, you may have to visit VulDB.