CVE-2026-98284 in Linux情報

要約

〜によって VulDB • 2026年10月06日

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

netlink: ロックレスのリーダーがnlk->groupsを使用している間に、そのメモリを解放しないこと

netlink_realloc_groups()は、netlink_table_grab()の下でkrealloc()を使用します。NLGRPSZ(groups)の結果が異なるkmallocバケットに分類される場合、古いビットマップは即座に解放されます。

nlk->groups / nlk->ngroupsの2つのリーダーは、netlinkテーブルロックを保持していません:

1) sk_diag_dump_groups()。ハッシュ化された(バインド済みの)ソケットは、__netlink_diag_dump()内のrhashtableウォークからダンプされますが、この関数はRCUのみを保持します。ダンプのうちmc_list部分だけがnl_table_lockを保持します。

2) netlink_native_seq_show() (/proc/net/netlink)。このウォークは、コミット 21e4902aea80(「netlink: Lockless lookup with RCU grace period in socket release」)以降、ロックレスとなっています。

両方のケースで、解放されたバッファを読み取る可能性があります。また、sk_diag_dump_groups()では、古い@groupsポインタと新しい@ngroups値を同時に読み込んだ場合、古い(より小さい)バッファの末尾を超えて読み込んでしまう可能性があります。これはNETLINK_DIAG_GROUPS属性に結果がコピーされる際に問題となります。

このバグはコミット f773608026ee(「netlink: access nlk groups safely in netlink bind and getname」)によってbind()およびgetname()に対して修正されたのと同じクラスのものです。しかし、上記2つのリーダーは見逃されていました。sk_diag_dump_groups()でテーブルロックを単に取得することはオプションではありません。なぜなら、この関数はダンプのmc_listセクションからnl_table_lockが既に保持されている状態で呼び出されるためです。

代わりに、ロックレスのリーダーを安全なものにします:

- krealloc()によって暗黙的に実行されるkfree()に依存するのではなく、RCUグレース期間後に古いビットマップを解放し、新しいビットマップを割り当てます。

- @ngroupsよりも前に@groupsを発行(パブリッシュ)します。両方ともreleaseセマンティクスを使用し、ロックレスのリーダーはまず@ngroupsを読み込みます。これにより、リーダーが新しい(より大きい)サイズと古い(より小さい)バッファを組み合わせることは決してありません。また、新しいポインタを取得しながらも旧いサイズを見ているリーダーは、初期化されたビットマップを見ることが保証されます。

netlink_realloc_groups()はプロセスコンテキスト(bind()およびsetsockopt())から呼び出されるため、テーブルが解放された後はkfree_rcu_mightsleep()を使用することができます。

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

責任者

Linux

予約する

2026年09月25日

モデレーション

承諾済み

エントリ

VDB-414165

EPSS

0.00000

アクティビティ

非常低い

ソース

Want to know what is going to be exploited?

We predict KEV entries!