HN 日本語サマリー

← 一覧へ戻る
セキュリティ

OpenBSDの37年前のカーネルバグを悪用する「Big Fish」

Big Fish: Exploiting a 37-Year-Old Kernel Bug in OpenBSD (calif.io)

86 pointsby rs_rs_rs_rs_rs18 コメント

要約

研究者たちは、OpenBSDカーネルに存在する37年前の共有メモリ関連のバグを悪用し、ローカル権限昇格によりrootシェルを取得する手法「Big Fish」を公開しました。このバグは整数オーバーフローとレースコンディションを利用し、カーネルのメモリ管理を操作してコード実行を可能にします。

全文翻訳

← Research Big Fish: OpenBSDにおける37年前のカーネルバグの悪用 Big fish. Small counter. Root shell. Andrew Griffiths 2026年10月16日 openbsd madbugs 目次 Califは攻撃的なリサーチや作業を頻繁に公開していますが、防御的な作業(オープンソースプロジェクトの修正、パッチ生成、暗号化改善、クライアント向け内部エンジニアリングプロジェクトなど)にはあまり注目を集めていません。今年初め、私たちはOpenBSDに脆弱性を報告し、しばしば提案されたパッチも提供しました。そのうちの1つは、約37年前に遡るオリジナルのBSDソースに由来するもので、共有メモリのアタッチメントカウンターが符号付き16ビットショートとして定義されていました。共有メモリのアタッチメントレコードを持つプロセスを繰り返しフォークすると、そのカウンターが最大値32,767を超えてラップし、負の値になる可能性がありました。この整数オーバーフローはレースコンディションを介したuse-after-freeにつながる可能性があり、カーネル内の別の境界外書き込みと組み合わせることで、ローカル権限昇格をrootまで可能にしました。これらの問題は、それぞれerrata 026と018で修正されました。 エクスプロイト KARL / SMAP / SMEPが有効なOpenBSDで、情報漏洩の脆弱性を使用せずにローカルrootを取得することに成功しました。そのパスは以下の通りです:127個のSysV共有メモリセグメントをマップし、munmap()でアンマップし、259個のプロセスをフォークして共有メモリのアタッチカウントを-32,643にラップします。sysctl(KERN_MALLOCSTATS)(kb_totalやkb_totalfreeなど)のメトリクスを使用して割り当てを追跡し、新しいページがいつ割り当てられるかを判断して、ヒープのグルーミングとレイアウトを実行します。あるプロセスでIPC_RMIDを実行し、ヘルパープロセスでサイズが間違った新しい共有メモリセグメントをアタッチすることで、レースコンディションに勝ちます。IPソケットの割り当てをアラインし、IP_MULTICAST_TTLを非デフォルト値の2に設定して、永続的な16バイトのstruct ip_moptionsを割り当てます。その最後のワードは、2つの16ビットカウンターをパックします:imo + 12 = imo_num_memberships | imo_max_memberships << 16。条件付きの-1境界外書き込みをトリガーして、メンバーシップ数と最大メンバーシップフィールドの両方を上書きします。ソケットをclose()してグループメンバーをトラバースし、アトミックデクリメントをトリガーしてPTEの自己参照マッピングを2回変更し、ユーザーからスーパーバイザーアクセス可能なマッピングに切り替え、予測可能なカーネルポインタを上書きすることによってカーネルコード実行を達成します。共有メモリの会計処理をクリーンアップし、上書きされたカーネルポインタを復元してrootシェルを取得します。これが簡潔な説明です。より長いバージョンは、脆弱性の歴史を含め、より興味深いものです。なぜなら、短いshm_nattchは、オリジナルのBSDソースで約37年前に遡ることができるからです。一歩引いて考えると、この脆弱性は、書き込み(write)がTAILQ_REMOVEによって引き起こされ、何が(what)は、SMAP/SMEPをバイパスするためにスーパーバイザーモードでアクセス可能にしたユーザーランドメモリマッピングであり、どこが(where)は予測可能なカーネルポインタの場所であった「write what where」プリミティブを介してコード実行につながりました。 エクスプロイト緩和策 OpenBSDのKARLはカーネルバイナリを再リンクして関数とデータのアドレスをランダム化しますが、カーネルのメモリロケータは決定論的なままです。ブート時のアロケータもベストフィットアロケータも、ベースアドレスのランダム化を欠いています。その結果、ブート時の初期割り当ては、同じハードウェアではブートごとに予測可能な場所に配置されます。これらの予測可能な構造体割り当てにファンクションポインタが含まれている場合、それらはエクスプロイトの理想的なターゲットになります。例えば、このエクスプロイトはlo0とenc0のioctlハンドラを確実にターゲットにし、1つを上書きして制御フローを取得し、もう1つを使用して上書きされたポインタを復元します。前述のエラータ修正以外にも、これらの経路が再び使用される可能性を排除または軽減するために取ることができるいくつかの異なるアプローチがあります。第一に、セーフアンリンクを実装できます。これは、アンリンクメモリ書き込みを実行する前に、二重リンクリストの不変条件をチェックする技術です。不変条件が違反された場合、適切なabort()またはpanic()(ユーザーモードかカーネルモードかによって異なる)が呼び出され、メモリ破損が発生するのを防ぎます。実装例はこちらです。FreeBSDとNetBSDは、sys/queue.hの実装にセーフアンリンクを実装しています。第二に、自己参照PTEマップの割り当てアドレスをランダム化して、ターゲットとなるアトミックデクリメントの場所を不可能にすることができます。これは、ランダムバイト(.openbsd.randomdata)を使用し、ブート時にPML4スロット(320 + (random_byte & 127))を選択し、その場所に再帰エントリをインストールすることによって行われます。PTE_BASE定義は実行時式となり、512GiB間隔で0xffffa00000000000から0xffffdf8000000000までのベースを生成します。実装例はこちらです。ランダム化が適切でない場合、PTEを読み取り専用としてマークし、変更中にCR0.WPを変更するなど、他のオプションが十分な場合があります。第三に、カーネルアロケータは2つのアプローチを使用して非決定論的にすることができます。ブート時にメモリ割り当てが発生するベースアドレスをランダム化し、さらに実行時に割り当て順序をランダム化することによってです。ベースアドレスのランダム化は、それが作成するギャップが後でまだ使用できるため、実質的に無料です。一方、実行時ランダム化は割り当て中にいくらかのオーバーヘッドを伴いますが、より詳細なアロケータの変更がこの影響を軽減できる可能性があります。どちらのアプローチも、ソフトウェアまたはハードウェアの追加の脆弱性なしに、予測可能なポインタの場所を破壊するのに十分です。さらに、配列境界サニタイザー(Undefined Behaviour sanitizerのサブセット)など、脆弱性全体を緩和するのに役立つ既存および今後のコンパイラ機能があり、固定サイズの配列アクセスを境界外で行うことを排除できます。CalifはFreeBSDに、配列境界サニタイザーがリリースビルドで有効にできる有用なエクスプロイト緩和策になる可能性があると提案しており、配列境界サニタイザーが検出した21件の問題(一部はローカル権限昇格のセキュリティ影響あり)をプライベートに報告しています。ヒープの問題を緩和するのに役立つ今後のコンパイラ機能はAlloc Tokensであり、ポインタを含む割り当てをポインタを含まない割り当てから分離するために使用できます。この分離により、ポインタを含まない割り当てからのオーバーフローが、ポインタアクセスを防ぐことによって悪用されるのをより困難にし、Use-after-Freeのような脆弱性クラスが反対のタイプの割り当てを代替メモリ割り当てとして使用できなくなります。その設立以来、OpenBSDは、ソースコード監査、安全でないAPIの置き換え、高度なパスワードハッシュ、暗号化、権限分離、サンドボックス化、およびASLRとW^Xによるメモリ安全性を通じて、プロアクティブなセキュリティを一貫して提唱してきました。しばしばシステムおよびネットワークのハードニングの標準を設定してきました。プロアクティブなハードニングと、新旧の緩和オプションを適応させることにより、私たちはしばしばエクスプロイトプリミティブのクラス全体を体系的に無力化することができます。あるいは少なくとも、攻撃者のコストを増加させることができます(つまり、追加の時間投資、問題の悪用に追加の脆弱性が必要、代替経路の発見など)。脆弱性が積極的に標的とされる前に防御的な改善に投資することは、攻撃者のハードルを上げ、堅牢な保護と長期的な回復力を確保するのに役立ちます。AI支援の脆弱性発見の時代において、脆弱性クラス全体を緩和し、攻撃の複雑さを増すことは、ますます重要になっています。コードとPoC → Califについて 私たちは攻撃的なセキュリティリサーチの限界を押し広げ、AIで何が可能になるかを理解し、その洞察を活用してお客様が自身を守るのを支援します。お問い合わせいただき、このようなリサーチをもっとご覧になりたい場合は、ニュースレターにご登録ください:登録 確認のために受信トレイを確認してください。関連リサーチ CVE-2026-86950: The Great Glyph Grift 2026年9月30日 OEMpocalypse Now: Androidの信頼されていないアプリからrootへの汎用エクスプロイト戦略 2026年8月31日 Password Fiction 8月