performing-ios-app-security-assessment について
許可を得たiOSアプリのセキュリティ評価向け手順です。FridaとObjectionを使った静的・実行時検査を扱い、IPA分析、証明書ピンニングの回避、Keychainの確認を含みます。
主な機能
- 01IPAファイルの静的分析
- 02FridaとObjectionによる実行時検査
- 03SSLピンニング回避とトラフィック傍受
- 04Keychainデータの抽出と確認
- 05アプリの保存データと通信の評価
活用シーン
- 01OWASP MASVS/MASTGに沿ったアプリ検査
- 02認証情報の保存方法の確認
- 03アプリ通信とTLS設定の分析
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill performing-ios-app-security-assessmentインストール後、Claude Code で/performing-ios-app-security-assessmentを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
iOS アプリのセキュリティ評価の実施
免責事項
このスキルは、許可を得たセキュリティテスト、侵入テストの案件、CTF コンテスト、および教育目的のみを対象としています。アプリケーションやデバイスへの不正アクセスは違法です。セキュリティ評価を実施する前に、必ず書面による許可を取得してください。これらの手法を悪用すると、お住まいの地域のコンピューター不正アクセスおよび不正利用に関する法律に違反する可能性があります。
使用するタイミング
次の場合にこのスキルを使用してください。
- OWASP MASVS/MASTG の基準に沿って、iOS アプリケーションの許可を得た侵入テストを実施する場合
- Frida によるインストルメンテーションと Objection によるランタイム調査を使用して、iOS アプリの動的解析を実施する場合
- SSL/TLS 証明書ピンニングを回避し、プロキシ経由でアプリのネットワークトラフィックを傍受して解析する場合
- iOS Keychain の内容を抽出して監査し、認証情報の安全でない保存方法を調査する場合
- IPA パッケージの静的解析を実施して、ハードコードされたシークレット、エンタイトルメント、バイナリ保護を特定する場合
- iOS アプリケーションの脱獄検知機能と改ざん防止制御を評価する場合
明示的な書面による許可を得ていないアプリケーションに対しては、使用しないでください。案件の範囲で許可されていない限り、実際のユーザーデータを含む本番デバイスでは使用しないでください。
前提条件
- pip を含む Python 3.10 以降
- Frida ツールキット:
pip install frida-tools frida - Objection:
pip install objection - 対象の iOS デバイス(脱獄済みで frida-server が動作しているもの、またはパッチ適用済み IPA を使用する非脱獄デバイス)
- macOS と Xcode コマンドラインツール(コード署名と ideviceinstaller の使用に推奨)
- SSL ピンニング回避後のトラフィック傍受用 Burp Suite または mitmproxy
- 脱獄済みデバイスの場合:SSH アクセスと、デバイス上で実行中の frida-server
- 非脱獄デバイスの場合:IPA の再署名に使用する Apple Developer 証明書
ワークフロー
ステップ 1:IPA の静的解析
ランタイムテストの前に IPA バイナリを抽出して解析します。
# Unzip IPA for static analysis
unzip target.ipa -d target_app/
# Check binary architectures and protections
otool -hv target_app/Payload/*.app/AppExecutable
otool -l target_app/Payload/*.app/AppExecutable | grep -A4 LC_ENCRYPTION
# Extract Info.plist for entitlements and URL schemes
plutil -p target_app/Payload/*.app/Info.plist
# Search for hardcoded secrets in binary strings
strings target_app/Payload/*.app/AppExecutable | grep -iE "api[_-]?key|secret|password|token|firebase"
# Check embedded provisioning profile
security cms -D -i target_app/Payload/*.app/embedded.mobileprovision
# Identify linked frameworks
otool -L target_app/Payload/*.app/AppExecutable
ステップ 2:環境のセットアップと Frida の接続
# For jailbroken device: verify Frida server is running
frida-ps -U
# Spawn target app with Frida
frida -U -f com.target.app --no-pause
# For non-jailbroken device: patch IPA with Frida Gadget
objection patchipa --source target.ipa --codesign-signature "Apple Development: [email protected]"
# Install patched IPA
ideviceinstaller -i target-patched.ipa
# Attach Objection to running app
objection --gadget "com.target.app" explore
ステップ 3:SSL ピンニングの回避
証明書ピンニングを回避して、トラフィックの傍受を可能にします。
# Using Objection's built-in bypass
objection --gadget "com.target.app" explore --startup-command "ios sslpinning disable"
# Using Frida script for more comprehensive bypass
frida -U -f com.target.app -l ssl_pinning_bypass.js --no-pause
# Verify bypass by configuring device proxy to Burp Suite
# Device Settings -> Wi-Fi -> HTTP Proxy -> Manual -> <burp_ip>:8080
# Install Burp CA certificate on device via http://<burp_ip>:8080/cert
Frida の SSL ピンニング回避スクリプトは、NSURLSession、NSURLConnection、および AFNetworking/Alamofire の信頼性評価デリゲートにフックを設定し、TLS ハンドシェイクのレベルで 証明書の検証を上書きします。
ステップ 4:Keychain の抽出と認証情報の解析
# Dump all accessible keychain items via Objection
ios keychain dump
# Dump keychain with raw data output
ios keychain dump --json
# Check keychain item accessibility attributes
# Items with kSecAttrAccessibleAlways or kSecAttrAccessibleAfterFirstUnlock
# are accessible without device unlock - this is a finding
# Search for specific credential types
ios keychain dump | grep -i "password\|token\|secret\|oauth"
# Inspect NSUserDefaults for sensitive data leaks
ios nsuserdefaults get
# Check for sensitive data in app cookies
ios cookies get
ステップ 5:ランタイムのメソッドフックと解析
# List all loaded classes
ios hooking list classes
# Search for security-relevant classes
ios hooking search classes Auth
ios hooking search classes Crypto
ios hooking search classes Biometric
ios hooking search classes Jailbreak
# Hook authentication methods to observe parameters and return values
ios hooking watch method "+[AuthManager validateCredentials:password:]" --dump-args --dump-return
# Monitor biometric authentication (LocalAuthentication framework)
ios hooking watch class LAContext
# Bypass jailbreak detection
ios jailbreak disable
# Search memory for sensitive strings
memory search "Bearer " --string
memory search "password" --string
# Dump loaded modules for third-party library identification
memory list modules
ステップ 6:データ保存の評価
# List files in app sandbox
env
# Check for SQLite databases with sensitive data
sqlite connect Documents/app.db
sqlite execute query "SELECT name FROM sqlite_master WHERE type='table'"
# Inspect plist files for cached credentials
ios plist cat Library/Preferences/com.target.app.plist
# Check for sensitive data in app caches
find Library/Caches/ -type f
# Monitor pasteboard for credential leakage
ios pasteboard monitor
# Check binary cookies
ios cookies get
ステップ 7:ネットワークとトランスポートセキュリティの評価
SSL ピンニングの回避後、傍受したトラフィックを解析します。
# Verify App Transport Security (ATS) configuration in Info.plist
# Check for NSAllowsArbitraryLoads = true (disables ATS)
ios plist cat Info.plist | grep -A5 NSAppTransportSecurity
# Hook URL session delegates to monitor all network calls
ios hooking watch class NSURLSession
ios hooking watch class NSURLSessionConfiguration
# Check for certificate transparency validation
ios hooking search classes CT
ios hooking search classes Certificate
主要な概念
| 用語 | 定義 |
|---|---|
| Frida | JavaScript エンジンを対象プロセスに注入する動的インストルメンテーションツールキットです。iOS アプリの動作をランタイムにフック、追跡、変更できます。 |
| Objection | Frida を基盤とするランタイムモバイル調査ツールキットです。Keychain のダンプ、SSL ピンニングの回避、メソッドフックなど、一般的なセキュリティテスト用のコマンドがあらかじめ用意されています。 |
| SSL ピンニング | アプリが信頼する TLS 証明書を制限するクライアント側の証明書検証です。プロキシによるトラフィック傍受を防ぎます。信頼性評価関数にフックを設定することで回避できます。 |
| Keychain | 認証情報やトークンを保存する iOS のセキュアストレージ API です。各アイテムには、読み取り可能なタイミング(デバイスのロック解除中のみなど)を制御するアクセシビリティ属性があります。 |
| IPA | iOS App Store Package の略です。アプリバイナリ、フレームワーク、アセット、プロビジョニングプロファイルを含む ZIP アーカイブであり、静的解析のために抽出できます。 |
| OWASP MASTG | Mobile Application Security Testing Guide の略です。MASVS の検証カテゴリに沿って構成された、iOS および Android のセキュリティテストに関する包括的な方法論です。 |
| Frida Gadget | 非脱獄デバイスでのテスト用に IPA に注入する共有ライブラリ(.dylib)です。脱獄を必要とせずに Frida によるインストルメンテーションを可能にします。 |
| メソッドスウィズリング | Objective-C のランタイム技術で、ランタイムにメソッドの実装を交換します。Frida がメソッドの動作を傍受して変更するために使用します。 |
ツールとシステム
- Frida:実行時にネイティブアプリのプロセスへ JavaScript を注入する動的計装フレームワークです
- Objection:あらかじめ用意された探索コマンドを備えた、Frida を基盤とする高水準のモバイルセキュリティツールキットです
- frida-tools:frida-ps(プロセス一覧表示)、frida-trace(メソッドトレース)、frida-discover(API 検出)などの CLI ユーティリティです
- Burp Suite:SSL ピンニングを回避した後にアプリのトラフィックを分析するための HTTP/HTTPS 傍受プロキシです
- ideviceinstaller:USB 経由で iOS アプリをインストールおよび管理するためのクロスプラットフォーム対応 CLI ツールです
- otool / rabin2:Mach-O ヘッダー、リンク済みライブラリ、暗号化情報を調べるためのバイナリ解析ツールです
- Cycript / Frida REPL:Objective-C ランタイムを探索し、メモリ内のオブジェクトを変更するための対話型コンソールです
よくある落とし穴
- Frida の検出によってアプリがクラッシュする:アプリによっては、frida-server のプロセス名、Frida の RPC ポート、またはガジェットのシグネチャをスキャンして Frida を検出します。検出チェックが実行される前にフックするには
--startup-commandを使用するか、frida-server バイナリの名前を変更してください。 - キーチェーンのスコープ制限:Objection がアクセスできるのは、アプリのキーチェーンアクセスグループ内のキーチェーン項目のみです。システム全体のキーチェーン項目には、keychain-dumper などの脱獄レベルのツールが必要です。
- Swift の名前マングリング:Swift のメソッド名は Objective-C ランタイムでマングルされます。
ios hooking list classesを使用して、マングルを解除した名前を grep するか、ワイルドカードパターンで frida-trace を使用してください。 - App Transport Security の適用:SSL ピンニングの回避後も、ATS によってプロキシ接続がブロックされる場合があります。Info.plist の ATS 設定で、プロキシの証明書チェーンが許可されていることを確認してください。
- コード署名の無効化:Frida Gadget を使って IPA にパッチを適用すると、元のコード署名は無効になります。パッチ適用済みの IPA に再署名するには、有効な Apple Developer 証明書が必要です。
- 変更が永続化されない:Frida/Objection のフックはすべて実行時のみ有効で、アプリを再起動するとリセットされます。調査結果を記録し、証拠をすぐに取得してください。
出力形式
## Finding: Insecure Keychain Storage with kSecAttrAccessibleAlways
**ID**: IOS-001
**Severity**: High (CVSS 7.5)
**OWASP MASTG**: MASTG-TEST-0055 (Testing Data Storage)
**MASVS Category**: MASVS-STORAGE
**Description**:
The application stores OAuth refresh tokens in the iOS Keychain with
the accessibility attribute kSecAttrAccessibleAlways, making them
readable even when the device is locked or after a reboot without
user authentication.
**Proof of Concept**:
1. Attach Objection to com.target.app: objection --gadget com.target.app explore
2. Execute: ios keychain dump
3. Observe refresh_token item with Accessible: kSecAttrAccessibleAlways
4. Token value is accessible without device unlock
**Impact**:
An attacker with physical access to a locked device or forensic
image can extract OAuth refresh tokens and gain persistent access
to the user's account without knowing device passcode.
**Remediation**:
Store sensitive credentials with kSecAttrAccessibleWhenUnlockedThisDeviceOnly
and enable biometric protection via kSecAccessControlBiometryCurrentSet.
コメント
Markdown 対応