新たに公開されたOpenBSDカーネルの攻略チェーンは、共有メモリのアカウンティングの欠陥と、別の境界外書き込みの脆弱性を組み合わせ、root権限を奪取します。
2026年10月16日に公開された「Big Fish」と題する調査には、PoC(概念実証)コードが含まれています。複数のセキュリティ保護機構が有効な環境でも攻略が成立することを示しています。
最も古い欠陥は、約37年前のBSDコードに由来する共有メモリのアタッチカウンターに関するものです。この「37年」はカウンターのソースコードの系譜を指しており、OpenBSDの歴史の長さを指すものではありません。
Califによると、OpenBSDはバージョン7.9向けのエラッタ026_sysvipcと018_shmatで、これらの脆弱性に対処しました。問題の核心は、共有メモリのアタッチ数を管理する符号付き16ビットのフィールド「shm_nattch」にあります。
プロセスを繰り返し生成すると、このカウンターが最大値の32,767を超えて折り返し、負の値になります。アカウンティングが不正確になった結果、競合状態(レースコンディション)が発生し、use-after-free(解放後使用)の脆弱性につながる恐れがあります。
公開された攻略手順では、研究者は127個のSystem V共有メモリセグメントをマップし、munmap()でマップを解除したうえで、259個のプロセスをforkしました。
これによりアタッチカウンターは−32,643に達しました。続いてヒープグルーミングを実施します。sysctl(KERN_MALLOCSTATS)が公開する割り当て統計を利用してメモリの配置を監視し、新たに確保された領域を特定しました。
IPC_RMIDによるセグメント削除と、ヘルパープロセスによる別セグメントのアタッチを競合させると、後続のメモリ破壊に必要な条件が整いました。このエクスプロイトは、カウンターのオーバーフローだけに頼るのではなく、この挙動を別の境界外書き込みと組み合わせています。
攻撃の標的は、ソケット設定を通じて割り当てられるIPマルチキャストオプション構造体です。この構造体のメンバーシップカウンターを破壊すると、ソケットのクリーンアップ時に、カーネルの自己参照型ページテーブルマッピングに対してアトミックなデクリメントが実行されます。
この変更により、攻撃者が制御するメモリにスーパーバイザーからアクセスできるようになり、カーネルの制御フローをさらに操作できる状態になります。
Griffiths氏は、KARL(Kernel Address Randomized Link)、SMAP(Supervisor Mode Access Prevention)、SMEP(Supervisor Mode Execution Prevention)を有効にした状態でrootを取得できたと報告しています。情報漏えいの脆弱性は必要ありませんでした。
このチェーンは最終的に、リンクリストの削除操作を使って予測可能なカーネルポインターを上書きし、カーネルコードを実行します。その後、変更した状態を元に戻してからrootシェルを起動します。
今回の調査は、ランダム化されたカーネルバイナリと、予測可能なカーネルのメモリ割り当てとの違いを浮き彫りにしました。KARLはカーネルのコードとデータを並べ替えますが、Califによると、割り当て動作が決定論的であるため、同一ハードウェア上では起動初期の特定の構造体が予測可能な位置に配置されたままでした。
管理者は、既存のエクスプロイト緩和策をパッチ適用の代わりとみなさず、該当するOpenBSDのエラッタを優先して適用する必要があります。
これはローカル権限昇格のチェーンです。攻撃者は影響を受けるシステム上でコードを実行できる必要があり、この欠陥だけでリモートから直接アクセスされるわけではありません。
Califは修正にとどまらず、セーフアンリンクのチェック、ページテーブルマッピングのランダム化、カーネルの割り当てを予測しにくくする対策も提案しました。
これらの堅牢化案は、再利用可能な攻撃手法を封じることを狙っています。ただし、提案された防御策のすべてがOpenBSDに採用された、あるいはサポート対象のリリースに導入されたとは、報告書では確認されていません。
16,000以上のSOCチームがANY.RUNを活用し、脅威調査を効率化して手作業を削減しています。チームで試してみる
翻訳元: https://cyberpress.org/37-year-old-openbsd-kernel-flaw/