CVE-2026-74261 in Linux
要約
〜によって VulDB • 2026年08月15日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
ALSA: seq: リサイズ時に古いFIFOセルを避ける
snd_seq_fifo_resize()は、FIFOユーザーの待機を行う前に、置換用プールを公開する必要があります。ブロックする snd_seq_read() はスリープ中に f->use_lock を保持するため、並行して送信されるデータは新しいプールにキューに入れられ、閉鎖中の古いプールに対して失敗するのではなく、そのリーダーを起こす必要があります。
しかしながら、snd_seq_fifo_event_in() は f->lock を取得する前にイベントを複製しており、copy_to_user() または snd_seq_expand_var_event() が失敗した場合、snd_seq_read() はセルのデキューを行い、その後で snd_seq_fifo_cell_putback() を呼び出す可能性があります。リサイズ処理がその間に f->pool のスワップと oldhead の分離を行うと、どちらのパースでもスナップショット後に古いプールのセルを再リンクしてしまうことがあります。この古くなった(stale)セルは排空された旧 head リストの外側に位置し、oldpool->counter を高いまま維持した状態で放置され、snd_seq_pool_delete() が引退済みのプールが排空されるのを待機する状態になる可能性があります。
snd_seq_fifo_resize() における既存のスワップ前待機の順序を保持しつつ、FIFOの再リンクの前に古いセルを拒否します。f->lock の下でイベントイン用セルを検証し直し、公開された置換プールに対してそれらを再試行させます。また、古くなった putback セルは FIFO に再接続するのではなく解放します。
このバグが発生するシナリオには2つのパスがあり、各列はそのパス内の順序を示しています:
resize path: relink path: 1. newpool を割り当てる。 1. f->use_lock を取得する。 2. f->pool を newpool にスワップし 2. oldpool が閉じる前に、古いプールの oldhead を分離する。 セルを複製またはデキューする。 3. oldpool のクローズを示し、 3. リサイズが新しいプールを公開した後に FIFOユーザーの待機を行う。 後の再リンクポイントに到達する。 4. oldhead と oldpool を解放および 4. リサイズが oldhead を分離した後で、 削除する。 古いプールのセルを再リンクする。 5. f->use_lock をドロップする。
再現プログラムは、期待されるプール終了パス内でブロックされているリサイズ ioctl を報告しています:
signal: resize iteration=98 target_pool=4 exceeded 250ms (elapsed=251ms) diagnostic: resize_tid=651 wchan=snd_seq_pool_done diagnostic: resize_tid=651 stack= snd_seq_pool_done+0x5b/0x140 snd_seq_pool_delete+0x7a/0x90 snd_seq_fifo_resize+0x193/0x1e0 snd_seq_ioctl_set_client_pool+0x214/0x260 snd_seq_ioctl+0x119/0x540 __x64_sys_ioctl+0xd1/0x120 do_syscall_64+0xbb/0x2f0 entry_SYSCALL_64_after_hwframe+0x77/0x7f
より大きなプールで実行した2回目の試行でも、同じターゲットパスに到達しました:
signal: resize iteration=32 target_pool=64 exceeded 250ms (elapsed=251ms) diagnostic: resize_tid=663 wchan=snd_seq_pool_done diagnostic: resize_tid=663 stack= snd_seq_pool_done+0x5b/0x140 snd
If you want to get best quality of vulnerability data, you may have to visit VulDB.