Linux Kernel の二重解放の脆弱性 CVE-N/A と権限昇格:効果的な緩和策は?

Critical Linux Kernel’ Double Free Vulnerability Let Attackers Escalate Privileges

2025/07/10 CyberSecurityNews — Linux Kernel の NFT (netfilter) サブシステムの pipapo set モジュールに存在する、深刻な二重解放の脆弱性が明らかにされた。このセキュリティ欠陥により、細工された netlink メッセージを悪用する権限を持たない攻撃者が、カーネル・メモリの破壊を達成し、ローカル権限昇格を実行できるようになる。

主なポイント
  1. Linux Kernel における、NFT サブシステムのバージョン 5.6-rc1 〜 6.13-rc3 に存在する二重解放バグにより、ローカル権限昇格が可能となる。
  2. CONFIG_INIT_STACK_ALL_ZERO が無効化されている場合に、nft_add_set_elem 関数内にある初期化されていないスタック変数が、メモリ破損を引き起こす。
  3. 細工された netlink メッセージを送信する攻撃者は、セット要素を削除した後に、セット全体を削除することで、二重解放を誘発できる。
  4. CONFIG_INIT_STACK_ALL_ZERO を有効化し、netfilter パッチを適用することで、脆弱な構造体を適切に初期化できる。
Linux カーネルにおける二重解放脆弱性

この脆弱性は、net/netfilter/nf_tables_api.c 内の nft_add_set_elem 関数に存在する。その中の、初期化されていないスタック変数 struct nft_set_elem elem がセキュリティ欠陥の原因を生じる。

SSD のアドバイザリによると、この脆弱性は CONFIG_INIT_STACK_ALL_ZERO オプションが無効化されている場合に発生する。初期化されていないデータがスタックに残留し、処理中に要素キーが汚染される。

この脆弱なコード・パスが、ユーザー指定の NFTA_SET_ELEM_KEY データを処理するときに、キー長 (klen) の分だけしかメモリは初期化されない。残りのバッファ領域は初期化されない状態であり、そこに、スタックに存在する以前のカーネル関数のポインタ情報が含まれる。

そのため、pipapo セットが要素を削除しようとすると、二重解放状態が引き起こされる。

この脆弱性の悪用で用いられるのは、KASLR バイパスおよび任意の書き込みプリミティブの確立を取り込んだ、高度なヒープ・エクスプロイト手法である。攻撃者は、以下の手順に従って、この脆弱性を利用する。

  • 初期設定:初期化されていないパディング・バイトを生成する、特定のフィールド構成を持つ netfilter テーブルおよび pipapo セットを作成する。
  • 1回目の解放:セット要素を削除し、elem->priv に対する1回目の解放を発生させる。ただし、その要素は pipapo セット内で依然として参照され続ける。
  • 2回目の解放:セット全体を削除し、同一メモリ領域に対する2回目の解放が実行される。

この脆弱性は、Linux Kernel のバージョン 5.6-rc1 〜 6.13-rc3 に影響を及ぼす。影響を受けるカーネルのコンフィグレーションには、CONFIG_NETFILTER=y/CONFIG_NF_TABLES=y/CONFIG_USER_NS=y/CONFIG_INIT_STACK_ALL_ZERO=n が含まれる。

このエクスプロイトが悪用するのは、elem->priv 構造体が 32〜256 Bute の範囲で可変である点であり、それにより、kmalloc キャッシュへの柔軟な攻撃を可能にする。

緩和策

この脆弱性は、悪用が可能な二重解放プリミティブを提供し、それによりローカル権限昇格がトリガーされるため、深刻なセキュリティ・リスクとなる。それぞれのカーネル・コンフィグレーションにおいて、脆弱性を引き起こす最適なキー長を特定するための、ブルートフォース攻撃を仕掛けることで、侵害の成功率が高まるという。

効果的な緩和策として推奨するのは、カーネル・ビルド時に CONFIG_INIT_STACK_ALL_ZERO オプションを有効化することだ。このオプションにより、ローカル変数がゼロ初期化され、初期化されていないデータが混入するリスクが軽減される。

それに加えて、netfilter 開発チームが提供する修正パッチを適用することで、elem 構造体を適切に初期化し、根本的な問題に対応することも可能である。

この脆弱性は、以前の CVE-2023-4004 に類似しており、カーネル・メモリ管理に関する問題が繰り返し発生していることを示すものでもある。カーネル開発における変数の適切な初期化および、スタック保護メカニズムの整備が、さらに重視されるようになるだろう。