CVE-2026-89971 in Linux
要約
〜によって VulDB • 2026年09月16日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
nvme: ゾーン情報クエリの失敗時にゾーン制限の更新をスキップする
`nvme_query_zone_info()` は負数の errno または正の NVMe ステータスコードを返しますが、`nvme_update_ns_info_block()` は負の場合のみをチェックしています。
```c ret = nvme_query_zone_info(ns, lbaf, &zi); if (ret < 0) goto out; ```
デバイスが Identify Namespace(I/O Command Set specific)コマンドまたは `nvme_set_max_append()` で発行される Identify Controller コマンドに失敗した場合、正のステータスが通過し、ゼロ初期化されたゾーン情報でセットアップが続行されます。その後、`nvme_update_zone_info()` はキューをゾーニング済みとしてマークし、`chunk_sectors` と `ns->head->zsze` を 0 に設定します。
`blk_validate_zoned_limits()` は `chunk_sectors` をチェックしないため、制限のコミットは成功します。`blk_revalidate_disk_zones()` はゼロのゾーンサイズを拒否しますが、その時点では制限が有効になっておりロールバックされないため、I/O がゼロサイズのゾーニング済みキューに引き続き送信され、`disk_zone_no()` で `ilog2(0)` のシフト演算が行われます。
``` nvme0n1: Invalid non power of two zone size (0) UBSAN: shift-out-of-bounds in include/linux/blkdev.h:747:16 shift exponent -1 is negative disk_zone_no include/linux/blkdev.h:747 [inline]
bio_straddles_zones include/linux/blkdev.h:1058 [inline]
blk_zone_wplug_handle_write block/blk-zoned.c:1423 [inline]
blk_zone_plug_bio.cold+0x25/0x1c8 block/blk-zoned.c:1605 blk_mq_submit_bio+0x18fb/0x2870 block/blk-mq.c:3196 submit_bh_wbc+0x575/0x740 fs/buffer.c:2824 __block_write_full_folio+0x728/0xdd0 fs/buffer.c:1933 ```
このコマンドのいずれかに失敗する任意のデバイス、ファームウェア、または NVMe-oF ターゲットはこれに到達します。
そのような場合はゾーン制限の更新をスキップし、どちらの状態が発生したかをログに記録します。再検証中はキューが最後に検証されたゾーンジオメトリを保持し、最初のスキャン時には名前空間がゾーン制限なしで登録されるため、管理コマンド用のハンドルとして引き続き利用可能になります。`nvme_query_zone_info()` の正のステータスを返すいずれのパスもログ出力を行わないため、失敗はそれ以外の場合沈黙してしまいます。
`zi.zone_size` は正確な指標です。正のステータスを返すすべてのパスでは、代入される前に戻り、その後残っている唯一のエラーは `-ENODEV` であり、これは呼び出し元がすでに処理しています。
FuzzNvme によって発見されました。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.