CVE-2026-89974 in Linux情報

要約

〜によって VulDB • 2026年09月16日

Linuxカーネルにおいて、以下の脆弱性が修正されました:

nvme-fc: nvme_add_ctrl() の失敗時に fabrics オプションの二重解放を修正

nvmf_create_ctrl() は fabrics オプション所有権を持ち、->create_ctrl() がエラーを返すたびにそれらを解放するため、トランスポートは独自のエラーパスでこれらを解放してはいけません。nvme-fc では nvme_fc_ctrl_free() 内で ctrl->ctrl.opts をテストすることでこれを追跡しており、そのためには nvme_fc_init_ctrl() がすべてのエラー終了時にこのポインタをクリアする必要があります。

この結合(所有権の紐付け)は暗黙的であり、コミット 1a9e218195a5 ("nvme: split device add from initialization") は二つ目のエラー終了を追加することでこれを壊しました。nvme_add_ctrl() が失敗した場合、nvme_fc_init_ctrl() は "ctrl->ctrl.opts = NULL" を含む fail_ctrl: パスを通り越して out_put_ctrl: にジャンプするため、nvme_fc_ctrl_free() と nvmf_create_ctrl() の両方がオプションを解放し、二重解放が発生します:

BUG: KASAN: slab-use-after-free in nvmf_free_options+0x30/0x190 nvmf_free_options+0x30/0x190 drivers/nvme/host/fabrics.c:1284 nvmf_create_ctrl drivers/nvme/host/fabrics.c:1374 [inline]
Freed by task 5534: nvme_fc_ctrl_free drivers/nvme/host/fc.c:2374 [inline]
nvme_fc_init_ctrl+0xe17/0x1450 drivers/nvme/host/fc.c:3605

nvme_add_ctrl() は dev_set_name() が割り当てできない場合に失敗するため、これはメモリ逼迫時やフォールト注入時に到達可能です。KASAN なしではオプションが二重に解放されます。

2つ目の終了地点でもポインタをクリアするのではなく、nvme-tcp, nvme-rdma, nvme-loop が行っているように、リストメンバシップから所有権を派生させます:それらの free_ctrl はコントローラがトランスポートリストに乗っていない限りオプションに触れません。

成功パスでリストに追加するのは適切ではありません。nvme-fc は flush_delayed_work() を介して初期接続を同期的に実行し、その間中 rport->ctrl_list 上でコントローラ到達可能である必要があります:nvme_fc_unregister_remoteport() は接続喪失をシグナルするためにそれを見つける必要があり、nvme_fc_match_disconn_ls() は着信の Disconnect Association LS を ctrl->association_id と照合しますが、これはその期間中にのみ割り当てられます。また nvme_fc_resume_controller() はリモートポート再登録時にそれを必要とし、nvme_fc_existing_controller() は実行中の接続と競合する重複した接続を拒否するためにそれを使用します。

挿入箇所はそのままで維持し、fail_ctrl: にフォールスルーするエラーパス用の fail_unlist: ラベルを追加します。より早期のエラーパスは挿抜に到達せず fail_ctrl: を直接使用するため、リストが実際に触られるのはコントローラが本当にリストに乗っている場合のみとなります。

nvme_fc_ctrl_free() は他のトランスポートが使用する単純な "goto free_ctrl" を使用できません。なぜなら、まだ insert 前に取得したリソースに対して put_device() や rport リファレンスの解放、ida エントリの解放を行う必要があるためです。代わりに rport->lock の下で list_empty() をサンプルとして使用します。

ctrl->ctrl.opts は今では全体のカスケード(teardown)の間有効なままになります。これは修正されているバグではありませんが、古いイディオム周辺の脆弱性を除去します:nvme_free_ctrl() は ->free_ctrl() 前に nvme_auth_free() を呼び出し、ctrl_max_dhchaps() は ctrl->dhchap_ctxs が設定されている場合に NULL チェックなしで ctrl->opts のデリファレンスを行います。これは NVMF_ALLOWED_OPTS が dhchap オプションを許可しているため nvme-fc で許容されます。hostnqn や address などの ctrl->opts をデリファレンスする nvme sysfs アトリビュートは、device_add() 時に is_visible() テストを1回評価し、cdev_device_del() まで読み取り可能であり続けます。

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

責任者

Linux

予約する

2026年09月11日

モデレーション

承諾済み

エントリ

VDB-405777

EPSS

0.00000

アクティビティ

非常低い

ソース

Want to stay up to date on a daily basis?

Enable the mail alert feature now!