mcpField
S
swift-security

swift-security

github.com/dpearson2699セキュリティ1.2k3.0k 回インストール13 週間前に更新
リポジトリ

swift-security について

Apple プラットフォームのクライアント側セキュリティを扱う Swift スキルです。Keychain、CryptoKit、証明書信頼、セキュリティレビューをカバーし、タスクに応じた資料の参照を案内します。

主な機能

  1. 01Keychain の安全な保存方法
  2. 02生体認証と Secure Enclave の扱い
  3. 03CryptoKit の暗号化パターン
  4. 04証明書信頼と鍵共有の確認
  5. 05旧式ストレージ移行とセキュリティテスト
  6. 06OWASP モバイル要件への対応付け

活用シーン

  1. 01Swift アプリの認証情報保存のレビュー
  2. 02生体認証で保護する秘密情報アクセスの実装
  3. 03旧式の秘密情報保存からの移行
  4. 04モバイルセキュリティ適合性レビューの準備

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dpearson2699/swift-ios-skills --skill swift-security

インストール後、Claude Code で/swift-securityを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

evals/
evals.json
references/
biometric-authentication.md
certificate-trust.md
common-anti-patterns.md
compliance-owasp-mapping.md
credential-storage-patterns.md
cryptokit-public-key.md
cryptokit-symmetric.md
keychain-access-control.md
keychain-fundamentals.md
keychain-item-classes.md
keychain-sharing.md
migration-legacy-stores.md
secure-enclave.md
testing-security-code.md

詳細

Swift Security

クライアント側の Apple プラットフォームのセキュリティ作業(Keychain Services、アクセス制御、生体認証で保護されたシークレット、CryptoKit、Secure Enclave キー、認証情報の保存、証明書の信頼、キーチェーン共有、従来のシークレットの移行、セキュリティテスト、OWASP モバイルコンプライアンスへのマッピング)では、このスキルを使用してください。

デプロイメントターゲットが不明な場合は、iOS 17 以降と Swift の並行処理の例をデフォルトにしてください。ユーザーが古いターゲットを求めている場合は、iOS 13 以降の互換性に関する注意事項を含めてください。iOS 26 の CryptoKit の耐量子暗号 API は、利用可能な環境を確認したうえで使用してください。

目次

ワークフロー

リファレンスを読み込む前に、依頼の内容を分類してください。

  1. 既存のコードをレビューする:まずレビューのチェックリストを実行し、次にcommon-anti-patterns.mdと、問題がある各領域のドメインリファレンスを読み込みます。重大度、根拠、修正後のパターンを報告してください。
  2. コードを改善または移行する:移行の種類を特定し、移行用と対象ドメインのリファレンスを読み込みます。既存データを保持し、新しいアイテムを検証してから、成功した場合にのみ従来のストレージを削除してください。
  3. 新しいセキュリティコードを実装する:必要最小限のドメインリファレンスを読み込み、示されている正しいパターンを使用し、OSStatus の処理とテストを含めてから、該当するチェックリストを実行してください。

デフォルトでリファレンスファイルをすべて読み込まないでください。このスキルは段階的に情報を開示するよう意図的に分割されています。ユーザーのタスクに必要なファイルのみを読み込んでください。

安全なキーチェーン書き込みの最小パターン

追加、識別、更新の辞書は分け、すべての OSStatus を処理してください。

func saveSecret(_ data: Data, account: String) throws {
    let identity: [CFString: Any] = [
        kSecClass: kSecClassGenericPassword,
        kSecAttrService: "com.example.app",
        kSecAttrAccount: account,
    ]
    var add = identity
    add[kSecValueData] = data
    add[kSecAttrAccessible] = kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly

    switch SecItemAdd(add as CFDictionary, nil) {
    case errSecSuccess:
        return
    case errSecDuplicateItem:
        let status = SecItemUpdate(
            identity as CFDictionary,
            [kSecValueData: data] as CFDictionary
        )
        guard status == errSecSuccess else { throw KeychainError(status: status) }
    case let status:
        throw KeychainError(status: status)
    }
}

読み取り、削除、アクセス制御、デバイスのロック時、およびテストのパターンについては、keychain-fundamentals.mdを読み込んでください。

リファレンスの読み込み

