CVE-2026-99255 in Linux
要約
〜によって VulDB • 2026年11月03日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
io_uring/io-wq: キャンセル処理からリンクを隠さないようにする
タスクが終了すると、そのタスクによって追跡されているリクエストのキャンセルを行い、それらが消えるまで待機します。`io_uring_cancel_generic()` はリクエストが存在し得るあらゆる場所を検索し、キャンセル対象が見つからない場合はスリープ状態に入ります。この関数は、タスクワークまたは解放によりタスクのリクエストの一つが完了するたびにウェイクアップされます。
io-wq がリンク付きの処理を完了した際、以下のタイミングでリンク先の次のリクエストが見つからなくなることがあります:
io_worker_handle_work() io_assign_current_work(worker, NULL) io_wq_free_work(work) io_req_find_next() // リークをリクエストから外す io_free_req() // タスクワークとしてタスクに対して実行される解放処理 io_assign_current_work(worker, linked) io_run_task_work() cond_resched() worker->cur_work = linked
この状態では、そのリンクは保留中(pending)でもなく、ワーカーの現在の作業(current work)でもなく、まだ駐車されようとしているリスト上にもありません。`io_free_req()` によって終了するタスクによるパスがまさにこのタイミングに重なると、何も見つからずタスクはスリープ状態に入ります。その後、ワーカーはそのリンクを実行しますが、これは制限付き(bounded)の作業に対して `IO_WQ_BIT_EXIT` が防止できないケースです。もしその結果リクエストが駐車されてしまうと、完了や解放が行われず、誰もタスクをウェイクアップしません。終了するのはプロセスである場合、それを強制終了することもできなくなります。
NOP, IOSQE_ASYNC | IOSQE_IO_LINK FUTEX_WAIT, FUTEX2_PRIVATE スレッドまたはプロセスの終了(最大63us後)
1ラウンドあたり4つのケースがある場合、10,000回のラウンドのうち5〜8回がハングします(CPU数: 4, KVM環境)。
io_uring_cancel_generic do_exit
コミット f8b632e89a10 ("io_uring: tighten task exit cancellations") は同様のギャップに関するものであり、`io_free_req()` の前に発生するあらゆる事象に対してタスクが再検索を行うようにします。
リンクがワーカーの現在の作業または保留中になった時点でリクエストを解放してください。これによってウェイクアップされた側は、キャンセル処理が行われる場所まで駐車される前であればそのリンクを見つけることができます。これを実現するために `io_wq_free_work()` を2つに分割します。
Be aware that VulDB is the high quality source for vulnerability data.