テクノロジー · ニュース解説

OpenBSD「Big Fish」はローカルrootを実証 修正はすでに提供済み

Califは10月16日、OpenBSD 7.9で動作するローカル権限昇格チェーンを公開した。数十年前の共有メモリーカウンターのオーバーフローと別のカーネル欠陥を組み合わせるが、関連修正は9月に提供済みだ。

ローカル利用者、共有メモリーカウンターの回り込み、メモリー破壊、root shellを示すオリジナルイラスト。
オリジナルイラスト:公開チェーンはローカル権限昇格で、前提なしの遠隔入口ではない。 Watch at Ease

セキュリティ企業Califは10月16日、OpenBSD 7.9で低権限のローカル利用者からrootへ昇格する完全なPoCを公開した。符号付き16ビットの共有メモリー接続カウンターを回り込ませ、競合で起きるuse-after-freeと別の範囲外書き込みを組み合わせる。

深刻な実証だが境界が重要だ。攻撃者はまずローカル利用者としてコードを実行できなければならない。未認証の遠隔侵入は示していない。OpenBSDはPoC公開前の9月14日にerrata 018、9月30日にerrata 026を出していた。

公開exploitが示したこと

Califによると、127個のSystem V共有メモリー区画を割り当て、259プロセスをforkして接続カウンターを16ビット上限の先へ進める。競合で壊れた参照数がuse-after-freeにつながる。

さらにヒープ配置と別の範囲外書き込みでページテーブル状態を変え、予測可能なカーネル関数ポインターを上書きする。KARL、SMAP、SMEPが有効で情報漏えいなしにroot shellへ到達した。

示していないこと

これはローカル権限昇格だ。公開経路は、標的上で低権限ユーザーとしてすでにコードを実行できることを前提とする。ネットワーク越しの未認証侵入経路ではない。

独立報道の公開時点でCVEはなく、実際の攻撃で使われた証拠もなかった。これは時点情報であり、公開コード後も悪用されない保証ではない。

PoCより先に修正済み

OpenBSD 7.9のerrata 018は9月14日付でshmat(4)整数オーバーフローを防ぐ。errata 026は9月30日付でuse-after-freeにつながるカーネル参照数バグを修正する。公式項目はいずれも全アーキテクチャ向けソース修正だ。

errataページではamd64、i386、arm64にsyspatch経由のバイナリー更新がある。他のアーキテクチャはソースの-stable対応が必要な場合がある。OpenBSD 7.8にもerrata 054で共有メモリー修正が提供された。

管理者の確認方法

対応する公式リリースでsyspatchをオプションなしで実行すると、欠けているバイナリーパッチを取得、検証、導入する。パッチは累積で一部だけ選べない。-cは利用可能分、-lは導入済み一覧を示す。

OSの版表示だけで保護済みと判断しない。導入済みパッチと出力を確認し、表示される再起動指示に従う。未対応版や必要なバイナリー更新がない構成では、署名付きソース修正と公式-stable手順を使う。

修正後も研究が重要な理由

37年前のカウンター型は入口にすぎない。完全なexploitは予測可能なカーネル割り当てと別のメモリー破壊手段にも依存する。Califはsafe unlinking、ページテーブルとアロケーターのランダム化、境界検査を提案する。

実務上の結論は限定的だ。動作するチェーンが公開された今はパッチ確認が急務だが、遠隔OpenBSD乗っ取りや活発な攻撃として表現してはならない。

9月の2件の修正が10月16日のPoCより前だったことを示すオリジナルイラスト。
オリジナルイラスト:syspatchで不足を確認し、表示される再起動指示に従う。 Watch at Ease