タスクの内容読み込むファイル
キーチェーンの一般的な CRUD または OSStatus の処理keychain-fundamentals.md
kSecClass またはアイテムの識別方法の選択keychain-item-classes.md
アクセシビリティクラスまたは SecAccessControlkeychain-access-control.md
Face ID、Touch ID、または生体認証で保護されたシークレットbiometric-authentication.md
Secure Enclave キーsecure-enclave.md
ハッシュ化、HMAC、AES-GCM、ChaChaPoly、HKDF、PBKDF2cryptokit-symmetric.md
署名、ECDH、HPKE、ML-KEM、ML-DSAcryptokit-public-key.md
OAuth トークン、API キー、ログアウト、リフレッシュトークンのローテーションcredential-storage-patterns.md
アプリとエクステンション間のキーチェーン共有keychain-sharing.md
証明書の信頼、SPKI ピンニング、mTLScertificate-trust.md
UserDefaults/plist/NSCoding からの移行migration-legacy-stores.md
ユニット、統合、シミュレーター、デバイス、CI のテストtesting-security-code.md
OWASP MASVS/MASTG またはエンタープライズ監査へのマッピングcompliance-owasp-mapping.md
セキュリティ全般のレビューcommon-anti-patterns.md、次に変更対象となる各ドメインのリファレンス

セキュリティ不変条件

このセキュリティ不変条件と、common-anti-patterns.md に記載されている対応するアンチパターンに限り、指示的な表現を使ってください。 この一覧にないアーキテクチャ上の選択については、助言的な表現を使ってください。

  • トークン、パスワード、API キー、署名キー、リフレッシュトークンを UserDefaults、Info.plist、.xcconfig、ソースコード、ログ、ファイル、NSCoding アーカイブに保存しないでください。Keychain を使用するか、実行時にシークレットを取得してください。
  • OSStatus を無視しないでください。すべての SecItemAdd、SecItemCopyMatching、SecItemUpdate、SecItemDelete の処理経路で、成功と、errSecDuplicateItem、errSecItemNotFound、errSecInteractionNotAllowed などの想定される失敗を処理してください。
  • LAContext.evaluatePolicy() だけをシークレットの保護に使わないでください。保護対象のシークレットを SecAccessControl を使ってキーチェーン項目にバインドし、キーチェーンへのアクセスによって LocalAuthentication が起動するようにしてください。
  • キーチェーン項目を追加するときは、必ず kSecAttrAccessible または kSecAttrAccessControl を明示的に設定してください。
  • 永続的なキーチェーンへの書き込みには、必ず追加または更新を使用してください。通常の更新処理として、削除してから追加する方法を使わないでください。
  • SecItem* の処理をメインアクター上で行わないでください。キーチェーンアクセスにはアクターまたはシリアルキューを使用してください。
  • macOS AppKit ターゲットでは、レガシーなファイルベースのキーチェーン項目を意図的に扱う場合を除き、kSecUseDataProtectionKeychain: true を設定してデータ保護キーチェーンを対象にしてください。
  • 同じキーで AES-GCM のノンスを再利用しないでください。
  • 生の ECDH SharedSecret バイト列を対称鍵として使わないでください。HKDF または X9.63 派生を使って鍵を導出してください。
  • セキュリティ目的で Insecure.MD5 または Insecure.SHA1 を使わないでください。

隣接領域との境界

このスキルは、クライアント側のストレージ、暗号プリミティブ、ハードウェアで保護された鍵、信頼性評価を担当します。隣接する作業は適切に振り分けてください。

  • Sign in with Apple、パスキー、OAuth の UI フロー、ASAuthorizationController、認証情報の状態、アカウントへのサインイン UX には authentication を使用してください。
  • ストレージ、鍵のライフサイクル、プロトコル/信頼性の設計、Secure Enclave ポリシー、証明書の信頼性、誤用のレビュー、コンプライアンスがタスクに含まれない場合は、CryptoKit API の基本的な構文や例に cryptokit を使用してください。
  • 鍵の所有権、導出、ストレージ、ローテーション/復旧、Secure Enclave、HPKE/PQC への移行、プロトコルの信頼境界、誤用分析に関わる場合は、アプリケーションレベルの E2E 暗号化のセキュリティレビューをこのスキルの対象としてください。
  • DeviceCheck および App Attest のアテステーション/アサーションフローには device-integrity を使用してください。
  • URLSession、リクエストパイプライン、ATS 設定、リトライ、キャッシュ、到達可能性、トランスポートアーキテクチャには ios-networking を使用してください。
  • プライバシーマニフェスト、ATT、App Review ガイドラインへの準拠、提出準備には app-store-review を使用してください。

このスキルでは、セキュリティ上の引き継ぎ先を示す目的に限り、これらの領域に言及できます。

