新たに公開されたOpenBSDカーネルの攻撃チェーンは、共有メモリのアカウンティングの欠陥と、別の境界外書き込みの脆弱性を組み合わせ、root権限を奪取します。
Califの研究者Andrew Griffiths氏は2026年10月16日、「Big Fish」と題する研究を公開しました。あわせて、複数のカーネル保護機能を有効にした状態でも攻撃が成立することを示す概念実証(PoC)コードも公開しています。
最も古い脆弱性は、約37年前のオリジナルBSDのソースコードから受け継がれた、共有メモリのアタッチカウンターに由来します。
脆弱性診断サービス
ただし、この37年という期間が示すのは脆弱なコードの系譜であり、OpenBSDそのものの存続期間ではありません。Califによると、OpenBSDは2件の問題にそれぞれerrata 026と018で対処済みです。
OpenBSDカーネルの欠陥
アカウンティングの欠陥は、共有メモリのアタッチ数を追跡する符号付き16ビットのフィールドshm_nattchにあります。プロセスの生成を繰り返すと、カウンターが最大値の32,767を超えて負の値にラップします。
アタッチ数の管理が誤ると、競合状態を引き金とするuse-after-freeが発生する条件が整います。Griffiths氏の攻撃手順では、127個のSystem V共有メモリセグメントをマップし、munmap()でアンマップしたうえで、259個のプロセスをforkします。
これらの操作によってアタッチ数は−32,643に達し、後続のメモリ破壊チェーンに必要なアカウンティング状態が作られます。続いてエクスプロイトは、sysctl(KERN_MALLOCSTATS)で公開される割り当て統計を使い、カーネルメモリを整形(グルーミング)します。
kb_totalやkb_totalfreeなどの指標から、割り当ての挙動や新しいページが利用可能になるタイミングを把握できます。これにより、標的とするカーネルオブジェクトの配置を制御しやすくなります。
次の段階では、IPC_RMIDによるセグメント削除と、ヘルパープロセスによる別の共有メモリセグメントのアタッチとの間で競合を起こします。重要なのは、カウンターのオーバーフローだけでは攻撃が成立しない点です。別途見つかった境界外書き込みも必要になります。
このチェーンが狙うのは、16バイトのstruct ip_moptionsです。IPソケットのマルチキャスト設定によって割り当てられます。境界外書き込みにより、2つのメンバーシップカウンターが破壊されます。その後ソケットを閉じると、カーネルの自己参照型ページテーブルマッピングに対してアトミックなデクリメントが実行されます。
この変更でマッピングの権限が書き換わり、攻撃者が制御するメモリにスーパーバイザーからアクセスできるようになります。さらにTAILQ_REMOVEによるリンクリストからの要素削除が書き込みプリミティブとなり、予測可能なカーネルポインタを上書きして実行フローを乗っ取ります。最後に改変した状態を復元し、rootシェルを獲得します。
Griffiths氏によると、Kernel Address Randomized Link(KARL)、Supervisor Mode Access Prevention(SMAP)、Supervisor Mode Execution Prevention(SMEP)をすべて有効にした環境でも、情報漏えいの脆弱性を使わずに攻撃に成功したということです。
KARLはカーネルバイナリをランダム化します。しかしCalifは、カーネルの割り当てが決定論的であるため、同一のハードウェアでは起動初期の構造体が起動のたびに予測可能な位置に置かれることを確認しました。
管理者は、エクスプロイト緩和策だけに頼らず、該当するOpenBSDのerrataを優先的に適用すべきです。これはローカル権限昇格の脆弱性です。攻撃者は、影響を受けるシステム上で既にコードを実行できる必要があり、このチェーン単独ではリモートアクセスは得られません。
Califは、セーフアンリンクのチェック、自己参照型ページテーブルマッピングのランダム化、予測しにくいカーネル割り当ても提案しています。これらは再利用可能な攻撃手法を対象にした対策です。ただし、サポート対象のOpenBSDリリースに導入されているかどうかは、今回の研究では確認されていません。
16,000以上のSOCチームがANY.RUNを活用し、脅威調査を効率化して手作業を削減しています。 チームで試してみる
翻訳元: https://gbhackers.com/openbsd-kernel-flaw/