exploiting-insecure-data-storage-in-mobile について
Android と iOS アプリの機密データ保存を評価する、モバイルペネトレーションテスト向けのセキュリティスキルです。ファイルやデータベース、キーチェーン、バックアップ、実行時メモリを調査します。
主な機能
- 01Android と iOS のアプリデータの特定
- 02SharedPreferences と SQLite の調査
- 03iOS Keychain のアクセス制御評価
- 04バックアップと外部ストレージの露出確認
- 05メモリやログ内の機密データ検索
活用シーン
- 01アプリ認証情報のローカル保存監査
- 02データベースの非暗号化確認
- 03キーチェーン保護属性の評価
- 04バックアップやメモリ内の機密データ調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill exploiting-insecure-data-storage-in-mobileインストール後、Claude Code で/exploiting-insecure-data-storage-in-mobileを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
モバイルにおける安全でないデータ保存の悪用
使用するタイミング
次の場合にこのスキルを使用します:
- モバイルアプリケーションが、デバイスのファイルシステムに機密データを安全に保存しているかどうかを評価する
- SharedPreferences、SQLite データベース、または plists を介した認証情報の漏えいをテストする
- 適切なアクセス制御属性が設定されているか、キーチェーン/キーストアの実装を評価する
- モバイル侵入テスト中に、保存データのセキュリティ評価を実施する
許可なく本番環境のユーザーデバイスでこのスキルを使用しないでください。データ抽出手法には、物理的なアクセスまたは root/脱獄の権限が必要です。
前提条件
- ADB にアクセスできる、root 化済みの Android デバイスまたはエミュレーター
- SSH にアクセスできる脱獄済みの iOS デバイス、または Objection でパッチを適用した IPA
- Android のファイルシステムにアクセスするための ADB(Android Debug Bridge)
- データベースを調査するための SQLite3 CLI
- 実行時にデータを抽出するための Frida/Objection
- 対象アプリケーションがインストールされ、使用済みであること(ログイン済みで、データがキャッシュされている)
法的通知: このスキルは、許可を得たセキュリティテストおよび教育目的でのみ使用してください。所有していないシステムや、テストの書面による許可を得ていないシステムに対する無許可の使用は違法であり、コンピューター詐欺に関する法律に違反する可能性があります。
ワークフロー
ステップ 1:アプリケーションのデータ保存場所を特定する
Android の保存パス:
# Internal storage (app-private, requires root)
/data/data/<package_name>/
├── shared_prefs/ # SharedPreferences XML files
├── databases/ # SQLite databases
├── files/ # General files
├── cache/ # Cached data
├── lib/ # Native libraries
└── app_webview/ # WebView data
# External storage (world-readable on older Android)
/sdcard/Android/data/<package_name>/
# Check for world-readable files
adb shell run-as <package_name> ls -la /data/data/<package_name>/
iOS の保存パス:
# App sandbox (accessible via SSH on jailbroken device)
/var/mobile/Containers/Data/Application/<UUID>/
├── Documents/ # User data, backed up by default
├── Library/
│ ├── Preferences/ # NSUserDefaults plists
│ ├── Caches/ # Cache data
│ └── Application Support/
└── tmp/ # Temporary files
ステップ 2:SharedPreferences を抽出して分析する(Android)
# Pull SharedPreferences files
adb shell run-as <package_name> cat shared_prefs/*.xml
# Or on rooted device
adb pull /data/data/<package_name>/shared_prefs/ ./shared_prefs/
# Search for sensitive data
grep -ri "password\|token\|secret\|key\|session\|auth\|cookie" shared_prefs/
よくある安全でない保存パターン:
<string name="user_password">mysecretpass123</string>
<string name="auth_token">eyJhbGciOiJIUzI1NiIs...</string>
<string name="api_key">sk-live-abc123def456</string>
<string name="user_ssn">123-45-6789</string>
<string name="credit_card">4111111111111111</string>
ステップ 3:SQLite データベースを分析する
# Pull databases
adb pull /data/data/<package_name>/databases/ ./databases/
# Open and inspect
sqlite3 databases/app.db
.tables
.schema users
SELECT * FROM users;
SELECT * FROM sessions;
SELECT * FROM tokens;
# Search all tables for sensitive columns
sqlite3 databases/app.db ".dump" | grep -i "password\|token\|secret\|credit"
暗号化されていない SQLCipher データベースがないか確認します:
# If database opens without password, it's unencrypted
sqlite3 databases/app.db "SELECT count(*) FROM sqlite_master;"
# Success = unencrypted (vulnerability)
ステップ 4:iOS のキーチェーン保存領域を調査する
# Using Objection
objection --gadget com.target.app explore
ios keychain dump
# Check protection class attributes
# kSecAttrAccessibleWhenUnlocked - OK for most data
# kSecAttrAccessibleAlways - VULNERABLE: accessible even when locked
# kSecAttrAccessibleAfterFirstUnlock - acceptable for background apps
ステップ 5:外部ストレージとバックアップへの露出を評価する
Android:
# Check if backup is enabled
aapt dump badging target.apk | grep -i "allowBackup"
# android:allowBackup="true" = vulnerability
# Extract backup data
adb backup -f backup.ab -apk <package_name>
java -jar abe.jar unpack backup.ab backup.tar
tar xvf backup.tar
# Inspect extracted data for sensitive information
# Check external storage
adb shell ls -la /sdcard/Android/data/<package_name>/
iOS:
# Check backup exclusion
# Files in Documents/ are backed up by default
# Check NSURLIsExcludedFromBackupKey attribute
objection --gadget com.target.app explore
ios plist cat Info.plist
ステップ 6:実行時のメモリー分析
# Dump process memory for sensitive data
objection --gadget com.target.app explore
memory search "password" --string
memory search "BEGIN RSA PRIVATE KEY" --string
memory dump all /tmp/memdump/
# Android: Check for sensitive data in logs
adb logcat -d | grep -i "password\|token\|key\|secret"
主要な概念
| 用語 | 定義 |
|---|---|
| SharedPreferences | XML 形式の Android キー・バリュー型ストレージです。認証情報を平文で保存するために誤用されることがよくあります |
| Keychain Services | iOS の安全な認証情報ストレージで、最新のデバイスでは Secure Enclave ハードウェアによって保護されます |
| Android Keystore | Android のハードウェア保護された暗号鍵ストレージです。鍵をデバイスから抽出することはできません |
| SQLCipher | SQLite データベース向けの透過的な暗号化拡張機能です。パスワードなしでのデータ抽出を防ぎます |
| Data Protection API | デバイスのパスコードに紐付いた iOS のファイルレベル暗号化機能です。保護クラス属性で制御されます |
ツールとシステム
- ADB (Android Debug Bridge):Android デバイスとのやり取りやファイルシステムへのアクセスに使うコマンドラインツール
- Objection:キーチェーンのダンプやメモリーの調査に使う、Frida を基盤とする実行時探索ツール
- SQLite3:暗号化されていない SQLite データベースの調査に使うコマンドラインインターフェース
- Android Backup Extractor (ABE):保存データを調査するために ADB バックアップファイルを展開するツール
- iExplorer:iOS アプリのサンドボックスファイルシステムを閲覧する GUI ツール
よくある落とし穴
- 暗号化されているが、鍵がコード内にある:データベースを暗号化していても、暗号鍵を SharedPreferences に保存したり、バイナリーにハードコードしたりするアプリがあります。暗号化だけでなく、鍵の保存場所も必ず確認してください。
- MODE_WORLD_READABLE の非推奨化:このフラグは API 17 で非推奨になりましたが、従来のアプリではまだ使われている可能性があり、その場合、他のアプリから SharedPreferences を読み取れることがあります。
- iOS バックアップの対象範囲:デフォルトでは、Documents ディレクトリ内のすべてのファイルが iTunes/iCloud バックアップに含まれます。機密ファイルにバックアップ除外属性が設定されていることを確認してください。
- クリップボードへの露出:クリップボードにコピーされたデータは、すべてのアプリからアクセスできます。パスワードやトークンなどの機密データをアプリがクリップボードにコピーしていないか確認してください。
コメント
Markdown 対応