WWDC Quick Look 💓 By SwiftGGTeam
Verify app dependencies with digital signatures

Verify app dependencies with digital signatures

元の動画を見る

ハイライト

Xcode 15 に依存関係の署名検証が追加され、サードパーティ XCFramework の署名状態と ID の一貫性を自動検出します。SDK の改ざんや置き換えなどのサプライチェーン攻撃時にビルドをブロックし、App のソフトウェアサプライチェーンを保護します。

主要内容

サプライチェーンのセキュリティリスク

App はいくつのサードパーティ SDK に依存していますか。各 SDK が攻撃の入口になり得ます。

01:18)サードパーティ SDK は開発を効率化しますが、サプライチェーンのセキュリティリスクも導入します。悪意のある攻撃者が SDK 配布パッケージを改ざんし、App にバックドアを仕込む可能性があります。各 SDK の各バージョンの署名を手動検証するのは時間がかかり、開発者はしばしばスキップします。

Xcode 15 の署名検証で、これが自動かつ簡単になります。

コード署名の仕組み

02:59)Apple のコード署名は次の手順で SDK の完全性を保護します。

  1. コンパイル済みバイナリの Code Directory Hash(CDHash)を生成
  2. 開発者証明書の秘密鍵で CDHash に署名
  3. 公開鍵を署名と一緒に配布し、誰でも署名者の ID を検証可能に
  4. セキュアタイムスタンプを付与し、特定時点での署名であることを保証

SDK が改ざんされると署名は無効になります。XCFramework の署名は _CodeSignature ディレクトリに格納され、プライバシーマニフェストを含む framework 内のすべてのファイルを保護します。

Xcode 15 の自動検証

05:27)Xcode 15 は Inspector に “Signature” ビューを追加し、各 XCFramework の署名状態を表示します。

  • Apple Developer Program の ID で署名
  • 自己署名証明書で署名
  • 未署名

Xcode は XCFramework を初めて導入したときに署名 ID を記録し、以降のビルドで ID が変わっていないか自動検証します。

Apple Developer Program の ID については、証明書の有効性、失効、期限切れを検証し、問題があればビルドを自動ブロックします。自己署名証明書については SHA-256 フィンガープリントを比較し、変化時に警告します。

サプライチェーン攻撃のシミュレーションデモ

09:06)Session では Backyard Birds サンプル App で完全な攻撃シナリオをデモします。

  1. 開発者が BirdFeeder という署名済み XCFramework を導入
  2. Xcode Inspector に署名情報が表示され、ビルド成功
  3. 攻撃者が「機能が多くパフォーマンスが良い」新版を提供すると主張
  4. 開発者が改ざん版に置き換え
  5. ビルド失敗。Xcode が署名 ID の不一致を報告: 期待は Apple Developer Program 証明書、実際は自己署名証明書

Xcode は削除または変更を受け入れるオプションを提供します。不明な場合はキャンセルし、SDK 作者に確認してください。

SDK 作者の署名方法

12:17)SDK 作者は Apple Developer Program の Apple Distribution 証明書で XCFramework に署名すべきです。Apple が信頼機関として開発者 ID を検証し、証明書期限切れ後も同一開発者の新証明書を Xcode が自動検証できます。

codesign コマンドで署名:

codesign --timestamp -v --sign "Apple Distribution: Truck to Table (UA527FUGW7)" BirdFeeder.xcframework

キーポイント:

  • --timestamp: Apple 認証のセキュアタイムスタンプを含む
  • --sign: 署名 ID を指定(Apple Developer Program 証明書)
  • 署名はプライバシーマニフェストを含む XCFramework 内のすべてのファイルを保護

Apple Developer Program 会員でない場合は自己署名証明書が使えますが、SDK 利用者向けに証明書フィンガープリントを公開してください。

詳細

Xcode で署名状態を確認

09:41)Xcode 15 のプロジェクトナビゲーターで XCFramework を選択すると、Inspector パネルに Signature セクションが表示されます。

  • Signed by: 署名者 ID とチーム情報
  • Certificate type: Apple Developer Program / Self-signed / Unsigned
  • Status: Valid / Invalid / Changed

