WWDC Quick Look 💓 By SwiftGGTeam
Protect your Mac app with environment constraints

Protect your Mac app with environment constraints

元の動画を見る

ハイライト

macOS Sonoma では環境制約が導入されており、開発者はバイナリに起動制約とライブラリ読み込み制約を埋め込んで、どのプロセスが独自の補助ツール、XPC サービスを起動できるか、どのコードをプロセスのアドレス空間にロードできるかを正確に制御できるようになります。

主要内容

なぜ環境上の制約が必要なのでしょうか?

機能豊富な Mac アプリには通常、フレームワーク、アクセシビリティ ツール、XPC サービス、起動エージェントなどの複数のコンポーネントが含まれています。これらのコンポーネントは潜在的に敵対的な環境で実行され、複数のセキュリティ脅威に直面します。

  • 悪意のあるプロセスが通過する可能性がありますposix_spawn子プロセスへの入力とリソースへのアクセスを制御する
  • 攻撃者はディスク ファイルを変更し、被害者のプロセスに予期しないデータを挿入する可能性があります。
  • 補助ツールが不正に呼び出された場合、キーチェーンまたは iCloud データが漏洩する可能性があります

00:48

既存のセキュリティ メカニズム (アプリ サンドボックス、強化されたランタイム、ゲートキーパー) は、プロセスの実行環境ではなく、実行中のプロセス自体に主に焦点を当てています。環境上の制約がこのギャップを埋めます。

3 種類の環境制約

起動制約は特定のバイナリ ファイルに埋め込まれており、次の 3 種類の属性を定義します。

  1. 自己制約: プロセス自体の属性要件
  2. 親プロセスの制約: どの親プロセスがそれを開始できるか
  3. 責任のあるプロセスの制約: どのプロセスが責任を負えるか

04:54

起動 Plist 制約 が合格しましたSpawnConstraintキーはエージェント/デーモン プロセスを開始する plist に登録され、制約を満たすプロセスのみが plist によって開始されることが保証されます。

ライブラリ ロード制約 は、プロセス アドレス空間にどのコードをロードできるかを制御し、元の「全か無か」ライブラリ検証スキームを置き換えます。

実際のシーン

あなたのアプリケーションを想定してくださいMyDemo.app次のコンポーネントが含まれています。

  • 起動エージェントDemoMenuBar.agent- 補助ツールdemohelper- フレームワークとその XPC サービス
  • サードパーティチームによるライブラリ

10:21

制約がなければ、攻撃者はターミナルから直接実行される可能性があります。demohelperそして通ります--cloudiCloud データにアクセスするためのパラメーター。親プロセス制約を設定した後のみ、MyDemo.appこの補助ツールを起動することができます。

詳細

制約されたデータ構造

環境制約は、トップレベルのキーと値のペアが暗黙的に論理 AND 演算された plist ディクショナリを使用してエンコードされます。次の演算子がサポートされています。

  • $and / $or: 論理AND/OR -$and-array / $or-array: 辞書の入れ子レベルを制限します -$in: 許可される値の配列を指定します

07:55

一般的に使用されるファクトキー:

  • signing-identifier: コード署名識別子 -team-identifier: 開発チームの識別子 -cdhash: コードの一意のハッシュ値

例: ライブラリの読み込み制約

自分のチームまたは信頼できるサードパーティ チームによって署名されたコードの読み込みを許可します。

<dict>
    <key>team-identifier</key>
    <dict>
        <key>$in</key>
        <array>
            <string>M2657GZ2M9</string>
            <string>P9Z4AN7VHQ</string>
        </array>
    </dict>
</dict>

15:29

キーポイント:

  • team-identifier許可された開発チームを指定する -$in演算子は文字列の配列を受け入れ、複数のチームを許可します
  • この制約はオーバーライドされますdisable-library-validation「誰でも許可」セキュリティのダウングレードを回避する権利

例: 親プロセスの制約

アクセシビリティ ツールがメイン アプリによってのみ起動されるように制限します。

<dict>
    <key>team-identifier</key>
    <string>M2657GZ2M9</string>
    <key>signing-identifier</key>
    <string>com.demo.MyDemo</string>
