conducting-mobile-app-penetration-test について
iOS と Android のセキュリティ評価担当者向けのモバイルペネトレーションテストスキルです。静的解析、通信、データ保存、実行時の検証を整理し、OWASP MASVS 評価にも対応します。
主な機能
- 01APK と IPA の解析
- 02ネットワーク通信の傍受と確認
- 03ローカルの機密データ保存の検査
- 04認証とセッション管理のテスト
- 05Frida による実行時の操作
- 06改ざん検知とデバイス検知の確認
活用シーン
- 01リリース前のモバイルアプリ評価
- 02銀行・医療アプリのデータ保護確認
- 03アプリとバックエンド API のテスト
- 04OWASP MASVS L1・L2 要件の評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill conducting-mobile-app-penetration-testインストール後、Claude Code で/conducting-mobile-app-penetration-testを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
モバイルアプリの侵入テストの実施
使用するタイミング
- リリース前にモバイルアプリをテストし、セキュリティ上の脆弱性やデータ保護の問題を特定する場合
- OWASP MASVS(モバイルアプリケーションセキュリティ検証標準)のL1およびL2レベルに対するコンプライアンス評価を実施する場合
- 機密データを扱うモバイルバンキング、医療、政府機関のアプリケーションのセキュリティを評価する場合
- バックエンドAPIと連携するモバイルアプリをテストし、モバイルエコシステムのエンドツーエンドのセキュリティを評価する場合
- リバースエンジニアリング、改ざん、実行時の操作に対するモバイルアプリケーションの耐性を評価する場合
使用しないでください:アプリケーション所有者から書面による許可を得ていないモバイルアプリケーションに対して、改変または再パッケージ化したアプリケーションを配布するため、あるいは別途テストビルドを用意せずに公開アプリストア上のアプリをテストするため。
前提条件
- 対象アプリケーションのIPA(iOS)およびAPK(Android)ファイル、または非公開の配布チャネルからダウンロードする手段
- Frida、Objection、Magiskをインストールしたroot化済みAndroidデバイスまたはエミュレーター(Genymotion、Android Studio AVD)
- Frida、Objection、SSL Kill Switchをインストールしたジェイルブレイク済みiOSデバイスまたはCorellium仮想デバイス
- 静的解析ツール:jadx(Androidのデコンパイル)、Hopper/Ghidra(iOSバイナリ解析)、MobSF(自動スキャン)
- Burp Suite Professionalをプロキシとして設定し、テストデバイスにCA証明書をインストールして、モバイルアプリのトラフィックを傍受できるようにすること
法的通知: このスキルは、許可を得たセキュリティテストおよび教育目的に限って使用してください。所有していないシステムや、テストの書面による許可を得ていないシステムに対する無許可の使用は違法であり、コンピューター不正利用に関する法律に違反する可能性があります。
ワークフロー
ステップ 1:静的解析
アプリケーションのバイナリを実行せずに解析します。
Androidの静的解析:
- APKをデコンパイルします:
jadx -d output/ target.apkを実行し、Java/Kotlinのソースコードを取得します AndroidManifest.xmlを確認し、エクスポートされたコンポーネント(アクティビティ、サービス、レシーバー、コンテンツプロバイダー)、権限、デバッグ可能フラグを調べます- ハードコードされたシークレットを検索します:
grep -rn "api_key\|password\|secret\|token\|aws_" output/ - 安全でないデータ保存のパターンを特定します:機密データを含むSharedPreferences、暗号化されていないSQLiteデータベース、外部ストレージ内のファイル
- WebViewの脆弱性を確認します:
setJavaScriptEnabled(true)、addJavascriptInterface()、信頼できないコンテンツの読み込み - MobSFの自動スキャンを実行します:
python manage.py runserverを実行し、APKをアップロードして自動静的解析を行います
iOSの静的解析:
- IPAを展開し、Mach-Oバイナリを特定します
otool -L <binary>を使用してリンクされたフレームワークを一覧表示し、サードパーティ製ライブラリを特定します- GhidraまたはHopperで解析し、ハードコードされたURL、APIエンドポイント、埋め込み認証情報を調べます
- Info.plistを確認し、安全でないHTTP接続を許可するApp Transport Security(ATS)の例外を調べます
- 埋め込まれたエンタイトルメントを確認し、過剰な機能がないか調べます
ステップ 2:ネットワークセキュリティテスト
すべてのネットワーク通信を傍受して解析します。
- テストデバイスでBurp Suiteをプロキシとして設定し、Burp CA証明書をインストールします
- アプリケーションのすべての機能を使用し、BurpでAPIトラフィックをキャプチャします
- SSL/TLS検証:アプリがサーバー証明書を適切に検証することを確認します。プロキシ経由でアプリが接続できない場合、証明書ピンニングが実装されている可能性があります。
- 証明書ピンニングのバイパス:
- Android:Fridaスクリプトを使用します:
frida -U -f com.target.app -l ssl-pinning-bypass.js --no-pause - iOS:SSL Kill SwitchまたはObjectionを使用します:
objection -g "Target App" explore --startup-command "ios sslpinning disable"
- Android:Fridaスクリプトを使用します:
- APIトラフィックの解析:すべてのAPI呼び出しを確認し、以下を調べます。
- 暗号化されずに送信される機密データ
- URLパラメーター内の認証トークン(ログに表示されます)
- UIに表示される内容を超える、APIレスポンスに含まれる過剰なデータ
- APIエンドポイントにおける認証の欠如または脆弱性
- WebSocketとカスタムプロトコル:標準的なプロキシによる傍受を回避する可能性がある、HTTP以外の通信チャネルがないか確認します
ステップ 3:データストレージの分析
ローカルデータが安全でない状態で保存されていないかテストします。
Android のデータストレージ:
- アプリのデータディレクトリにアクセスします:
/data/data/com.target.app/ - SharedPreferences の XML ファイルを確認し、認証情報、トークン、PII が保存されていないか調べます
- SQLite データベースを調べます:
sqlite3 /data/data/com.target.app/databases/*.db ".dump" - アプリケーションログに機密データが含まれていないか確認します:
logcat -d | grep -i "password\|token\|key" - アプリケーションデータがバックアップ対象から除外されていることを確認します:AndroidManifest.xml の
android:allowBackup="false" - クリップボードからの機密データ漏えいがないか確認します
iOS のデータストレージ:
- Keychain に保存された認証情報を調べます:
objection -g "Target App" exploreを実行してからios keychain dump - NSUserDefaults/plist ファイルを確認します:
find /var/mobile/Containers/Data/Application/ -name "*.plist" -exec plutil -p {} \; - SQLite データベースと Core Data ストアを調べ、暗号化されていない機密データがないか確認します
- スクリーンショットによるデータ漏えいがないか確認します(iOS はアプリがバックグラウンドに移行するときにスクリーンショットを撮影します)
- データ保護クラスを確認します:機密ファイルには NSFileProtectionComplete を使用する必要があります
ステップ 4:認証とセッション管理
モバイル固有の認証制御をテストします。
- 生体認証のバイパス:Frida で認証コールバックをフックし、常に成功を返すようにして、生体認証をバイパスできるかテストします
- トークンの保存:認証トークンが SharedPreferences やファイルではなく、Keychain(iOS)または Android Keystore に保存されていることを確認します
- セッションタイムアウト:妥当なアイドルタイムアウト後にセッションが期限切れとなり、ログアウト時にトークンがサーバー側で無効化されることを確認します
- ルート化/脱獄の検出バイパス:アプリがルート化/脱獄されたデバイスを検出するか、また Frida や Magisk Hide で検出をバイパスできるかテストします
- ディープリンクの悪用:カスタム URL スキームやユニバーサルリンクを使って、認証をバイパスしたり、制限された機能にアクセスしたりできないかテストします
ステップ 5:ランタイム操作
アプリケーションがランタイム攻撃に耐えられるかテストします。
- Frida によるフック:Frida を使って、実行時にアプリケーションの関数をフックし、変更します:
- 検出関数をフックして false を返すようにし、ルート検出をバイパスします
- 認証チェックの戻り値を変更します
- 暗号化関数をインターセプトし、暗号化前のプレーンテキストデータを取得します
- SSL 検証をフックして証明書ピンニングをバイパスします
- メソッドスウィズリング(iOS):Frida を使って Objective-C のメソッド実装を置き換えます
- インテント操作(Android):細工したインテントをエクスポートされたコンポーネントに送信します:
adb shell am start -n com.target.app/.InternalActivity -e "user_id" "admin" - 改ざん検出:APK/IPA を変更(コードの追加、リソースの変更)し、再署名してインストールします。アプリが改ざんを検出するか確認します。
主な概念
| 用語 | 定義 |
|---|---|
| OWASP MASTG | モバイルアプリケーションセキュリティテストガイド。iOS と Android の両方のプラットフォームを対象に、モバイルアプリのセキュリティテストを網羅した包括的なマニュアルです |
| Certificate Pinning | アプリが信頼する TLS 証明書を制限するモバイルセキュリティ制御です。プロキシによる傍受を通じた中間者攻撃を防ぎます |
| Frida | 実行中のプロセスに JavaScript を注入し、関数をフックして動作を変更し、セキュリティ制御をバイパスできる動的計装ツールキットです |
| Root/Jailbreak Detection | デバイスがルートアクセスを許可するよう改変されているかを検出するアプリケーションレベルのチェックです。通常、侵害されたデバイスではアプリの使用をブロックします |
| Android Keystore | Android 上のハードウェアベースの認証情報ストレージです。ルート化されたデバイスでも、暗号鍵やシークレットが抽出されないよう保護します |
| App Transport Security (ATS) | デフォルトで HTTPS 接続を強制する iOS のセキュリティ機能です。ATS の例外設定は、安全でないネットワーク通信を示している可能性があります |
| Deep Links | モバイルアプリケーション内の特定の画面を開く URL スキームです。適切に検証されていない場合、通常のナビゲーションや認証フローをバイパスする可能性があります |
ツールとシステム
- Frida / Objection:関数のフック、セキュリティ制御の回避、実行時のアプリケーション動作の操作に使用する動的インストルメンテーションツール
- MobSF (Mobile Security Framework):Android および iOS アプリケーション向けの自動静的・動的解析プラットフォーム
- jadx:APK のバイトコードを、手動のコードレビューに使用できる読みやすい Java ソースコードに変換する Android デコンパイラー
- Burp Suite Professional:証明書ピンニングを回避した後に、モバイルアプリの API 通信を傍受・変更する HTTP プロキシ
よくあるシナリオ
シナリオ:モバイルバンキングアプリケーションのセキュリティ評価
状況:ある銀行が、iOS および Android 向けの新しいモバイルバンキングアプリをリリースしようとしています。このアプリは、口座照会、資金移動、請求書の支払い、小切手の入金を処理します。取り扱うデータが金融情報であるため、OWASP MASVS L2 への準拠が必要です。
アプローチ:
- Android APK の静的解析により、API エンドポイント、ハードコードされたステージングサーバーの URL、設定ファイル内の AWS API キーが判明します
- 証明書ピンニングが実装されていますが、Frida の SSL ピンニング回避スクリプトで回避します
- API 通信の分析により、残高照会エンドポイントが、要求された口座だけでなく、ユーザーに関連付けられたすべての口座番号を返すことが判明します
- ローカルデータストレージの分析により、アプリが直近 10 件の取引を、暗号化されていない SQLite データベースにキャッシュしていることが分かります
- 生体認証の回避:生体認証コールバックに対する Frida フックが常に成功を返すため、指紋認証なしでアクセスできます
- ルート検出が実装されていますが、Magisk Hide モジュールで回避できるため、すべてのデータにアクセス可能な状態で、ルート化済みデバイス上でもアプリを実行できます
注意点:
- エミュレーターだけでテストし、ハードウェア固有のセキュリティ機能(ハードウェアによる保護を備えた Android Keystore、iOS Secure Enclave)を見落とす
- iOS 版と Android 版では実装や脆弱性が異なる場合があるにもかかわらず、両方をテストしない
- モバイルアプリは Web アプリとは異なる方法で API エンドポイントを呼び出す可能性があるのに、「別途テスト済み」という理由でバックエンド API のセキュリティを無視する
- 証明書ピンニングの回避をテストせず、ネットワーク分析が不完全になる
出力形式
## Finding: Biometric Authentication Bypass via Frida Instrumentation
**ID**: MOB-003
**Severity**: High (CVSS 7.7)
**Platform**: Android and iOS
**OWASP MASVS**: MASVS-AUTH-2 (Biometric Authentication)
**Description**:
The mobile banking app's biometric authentication can be bypassed using Frida
dynamic instrumentation. The authentication callback function accepts a boolean
result from the biometric API, which can be hooked and forced to return true
without presenting a valid fingerprint or face scan.
**Proof of Concept (Android)**:
frida -U -f com.bank.mobileapp -l bypass-biometric.js --no-pause
// bypass-biometric.js
Java.perform(function() {
var BiometricCallback = Java.use("com.bank.mobileapp.auth.BiometricCallback");
BiometricCallback.onAuthenticationSucceeded.implementation = function(result) {
console.log("[*] Biometric bypassed");
this.onAuthenticationSucceeded(result);
};
});
**Impact**:
An attacker with physical access to an unlocked device can bypass biometric
authentication and access the victim's bank accounts, initiate transfers,
and view financial data without biometric verification.
**Remediation**:
1. Implement server-side biometric verification using Android BiometricPrompt
CryptoObject tied to a Keystore key
2. Require the biometric operation to decrypt a server-side challenge, making
client-side bypass ineffective
3. Add runtime integrity checks to detect Frida and other instrumentation frameworks
4. Implement step-up authentication for high-risk operations (transfers > threshold)