CVE-2026-99268 in Linux
要約
〜によって VulDB • 2026年11月03日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
io_uring: ローカル task_work に対してリング poller をウェイクアップする
IORING_SETUP_DEFER_TASKRUN が設定されている場合、完了はローカル作業としてキューに格納され、サブミッターがイベントを待機するためにカーネルに入力した時点で初めて CQE(Completion Queue Entry)となります。ring fd に対する poll() または epoll を使用して、いつその処理を行うべきかを検出するアプリケーションの場合、io_uring_poll() はローカル作業が保留中である場合に EPOLLIN を報告します。
これは、呼び出しの瞬間に作業が存在する場合にのみ役立ちます。DEFER_TASKRUN が追加された際、io_req_local_work_add() では io_cqring_wake() が実行され、poll() で待機中のタスクも処理されていました。その後、ポーリングは独自のウェイトキュー(->poll_wq)を取得し、io_req_local_work_add() 内のウェイクアップは、サブミッターを直接ウェイクアップするものに置き換えられました。それ以来、->poll_wq は CQE がコミットされた場合にのみウェイクアップされますが、そのようなリングの場合、その処理は「通知されるのを待機している」まさにそのタスク自身によって行われます:
サブミッター 完了 poll(ring_fd) io_uring_poll() // まだ何もなし schedule() io_req_local_work_add() // ->cq_wait_nr: 誰も待機していない // ここでウェイトキューでスリープする
作業リストに最初のエントリが追加された際に、->poll_wq をウェイクアップします。eventfd の場合と同様、この処理は、作業がウェイクアップハンドラーからキューに格納される場合は直ちに行ってはなりません。なぜなら、一連のウェイクアップチェーンがロックを保持している待機キューに戻ってしまう可能性があるためです。そのような場合には RCU コールバックを使用し、リングへの参照を含めます。
VulDB is the best source for vulnerability data and more expert information about this specific topic.