</dict>

11:02

キーポイント:

  • チーム識別子と署名識別子を同時に制限して、同じチームの他のアプリケーションがそれらを不正に使用できないようにします。
  • Xcodeの「Launch Constraint Parent Process Plist」設定でこのファイルを指定します
  • 制約に違反すると、システムはクラッシュ レポートを生成します。

例: プロセス起動の制約

XPC サービスは、特定のプロセスへのアクセスのみを許可します。

<dict>
    <key>team-identifier</key>
    <string>M2657GZ2M9</string>
    <key>signing-identifier</key>
    <dict>
        <key>$in</key>
        <array>
            <string>com.demo.MyDemo</string>
            <string>com.demo.DemoMenuBar</string>
            <string>demohelper</string>
        </array>
    </dict>
</dict>

14:06

キーポイント:

  • 使用する$inこの XPC サービスへのアクセスが許可されているすべてのプロセス署名 ID をリストします。
  • Xcode の「Launch Constraint Responsible Process Plist」設定で構成されます
  • XPC サービスがバンドルから抽出された後に独立して呼び出されないようにする

例: 起動された Plist 制約

起動エージェントの改ざんを防ぐには:

<dict>
    <key>Label</key>
    <string>com.demo.DemoMenuBar.agent</string>
    <key>BundleProgram</key>
    <string>Contents/Library/LaunchAgents/DemoMenuBar.app/Contents/MacOS/DemoMenuBar</string>
    <key>KeepAlive</key>
    <dict>
        <key>SuccessfulExit</key>
        <true/>
    </dict>
    <key>RunAtLoad</key>
    <true/>
    <key>SpawnConstraint</key>
    <dict>
        <key>team-identifier</key>
        <string>M2657GZ2M9</string>
        <key>signing-identifier</key>
        <string>com.demo.DemoMenuBar</string>
    </dict>
</dict>

14:52

キーポイント:

  • SpawnConstraint起動を許可されるキー定義 plist コード ID
  • ユーザーがバックグラウンド タスクを承認した後、攻撃者は plist が指す実行可能ファイルを置き換えることはできません
  • パスSMAppServiceAPI登録plist時に有効

### 可用性

  • ライブラリ読み込み制約と launchd plist 制約: ターゲット プラットフォームは任意の macOS バージョン、適用は macOS Sonoma から開始
  • 起動の制約: ターゲット プラットフォーム macOS 13.3 以降、macOS 13.3 から適用

15:51

重要ポイント

  1. 補助ツールの親プロセス制約を追加

    • 内容: コマンド ライン ヘルパーがメイン アプリケーションによってのみ起動されるように制限します。
    • 価値がある理由: 攻撃者がアクセシビリティ ツールを直接呼び出してキーチェーンや iCloud データにアクセスすることを防ぎます。
    • 開始方法: 制約 plist ファイルを作成し、Xcode の「Launch Constraint Parent Process Plist」で参照します。
  2. 責任のあるプロセス制約を XPC サービスに追加します

    • 何をすべきか: XPC サービスをトリガーできるプロセスを制限する
    • 実行する価値がある理由: XPC サービスが抽出後に独立して呼び出されないようにして、それに割り当てられた権限を保護します。
    • 開始方法:「Launch Constraint Responsible Process Plist」で許可される署名識別子のリストを構成します。
  3. disable-library-validation をライブラリ読み込み制約に置き換えます

    • 内容: ライブラリ検証を完全に無効にするのではなく、どのサードパーティ ライブラリのロードを許可するかを正確に制御します。
    • 実行する価値がある理由: サードパーティのライブラリを統合する際に、任意の署名付きコードの挿入を防止します
    • 開始方法: インクルードを作成する$inオペレーターの制約 plist、許可されたチーム ID のリスト
  4. 起動エージェントの SpawnConstraint を追加

    • 内容: launchd plist に起動制約を埋め込む
    • 実行する価値がある理由: ユーザーが承認したバックグラウンド タスクが、悪意のあるコードを指すように改ざんされることがないようにする
    • 開始方法: plist に追加SpawnConstraint辞書経由SMAppService登録する

関連セッション

コメント

GitHub Issues · utterances