Linuxカーネル STPのUse-After-Free脆弱性、PoCが公開

`net/bridge`にあるLinuxカーネルのソフトウェアブリッジ実装に影響を及ぼすUse-After-Free脆弱性に対して、概念実証(PoC)コードが公開されました。

Vulnerabilityassessment service

この脆弱性は、Spanning Tree Protocol(STP)のタイマーのライフサイクル内で発生します。解放済みのブリッジメモリを参照するタイマー構造体が生じ、制御フローの乗っ取りにつながる可能性があります。

SSD Secure Disclosureの技術チームがこの問題を公表したのは、TyphoonPWN 2026大会がきっかけでした。同大会では独立系研究者のn132氏とSven Sze氏がこの問題を発見し、Linux権限昇格部門で2位を獲得しています。

Linuxはコミット`2a00517db8de4be7df3d483b215c5544fb30a191`で修正版をリリースし、この脆弱性に対応済みです。

STPタイマーのライフタイムに関する欠陥

Linuxのソフトウェアブリッジドライバは、`hello_timer`、`tcn_timer`、`topology_change_timer`、ポート固有のタイマーなど、複数の定期タイマーを通じてSTPの状態を管理しています。

これらのタイマー構造体は`struct net_bridge`内に組み込まれており、この構造体はブリッジインターフェースの基盤となる`net_device`のプライベートデータ領域に確保されます。

この設計では、タイマーの安全性がデバイスの適切な後処理(teardown)に依存することになります。1つ以上のSTPタイマーがCPUごとのタイマーベースにキューイングされたままの状態でブリッジデバイスが解放されると、その後のタイマー実行時に、すでにスラブアロケータへ返却済みのメモリにアクセスしてしまう可能性があります。

この脆弱性は、ブリッジインターフェースが管理上ダウン状態にあるにもかかわらず、カーネルのSTPが有効になっている場合に発生します。ブリッジおよびポートの設定を操作できる攻撃者やローカルユーザーは、ブリッジポートをLEARNING状態に遷移させることができ、これによりSTPコードが定期タイマーを起動させてしまいます。

重大な点として、該当するタイマー起動処理のパスでは、ブリッジにIFF_UPフラグが設定されているかどうかを検証していません。そのため、ブリッジインターフェース自体がダウンしていてもタイマーがスケジュールされてしまいます。

この欠陥は、インターフェースのシャットダウン処理と削除処理との間でクリーンアップの挙動に一貫性がないことに起因しています。

ブリッジがUPからDOWNへ遷移する際は、標準の`ndo_stop`経路によって`br_dev_stop()`が呼び出され、続いて`br_stp_disable_bridge()`が実行されます。

このクリーンアップ関数は`del_timer_sync()`を使ってSTPタイマーを同期的に削除するため、ブリッジメモリが解放された後にコールバックが実行されることを防いでいます。

しかし、すでにダウンしているブリッジを直接削除する場合は`dellink`経路、すなわち`br_dev_delete()`を通ることになり、この経路では`br_stp_disable_bridge()`が呼び出されません。

さらに、`unregister_netdevice_many()`は、すでにダウン状態のインターフェースに対しては`ndo_stop`を呼び出しません。その結果、STPが有効に設定され、ポートがLEARNING状態にあるブリッジは、タイマーが動作したままの状態で削除されてしまう可能性があります。

その後、基盤となる`net_device`が解放され、キューイングされていたタイマーエントリは解放済みの`kmalloc-cg-8k`スラブメモリを指したままになります。

その後、CPUごとのタイマーベースがsoftirqコンテキストで`__run_timers()`を実行すると、カーネルは`call_timer_fn()`を通じてダングリング状態のタイマーコールバックを発火させてしまう可能性があります。

公表された分析によれば、攻撃者が制御可能なデータで解放済みオブジェクトを再利用(reclaim)することで、タイマー関数ポインタを差し替えられる可能性があり、この問題はカーネルの制御フローを乗っ取るためのプリミティブへと発展しかねません。

Securedata storage

管理者およびディストリビューションは、上流の修正パッチを適用するか、コミット`2a00517db8de4be7df3d483b215c5544fb30a191`を含むカーネルビルドへ更新する必要があります。

新たなフィッシングやマルウェアが貴社を侵害する前に阻止しましょう。 世界中の15,000のSOCからのライブインテリジェンスを統合

翻訳元: https://gbhackers.com/poc-released-for-linux-kernel-stp/

ソース: gbhackers.com