[レポート]macOSのセキュリティとプライバシーの機構をバイパスする手法について: Gatekeeper から System Integrity Protection まで – CODE BLUE 2023 #codeblue_jp

CODE BLUE 2023で行われた「macOSのセキュリティとプライバシーの機構をバイパスする手法について: Gatekeeper から System Integrity Protection まで」というセッションのレポートです。
2023.11.08

こんにちは、臼田です。

みなさん、セキュリティ対策してますか?(挨拶

今回はCODE BLUE 2023で行われた以下のセッションのレポートです。

macOSのセキュリティとプライバシーの機構をバイパスする手法について: Gatekeeper から System Integrity Protection まで

AppleシリコンMacは、消費者やビジネス・ユーザーにとってmacOSをより魅力的なものにした。こうしたMac製品の人気の高まりは、すなわちmacOSが攻撃者にとってより魅力的な標的になっていることを意味する。

macOSは、Gatekeeper、Transparency Consent and Control (TCC)、XProtect、System Integrity Protection (SIP)など、さまざまなセキュリティとプライバシーの機構を導入することで攻撃を防ぐ、多層防御のアプローチを採用している。しかし、これらの機構が実際の攻撃に対してどの程度有効であるかを示す資料はそれほど多くない。そこで、私は昨年からこれらのセキュリティとプライバシーの機構について研究した。その結果、これらの機構のバイパスを可能とするmacOSの脆弱性を複数発見した。さらに、いくつかの機構はサードパーティ製アプリの脆弱性によってバイパスされ、そのほとんどが開発者がこれらの機構に精通していないことに起因していることも明らかになっている。

このプレゼンテーションでは、これらの新しい脆弱性の詳細、脆弱性を悪用する方法、悪用された場合の影響について、デモを交えて紹介する。また、将来のmacOS を対象とした Red Team演習において役立てられるよう、概念実証(PoC)コードをGitHubで公開する予定である。

Presented by : 中川 恒 - Koh Nakagawa

レポート

  • macOSを主に対象としてリサーチを行っている
  • Windowsも行うことがある
  • El CaptianからSIPが導入された
    • 危険な操作がブロックされる
    • rootlessと呼ばれる
    • 攻撃者がrootを取得しても色々できなくなる
    • このあたりはLinuxと大きく異なる
  • Entitlement
    • いくつかの操作は特定のentitlementがないとできない
    • OSのアップデートでシステムファイルの書き換えが必要
    • 特定のバイナリだけ許可されている
    • Appleによる署名があるものだけ書き換えができる
  • 他のセキュリティ機能
    • 攻撃者がコードを実行するのはいくつか考えられる
    • ユーザーがurlをクリックすることを想定
    • 正規のアプリに見立てたものを起動したりするところをGatekeeperとApp Sandboxで止める
    • TCCもとめる
    • 別のものを持ってくるのはXProtectでとめる
    • システムファイルなどに対してはSIPがブロック
    • 多層防御となっていて攻略が困難
    • これらをバイパスすることが目標
  • Gatekeeperバイパス
    • Gatekeeperとは
      • 信頼されたアプリだけがmacで実行されるようにすることを保証する
      • App Storeの内外でアプローチが違う
      • App Storeで署名してGatekeeperで検証する
      • 外であればAppleで公証を受けているかを確認する
    • 公証/Notraization
      • 危険なコードがないことを確認して公証を与える
      • ポップアップが出るが警告を無視して実行する、というボタンがない
    • Quarantine attribute
      • 外部からダウンロードしたらこれがアタッチされる
      • これがついているものはGatekeeperが検証する
      • 逆に言うとこれがないとチェックされない
      • libquarantineで操作
      • qtn_fileとqtn_procのAPIがある
      • APIが文章化されていないがキットからある程度わかる
      • どうやって使うか
        • qtn_file_apply_to_path
        • これは伝播するときに使う
        • 例えばzipに属性がついている場合、アーカイブユーティリティではそれを読み取って、解凍後にも属性をつける
    • この伝播に着目した
      • zipを解凍したときにこれが失敗させられないか
    • BSD file flag
      • 改変を防止したい
      • uchgがついていないファイルには属性がつく
      • uchgがついているファイルだと属性がつかない
      • アプリがこの順序を守らないといける
      • しかしzipの解凍ではuchgを保持してくれない
      • tar.gzではuchgを保持してくれる
    • 攻撃アプローチ
      • uchgをついたtar.gzを送り付けるとGatekeeperでチェックされない
    • これはVentura 13.3で修正された
      • なぜかCVEはなかった
    • 関連する脆弱性
      • CVE-2022-42821
    • サードパーティにも存在する典型的なGatekeeperバイパス
      • ドロップしたファイルに属性をつけないアプリがあると、バイパスできる
      • Electronベースのアプリの場合はデフォルトオフのためこの問題が多い
  • TCCバイパス
    • 同意なくユーザーの機微な情報にアクセスすることをブロックする
    • カメラやマイクなども含む
    • ポップアップが出てくる
    • 攻撃者がルート権限を得ていてもポップアップがでる
    • アプリごとどのファイルにアクセスできるのか細かく設定できる
    • 2つのTCCデーモンで動作している
      • rootとログインユーザーでそれぞれ実行されている
      • DBにデータが有る
      • これを書き換えられればバイパスできる
    • バイパスは大雑把に3種類ある
      • コードインジェクション
        • すでに許可されているアプリでバイパス
      • 偽のTCC情報を読み込ませる
      • その他色々な方法
    • 今回はコードインジェクションの方法を紹介
    • macOSのコードインジェクションの方法
      • Dylib injection/hijacking
        • 信頼されていないdylibの読み込みがブロックされる
      • Thread injection
        • get-task-allowのentitlementが必要
        • リリースビルドでこれを持っていることは少ない
      • saved stateを利用したものは修正されている
      • あまり汎用的に使える方法がない
    • 今回はRosetta 2を使った汎用的なコードインジェクション手法を開発した
      • AOT poisoningと命名した
      • Rosetta 2はx86_64からApple Siliconで利用できるようにする
      • 2回目以降はキャッシュを利用する
      • 過去に実行したことがあるかを判断する方法
        • AOT lookup hash(独自命名)を持っている
        • a.outからハッシュを取得し、SIPで保護されたディレクトリにaotファイルが格納されているか確認する
        • ない場合には新規にファイルを作成する
      • ハッシュ衝突に対して脆弱であることを利用する
      • コードセクションの情報は使われていない
      • 攻撃者が用意したAOTファイルが利用できるようになる
      • 改ざんしたファイルを使って汚染したAOTを作成し、戻してから実行する
    • どうやってやるか
      • ファイルの変更でmtimeが変更される
      • ファイルを変更してmtimeをもとに戻す事ができるか
        • mtimeを更新するとctimeが変更される
      • ctimeが更新されるのはAPFS filesystemの場合
      • FAT32ではctimeが定義されていない
      • mtimeを更新してもctimeが更新されなくなる
      • FAT32に移して作業すればいい
    • デモ
      • すでにTCCで許可されているアプリを改ざんしてスクリーンショットを取得
    • このバイパスもVentura13で修正された
    • サードパーティ製アプリのバイパス
      • Electron製アプリ
      • ELECTRON_RUN_AS_NODEが無効化されていないとできる
  • SIPバイパス
    • rootでもシステムに危険のある操作ができなくなる
      • 物理アクセスがあればバイパスできる
    • NVRAMに変数がある
    • 今回はファイルシステムの保護機能をバイパスする
    • どのファイルに適用されているか
      • rootless.confにある
      • restricted file flagが設定される
    • しばしばクリティカルな脆弱性
      • 常にフルTCCバイパス
      • SIPで保護されたマルウェアが作成できてしまう
      • アンチマルウェアが機能せず、削除できなくなる
      • XProtectでも同様
    • 2つのentitlementを持っている
      • com.apple.rootless.install
      • これと子プロセスに継承できるもの
    • .pkgについて
      • ソフトウェアをインストールできる
      • pkgutilで展開できる
      • gzipで圧縮される
      • Scriptsにインストール前後に実行されるファイルが含まれている
      • Appleで署名されたものの脆弱性からSIPバイパスに繋げられる
    • Apple提供のpkgファイルを使っていく
    • デモ
      • TerminalにFull Disk Accessを付与してみる
      • どこにでもアクセスできるようになった
    • MXFPlugins.pkgに対するアプローチ
      • 少し難しい
      • 別のフォーマットに対してcpさせて時間を稼ぐ
      • symlink
    • 古典的なシンボリックリンクを使った脆弱性が残っていた
  • まとめ
    • macOSのセキュリティに付いて確認
    • バイパス方法を紹介した
    • FFRIのGitHubにコンテンツが提供されている
    • メモリ破壊は難しくなっているのでロジック破壊が重要
    • Electronベースアプリ開発だと設定に気をつける必要がある
    • macOSを最新にしよう

感想

macOSの保護機能で多層防御されていても、利用するアプリや実装でバイパスされることがよくわかりました。

適切にアップデートしながら使っていきたいですね。