[WWDC23] Privacy ManifestsのSDKコード署名（の概念）


[[WWDC23] Xcode15からPrivacy Manifestsが導入 - Qiita](https://qiita.com/YokohamaHori/items/f54e9f2c74f7f6bfe268) の続編です。

以下のセッションビデオの内容を簡単にまとめておきました。

Verify app dependencies with digital signatures - WWDC23 - Videos - Apple Developer

https://developer.apple.com/wwdc23/10061

結論としては、Privacy Manifests の詳細情報は年内に公開されるので、詳細はそれまで分かりません。

**[所感]**
SDKのコード署名については、SDKをxcframeworkで公開しているなら、リビルドせずにターミナルからcodesignコマンドで簡単に署名出来そうだが、それ以外（.framework, .a, CocoaPods, Carthage, SPM, Flutter, Unity, KMM .etc）の時はどうなるのかよく分からなかったです。

このビデオを見ればPrivacy Manifests（の特にSDKのコード署名あたり）の詳細がもう少し分かるかなと思っていたが、ほぼ概念的なものしか説明はなかった。DevNewsにもある通り、Privacy Manifests の詳細情報は年内に公開されるので、詳細はドキュメント公開後に確認するのが良さそう。

https://developer.apple.com/jp/news/?id=av1nevon

```
年内には、次のような追加情報を公開する予定です。

- プライバシーに影響を及ぼすSDK（ユーザーのプライバシーに特に大きな影響を与えるサードパーティ製SDK）のリスト
- 認められる理由を宣言する必要がある「理由が求められる」APIのリスト
- 対象のAPIを呼び出す新しい理由を提案するための、デベロッパ向けフィードバックフォーム
- 署名とプライバシーマニフェストのメリットや詳細、およびこれらが必須となる時期に関する追加文書
```

# ポイント

セッションビデオのポイントを簡単にまとめておきました。

1. **Code signing**: SDKのコード署名はxcframeworkの_CodeSignatureディレクトリに含まれます。
2. **Signature verification**: SDKのコード署名の検証はXcodeで行えます。Xcodeにはxcframeworkの署名ステータスを表示する新しいセクションがあり、問題があれば警告が出ます。
3. **App developers**: アプリ開発者がSDKを利用する場合、Xcodeでアプリビルド時に自動でxcframeworkの署名が検証されます。問題があれば警告アラートが出て、SDKをゴミ箱に入れるか、「Accept Change」を選択してそのまま使うこともできます。
4. **SDK authors**: SDK開発者は、SDKに暗号化による署名を行うことが重要です。（詳細情報は年内公開）
5. **codesign tool**: codesignコマンドを使えば、既存のxcframeworkをリビルドせずにxcframeworksに署名できます。

## documentation

公式ドキュメントで本セッションの一部（アプリ開発者がSDKを使う時の署名検証手順）が公開されています。

https://developer.apple.com/documentation/Xcode/verifying-the-origin-of-your-xcframeworks

# 詳細
以下はセッションビデオの詳細です。（もちろんChatGPTにまとめてもらってます）

## はじめに

1. **Xcode内の依存関係署名検証**: この新機能は、アプリ開発者が自分たちのアプリを保護し、依存関係の作者が配布するSDKを保護するのを支援します。
2. **App supply chains(アプリのサプライチェーン)**: アプリは様々なSDKを使って開発されます。iOS SDKのようにAppleが作成したもの、開発者が自分たちのアプリ全体で使用するために作成したもの、他のソースから入手したものなどです。これらはアプリのサプライチェーンを形成し、フレームワーク、Swiftのソースファイル、その他の種類の依存関係を含むことができます。
3. **サプライチェーンセキュリティーの重要性**: サードパーティーのSDKを使用すると、アプリ開発が大幅に容易になり、機能が拡張される一方、リスクも生じます。サプライチェーンセキュリティーは、これらのリスクを軽減するプロセスです。ユーザーを保護するために、どの依存性を含めるか選択し、意図せずに悪意を持って修正されたバージョンを使用しないようにします。
4. **依存関係署名検証の利便性**: 依存関係署名検証は、このタスクを簡単かつ自動的にする新しいXcode機能です。これらのリスクを軽減するためのプロセスとツールは手動で行うと負担が重いか、複雑であることが多いですが、この新機能により、それらが大幅に軽減されます。

## Dependency signatures

### **Code signing**

1. **Code signing デジタル署名の役割**: デジタル署名は、開発者を保護し、サプライチェーンセキュリティの負担を軽減するための重要な役割を果たします。Appleのコード署名技術の働きと、Xcodeがどのように依存関係の署名を検証するかについて説明します。
2. **Appleのコード署名技術**: SDKを開発している際には、配布先のクライアントにそれが改ざんされていないことを保証する必要があります。コード署名は、最終的にコンパイルされたバイナリと、Info.plistやフレームワークのプライバシーマニフェストなどの関連メタデータ、あるいは一部の配布タイプではソースコード自体と、開発者のアイデンティティを暗号学的に関連付けるための仕組みです。
3. **コード署名のプロセス**: コード署名は、まずコンパイルされたバイナリのコードディレクトリハッシュ（CDHash）を生成することから始まります。このハッシュに署名するためには、開発者のアイデンティティ（開発者の証明書）を使用します。これには、コード署名に使用される秘密キーと、署名の一部として配布される公開キーが含まれています。
4. **署名の検証と安全性**: あなたのSDKが改ざんされると、署名は無効になります。また、アプリ開発者は署名に埋め込まれた証明書を使って、署名があなたによって行われたことを検証することができます。
5. **Xcodeとxcframeworkの依存関係**: アプリで使用する一般的な依存関係の一つがxcframeworkです。xcframeworkでは、署名は_CodeSignatureディレクトリ内に存在します。署名検証はXcodeの新機能で、アプリの依存関係の検証を自動的に行い、問題が検出された場合に警告することで、サプライチェーンの完全性を保護します。

### **Signature verification**

1. **Signature verification New in Xcode15 署名のステータスと検証**: Xcodeには、アプリ内で使用するxcframeworkの署名ステータスを表示する新しいセクションがあります。署名の詳細情報が表示され、署名がApple Developer Programのアイデンティティによって行われたものか、自己署名証明書によるものか、またはまだ署名されていないものかが表示されます。また、Xcodeは初回にxcframeworkを使用した際のアイデンティティを記録し、後のビルド時に変更がないことを確認します。
2. **異なる開発者アイデンティティに対する対応**: Xcodeは、特定のxcframeworkに使用されたアイデンティティの信頼度に基づいて、異なるレベルの機能を提供します。Apple Developer Programのアイデンティティの場合、Appleは証明書の有効性をチェックし、同じ名前で複数の開発者が登録できないことを保証します。
3. **署名証明書の期限切れと対応**: xcframeworkの作者の署名証明書が期限切れになった場合、XcodeはApple Developer Programのアイデンティティ用の新しい証明書が同じ開発者から発行されたものであることを自動的に検証できます。ただし、自己署名証明書の場合、信頼できる第三者による証明書の認証がないため、この変更が正当なものであることを手動で検証する必要があります。
4. **Xcodeによる警告と対応**: Apple Developer Programの証明書がAppleによって取り消された場合、または署名が無効である、アイデンティティが変わっている、またはxcframeworkが証明書の有効期限後に署名されている場合など、Xcodeは警告を表示します。このような問題が発生した場合、Xcodeはxcframeworkをプロジェクトから削除するオプションを提供します。
5. **デジタル署名とxcframeworkの働き**: xcframeworkにおけるデジタル署名の仕組みにより、依存関係の完全性と安全性が保証され、開発者やエンドユーザーの安心感が高まります。

## App developers

1. **Xcodeの新機能の使用方法（デモ）**: 今回は「Backyard Birds」というサンプルアプリを使って、アプリ開発者がこの新機能をどのように使用するかを示します。「BirdFeeder」というxcframeworkを使って鳥のエサや水の補充プロセスを自動化する予定です。開発者は最新リリースのBirdFeeder.xcframeworkに署名しています。
2. **xcframeworkの追加と署名確認**: BirdFeederをプロジェクトに追加します。Xcode 15のInspectorには、「Signature」というビューが用意されています。ここでは証明書の署名情報と開発者チームの詳細が表示されます。ビルド時には、BirdFeeder.xcframeworkの署名者のアイデンティティがプロジェクトの期待値と一致するかどうかをXcodeが検証します。
3. **サプライチェーン攻撃のシミュレーション**: 改良版のBirdFeeder xcframeworkを他から提供され、それをプロジェクトに追加するシミュレーションを行います。信頼できるウェブサイト以外からxcframeworkをダウンロードした際に起きる可能性のある状況です。
4. **署名の不一致とその対処**: アプリのビルド時に、Xcodeはアプリ内の全てのxcframeworkの署名を検証します。今回、新たに追加したBirdFeederの開発者アイデンティティがプロジェクトに記録されていたものと一致しなかったため、ビルドに失敗しました。これは、xcframeworkが改ざんされている可能性があることを示しています。
5. **不一致の通知とアクション**: 予期しない変更が検出された場合、Xcodeはその新しいバージョンをゴミ箱に移動します。ただし、この変更が正当なものであることが分かっている場合（開発者が確認可能な公開チャネルを通じてこれを通知している場合など）は、その変更を受け入れることも可能です。

## SDK authors

1. **SDK開発者がやること**: 最後に、この新機能がSDK開発者にとって何を意味するのかを説明します。SDK開発者にとっては、SDKに暗号化による署名を行うことが重要です。これにより、アプリ開発者は開発者のアイデンティティを確認し、署名後にコードが改ざんまたは操作されていないことを保証できます。これらの性質は、信頼を構築し、SDKを安全に配布するために非常に重要です。
2. **署名に使うアイデンティティ**: 前述のように、使用できるアイデンティティには二つのタイプがあります。Apple Developer Programと自己署名です。
3. **Apple Developer Programの証明書の利用**: Apple Developer Programのメンバーは、SDKのクライアントの信頼を確保するために、このプログラムに含まれる証明書を使用すべきです。SDKを公開する場合は「Apple Distribution」証明書、テストバージョンを配布する場合は「Apple Development」証明書を使用します。Enterprise Programのメンバーは、「iOS Distribution」または「App Development」証明書を使用すべきです。
4. **証明書の信頼性と更新**: Appleが証明書を発行するとき、AppleはあなたがApple Developer Programの正当なメンバーであり、証明書を取得するためのすべての必要な要件を満たしていることを証明します。これには、アイデンティティの確認と、Appleのプライバシーとセキュリティに関するポリシーとガイドラインへの準拠が含まれます。SDKに署名するために使用される証明書を手動で取り消す場合、開発者がアプリをビルドしようとするときにXcodeが署名を検証できなくなるため、有効な証明書を使用して署名した更新版をリリースする必要があります。

### codesign tool

1. **Apple Developer Programとcodesignコマンドの使用**: Apple Developer Programの認証情報を用いてxcframeworksを署名できます。署名にはタイムスタンプフラグが含まれ、これはAppleによって証明されます。ターミナルから次のようなコマンドで署名できます。`codesign --timestamp -v --sign "Apple Distribution: Truck to Table (UA527FUGW7)" BirdFeeder.xcframework`
2. **自己署名証明書の生成**: Apple Developer Programのメンバーでない場合でも、自己署名証明書を生成し、codesignコマンドと共に使用することができます。この証明書の指紋はSDKのクライアントと共有し、署名が自分自身によるものであることを確認します。

## さいごに

1. **Xcodeの新機能**: Xcodeの新機能を使用すると、アプリに含めるxcframeworksが自分自身による署名であることを確認できます。
2. **SDKの署名の重要性**: 常に配布するSDKに署名すると、Xcodeの新機能を通じてSDKクライアントがサプライチェーンへの信頼を強化できます。
3. **簡易性**: すでに公開されているフレームワークのバージョンからすぐに始めることができ、新しいビルドは必要ありません。Apple Developer Programのメンバーでない場合でも、自己署名証明書を使用してこれを実行できます。
4. **Xcode 15の自動化**: Xcode 15は、アプリの基礎となるSDKの完全性とセキュリティを自動的に確保します。
5. **SDK署名の検証**: すべてのSDK署名が検証されていることを確認することは、責任あるアプリ開発の重要な側面であり、ユーザーを保護します。
6. **サプライチェーンの改善**: サプライチェーンの開発者にSDKの署名を開始するよう奨励することで、より安全なアプリ開発に寄与できます。
7. **SDK作者へのメッセージ**: コードに署名することで、SDKクライアントとの信頼関係を築き、セキュリティとプライバシーを重視していることを示すことができます。