OWN NEWS GATHER
← 戻る
The Hacker News

OpenBSDで37年前のコードに起因する権限昇格が実証、共有メモリの不具合からroot権限を奪取可能に

要点

  • セキュリティ企業Califが、OpenBSD 7.9で一般ユーザーからroot(管理者)権限を奪取できるローカル権限昇格手法を実証した。
  • 1988年の初期BSDに由来する共有メモリの整数オーバーフローと、カーネル内の解放後メモリ利用の不具合を連鎖させている。
  • OpenBSD独自のカーネルランダム化機能「KARL」や、CPUのハードウェア保護機能「SMAP」「SMEP」の回避が行われた。
  • 修正パッチは2026年9月に syspatch を通じて全アーキテクチャ向けに配布済みであり、記事公開時点で悪用の痕跡やCVE番号の割り当てはない。

リード文

セキュリティ企業のCalifは2026年10月16日、OpenBSD 7.9において一般ユーザーから最高権限であるrootを取得できるローカル権限昇格エクスプロイトの解説と実証コードを公開した。この攻撃は、約37年前のコードに端を発する共有メモリの処理の不具合と別のカーネルの欠陥を連鎖させることで成立している。堅牢なセキュリティ設計で知られるOpenBSDだが、同OSのアドレス保護機構やハードウェアによる防御を回避して管理者権限が奪取される様子が示された。

37年前のBSDコードから引き継がれた整数オーバーフロー

攻撃の起点となったのは、共有メモリの接続関数 shmat(4) に存在する整数オーバーフロー(数値が変数の扱える上限を超えて想定外の値になる現象)である。

問題となった共有メモリ接続カウンタ shm_nattch は、1988年の初期BSDソースコードにおいて符号付き16ビット整数(short型)として定義されていた。この型が保持できる最大値は32,767だが、OpenBSDはこの仕様をそのまま引き継ぎ、型の拡張を行っていなかった。

Califが公開した実証手法では、127個の共有メモリセグメントを割り当てた上で259のプロセスをフォーク(複製生成)し、カウンタの値を上限以上に押し上げている。これによりカウンタがオーバーフローを起こして「-32,643」へと巻き戻り、続く競合状態によってUse-After-Free(解放済みメモリへの不正アクセス)が発生する。カーネル側の参照カウントが破壊された結果、他のプロセスが使用中であるにもかかわらず、カーネルがメモリ領域を誤って解放してしまう状態が引き起こされるという。

脆弱性の連鎖によるハードウェア保護機構の突破

今回の実証は単一のバグの悪用にとどまらず、別のカーネル脆弱性と組み合わされることで成立している。

実証コードは別の境界外書き込み(許可されたメモリ領域の外側にデータを書き込んでしまう不具合)を利用し、カーネル内のマルチキャストメンバシップカウンタを上書きする。その後、関連するソケットが閉じられる際のデクリメント処理を介してページテーブルエントリ(仮想メモリと物理メモリの対応関係を管理する表)を改ざんする。

この改ざんにより、ユーザーメモリ領域がスーパバイザ(特権)権限からアクセス可能な状態へと書き換えられる。その結果、カーネルによるユーザー空間へのアクセスやコード実行をハードウェアレベルで阻止する保護機能「SMAP」および「SMEP」が無効化される。攻撃者はカーネル内の予測可能なアドレスにある関数ポインタを上書きし、悪意あるコードを直接実行してroot権限を取得する。

カーネル配置のランダム化「KARL」をすり抜けた理由

OpenBSDには「KARL(Kernel Address Randomized Link)」と呼ばれる、起動ごとにカーネルバイナリを再リンクして関数やデータのアドレスをランダム化する独自の防御機構が備わっている。しかし、今回の攻撃ではメモリ配置を特定するための情報漏洩の脆弱性を必要とせずに成功している。

Califの研究者であるアンドリュー・グリフィス(Andrew Griffiths)氏によると、KARLによってバイナリ自体がランダム化されていても、カーネルのメモリアロケータ(メモリ割り当て機能)自体は決定論的な動作にとどまっていたという。システムの起動時アロケータや最適適合(best-fit)アロケータにはベースアドレスをランダム化する仕組みがないため、同一のハードウェア上であれば、再起動後も初期起動時の構造体が常に同じアドレスへ配置される。具体的には、仮想ネットワークインターフェース lo0 や暗号化インターフェース enc0 のハンドラに含まれる関数ポインタなどが固定のアドレスに着地するため、攻撃者は決め打ちでポインタを上書きできたと説明されている。

パッチの提供状況とセキュリティ強化に向けた提言

Califは2026年の早い段階でこれらの問題をOpenBSD側に報告しており、修正パッチが提供されたことを受けて詳細な技術情報と概念実証(PoC)コードをGitHub上に公開した。

OpenBSD側は2026年9月中に両方の問題に対する修正パッチをリリースしている。起点となる shmat(4) の整数オーバーフローは、9月14日に「errata 018」として修正された。ただし、このパッチはセキュリティ修正ではなく「信頼性(reliability)の修正」として分類されており、OpenBSD 7.8にも提供されている。一方、攻撃チェーンを完結させる参照カウントのUse-After-Freeについては、9月30日に「errata 026」としてセキュリティ修正扱いで公開された。いずれの修正も、標準のパッチ適用ツールである syspatch コマンドを通じて全アーキテクチャ向けに導入できる。

記事の公開時点で、一連の脆弱性に対するCVE番号の割り当てはなく、実際の攻撃で悪用された形跡も確認されていない。Califは今後の恒久的な安全性向上のために、カーネル連結リストの安全なアンリンク(FreeBSDやNetBSDで導入済み)、ページテーブル自己参照マッピングのランダム化、カーネルアロケータのランダム化、コンパイラによる境界チェックという4つの強化策を提案している。

元URL