レビューチェックリスト

コードレビューや移行計画には、このチェックリストを使用してください。各項目を合格、不合格、該当なしで評価し、不合格の場合は参照ファイルと重大度を示してください。

  • シークレットが UserDefaults、plist、ソースコード、ログ、ファイル、アーカイブに保存されていません。
  • すべての SecItem* 呼び出しで OSStatus を確認し、一般的な回復可能エラーに対処しています。
  • シークレットへの生体認証アクセスは SecAccessControl を使ってキーチェーンに紐付けられており、LAContext.evaluatePolicy() が返す単独の Bool に依存していません。
  • キーチェーンへの追加時のディクショナリで、アクセシビリティポリシーを明示的に設定しています。
  • キーチェーンへの書き込みには、削除してから追加する方法ではなく、追加または更新を使用しています。
  • キーチェーン処理は UI/メインアクターのコードから分離されています。
  • 選択した kSecClass は、項目の種類と主キー属性に一致しています。
  • CryptoKit のコードでは、ノンスの再利用、共有シークレットの直接使用、脆弱なハッシュ、ハードコードされたキーを避けています。
  • 独自の暗号化設計では、鍵の所有者、導出、保存、ローテーション/復旧、可用性の条件、プロトコル/信頼境界を明確にしています。
  • Secure Enclave のコードでは、利用可否を確認し、シミュレーターとデバイスの違いに対処し、dataRepresentation のみを永続化し、デバイスに紐付く鍵を前提に設計しています。
  • アプリ/エクステンション間の共有では、完全な Team ID アクセスグループと、すべてのターゲットで一致するエンタイトルメントを使用しています。
  • 証明書の信頼検証には最新の SecTrust API を使用し、ホスト名/ポリシーを検証し、ピンニングが必要な場合は SPKI または CA ピンニングを使用しています。
  • macOS のキーチェーンコードでは、データ保護キーチェーンとファイルベースのキーチェーンのどちらを使うかを意図的に選択しています。
  • 該当する場合、テストで成功、重複、項目なし、デバイスのロック中、シミュレーター/デバイスの違い、移行の各パスを検証しています。
  • コンプライアンスが求められる場合、OWASP MASVS/MASTG との対応関係を含めています。

よくある間違い

  • 重複や errSecItemNotFound への対処を含めず、不完全なキーチェーンの例を生成する。
  • 生体認証 UI を追加しても、キーチェーンのアクセス制御を使わずにシークレットを読み取り可能なままにする。
  • 属性を省略することで、kSecAttrAccessibleWhenUnlocked が暗黙に選択される。
  • 非推奨の kSecAttrAccessibleAlways または kSecAttrAccessibleAlwaysThisDeviceOnly を使用する。
  • 同じ追加クエリで kSecAttrAccessible と kSecAttrAccessControl を併用する。
  • Secure Enclave の鍵を、インポート可能、エクスポート可能、同期可能、または対称暗号化に適しているものとして扱う。
  • SHA-3、ML-KEM、ML-DSA、X-Wing の CryptoKit API が iOS 26 より前から利用可能だと主張する。
  • HPKE が iOS 17 より前から利用可能だと扱う。
  • 正しい SPKI 表現ではなく、未加工の鍵バイトのみをハッシュして証明書ピンニングを実装する。
  • アカウントログイン、ネットワーク、App Attest、App Store の審査ガイダンスに範囲を広げ、関連する別のスキルに引き継がない。

出力ルール

  • セキュリティ上の指摘では、重大度を示してください。悪用可能なシークレットまたは暗号の不備は CRITICAL、気付かれにくいセキュリティ境界/データ損失の問題は HIGH、脆弱または不完全な強化は MEDIUM とします。
  • 実装レビューで具体的なアンチパターンがある場合は、誤ったコード例と修正後のコード例を含めてください。
  • バージョン指定の API を推奨する場合は、必要な最小 iOS/macOS バージョンを含めてください。
  • 実質的なセキュリティパターンごとに、その根拠となる参照ファイルを示してください。
  • キーチェーンのコード例には、OSStatus の処理と明示的なアクセシビリティ設定を含めてください。
  • 実装や移行に関する回答は、## Reference Files で締めくくり、読み込んだ参照ファイルとその目的を一行で列挙してください。
  • WWDC のセッション番号や出典を捏造しないでください。主張が読み込んだ参照資料や Apple の公式ドキュメントに記載されていない場合は、確認が必要であることを伝えてください。

参考資料

コメント