署名済み XCFramework を初めて追加すると、Xcode が署名 ID をプロジェクトに自動記録します。以降の各ビルドで次を検証します。

  1. 署名が有効か
  2. ID が記録と一致するか
  3. 証明書が期限切れまたは失効していないか
  4. コンテンツが改ざんされていないか

署名検証警告の対処

Xcode が署名の問題を検出するとビルドエラーを表示します。よくある警告シナリオ:

シナリオXcode の動作推奨操作
ID が Apple Developer から Self-signed に変化ビルド失敗、ID 比較を表示ビルドをキャンセルし SDK 作者に確認
同一 Apple Developer の新証明書自動検証で通過操作不要
自己署名証明書のフィンガープリント変化ビルド失敗信頼できる経路で変更の正当性を確認
Apple による証明書失効ビルド失敗XCFramework を削除し、作者に新版を依頼

11:08)警告時、Xcode は2つのオプションを提供: ゴミ箱に移動、または変更を受け入れ。公式経路で変更の正当性を確認した場合のみ受け入れてください。

既存 SDK への署名の追補

15:38)既にリリース済みの SDK バージョンに再ビルドなしで署名を追補できます。SDK 作者にとって迅速なセキュリティ対策の道です。

# リリース済み XCFramework に署名を追補
codesign --timestamp -v --sign "Apple Distribution: Your Team (TEAM_ID)" YourSDK.xcframework

# 署名を検証
codesign -vv --verify YourSDK.xcframework

ビルドスクリプトに署名を組み込み、各リリースを自動署名:

#!/bin/bash
# build_and_sign.sh

FRAMEWORK_NAME="YourSDK.xcframework"
IDENTITY="Apple Distribution: Your Team (TEAM_ID)"

# XCFramework をビルド
xcodebuild -create-xcframework \
    -framework build/ios/YourSDK.framework \
    -framework build/ios_simulator/YourSDK.framework \
    -output $FRAMEWORK_NAME

# 署名
codesign --timestamp -v --sign "$IDENTITY" $FRAMEWORK_NAME

echo "Signed $FRAMEWORK_NAME successfully"

キーポイント:

  • ビルド直後に署名し、最終成果物全体をカバー
  • --timestamp でタイムスタンプを含め、証明書期限切れ後も署名時点の有効性を検証可能
  • CI/CD にスクリプトを組み込み、手動漏れを防ぐ

重要ポイント

1. すべてのサードパーティ依存関係で署名検証を有効化

  • 何を作るか: プロジェクト内の各 XCFramework の署名状態を確認し、署名済み版を優先
  • 価値がある理由: Xcode 15 が署名を自動検証。ゼロコストでサプライチェーンセキュリティ
  • 始め方: Xcode Inspector の Signature セクションで各 XCFramework を確認。未署名は作者に署名版を依頼

2. 自社 SDK に署名を追加

  • 何を作るか: 社内またはオープンソース SDK に自動署名フローを設定
  • 価値がある理由: SDK 利用者が Xcode の自動保護を得られ、信頼を構築
  • 始め方: ビルドスクリプトに codesign を追加し、Apple Distribution 証明書を使用

3. SDK 導入審査プロセスを確立

  • 何を作るか: 新 SDK 導入時に署名 ID を記録し、変更承認の仕組みを構築
  • 価値がある理由: Xcode は署名 ID 変化時に警告するが、変化が想定内かは自分で把握する必要がある
  • 始め方: SDK 署名 ID 一覧を維持し、SDK 更新時に照合

4. CI に署名検証を統合

  • 何を作るか: CI がローカルと同じ Xcode バージョンを使用し、CI でも署名検証が動作するようにする
  • 価値がある理由: CI 環境での改ざん依存関係の導入を防止
  • 始め方: CI スクリプトでビルド前に codesign --verify で重要な依存関係をチェック

5. SDK 作者に署名を推進

  • 何を作るか: 使用している未署名 SDK の作者に連絡し、署名追加を提案
  • 価値がある理由: 署名検証エコシステムには上下游の参加が必要。推進するたびにサプライチェーン全体のセキュリティが向上
  • 始め方: SDK の GitHub Issue やサポートチャネルで署名リクエストを提出し、本 Session と Apple ドキュメントを引用

関連セッション

コメント

GitHub Issues · utterances