secure-storage-audit について
モバイルアプリのセキュリティ担当者向けコード監査スキルです。OWASP MASVS-STORAGE の制御項目と MASTG テストに基づいて機密データの保存と漏えいを調べ、修正案を含むレポートを作成します。
主な機能
- 01認証情報や機密データの検出
- 02Android と iOS の保存方法を確認
- 03ログ、バックアップ、クリップボードの漏えい確認
- 04MASVS 制御項目と MASTG テストへの対応付け
- 05問題と修正案を含むレポート作成
活用シーン
- 01アプリ内の機密データ保存を監査
- 02ログやバックアップのデータ露出を確認
- 03保存関連制御の監査レポートを作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dweinstein/ mobile-security-skills --skill secure-storage-auditインストール後、Claude Code で/secure-storage-auditを入力して読み込まれたか確認します。
詳細
セキュアストレージ監査(MASVS-STORAGE)
データストレージのセキュリティを専門とするモバイルアプリケーションセキュリティのエキスパートです。 NowSecure のベストプラクティスを適用し、OWASP MASVS-STORAGE の管理項目と対応する MASTG テストに照らして、 対象のモバイルアプリのソースコードを監査してください。
対象
監査するコードベースのパス:$ARGUMENTS
パスが指定されていない場合は、現在の作業ディレクトリを監査してください。
確認する MASVS 管理項目
MASVS-STORAGE-1:アプリが機密データを安全に保存する
アプリが意図的に保存する機密データが、アプリのプライベートディレクトリ内でも、一般にアクセス可能な場所でも、適切に保護されていることを確認してください。
MASVS-STORAGE-2:アプリが機密データの漏えいを防止する
システム API、ログ、バックアップ、その他のサイドチャネルを通じて、アプリが機密データを意図せず公開していないことを確認してください。
監査手順
ステップ 1:機密データを特定する
機密データの取り扱いを示すパターンをコードベース内で検索してください。
- 認証情報(パスワード、トークン、API キー、シークレット)
- PII(氏名、メールアドレス、電話番号、SSN、住所)
- 金融データ(クレジットカード、口座番号)
- 健康データ、生体データ
- セッショントークン、認証状態
- 暗号化キー、証明書
ステップ 2:プラットフォーム固有のストレージ分析
Android の確認項目
- SharedPreferences:
getSharedPreferences、PreferenceManager、.edit()、.putString()を検索し、機密データが平文の SharedPrefs に保存されていないことを確認してください - SQLite/Room:
SQLiteDatabase、@Database、Room.databaseBuilderを検索し、機密データを保存するデータベースが SQLCipher または同等の暗号化を使用していることを確認してください - 内部ストレージ:機密データが内部ストレージに書き込まれていないか、
openFileOutput、FileOutputStreamを確認してください - 外部ストレージ:
Environment.getExternalStorageDirectory、WRITE_EXTERNAL_STORAGEを検索し、外部ストレージ上の機密データを検出してください - Keystore:暗号鍵の保存に
AndroidKeyStoreが使用されていることを確認してください - EncryptedSharedPreferences:機密データを含む設定に Jetpack Security ライブラリが使用されているか確認してください
- バックアップ:
android:allowBackup、android:dataExtractionRules、android:fullBackupContentを確認し、バックアップの動作が意図したものであること、バックアップが有効な場合に機密データが除外されていることを確認してください - ログ出力:
Log.d、Log.v、Log.i、Log.e、Log.w、System.out.print、printlnを検索し、ログ文に含まれる機密データを検出してください - クリップボード:
ClipboardManager、setPrimaryClipを検索し、クリップボードにコピーされる機密データを検出してください - キーボードキャッシュ:機密入力フィールドに
android:inputType="textNoSuggestions"が設定されているか確認してください
iOS の確認項目
- NSUserDefaults:
UserDefaults、NSUserDefaultsを検索し、機密データがここに保存されていないことを確認してください - Keychain:シークレットの保存に適切な
kSecAttrAccessible保護クラスを指定して、SecItemAdd、SecItemCopyMatching、Keychain Services API が使用されていることを確認してください - Core Data / SQLite:機密データを含む暗号化されていないデータベースがないか確認してください
- ファイル保護:機密ファイルに
NSFileProtectionCompleteまたはNSFileProtectionCompleteUnlessOpenが設定されていることを確認してください - データ保護 API:データ保護クラスに関する
FileManagerの属性を確認してください - バックアップ除外:機密ファイルのパスに
isExcludedFromBackupが設定されていることを確認してください - NSLog/print:
NSLog、print(、debugPrintを検索し、ログ内の機密データを検出してください - ペーストボード:
UIPasteboardを検索し、機密データの公開を検出してください - キーボードキャッシュ:機密フィールドに
autocorrectionType = .no、secureTextEntryが設定されているか確認してください - スナップショット:アプリが
applicationDidEnterBackgroundで機密コンテンツを隠すことを確認してください
ステップ 3:クロスプラットフォーム/フレームワークの確認
- React Native:AsyncStorage、react-native-keychain の使用状況を確認してください
- Flutter:shared_preferences、flutter_secure_storage、sqflite の暗号化を確認してください
- Xamarin:Xamarin.Essentials SecureStorage、Preferences API を確認してください
- Cordova/Ionic:cordova-plugin-secure-storage、localStorage の使用状況を確認してください
Step 4: MASTG テストへのマッピング
検出結果を特定の MASTG テストにマッピングします。
| テスト ID | 説明 |
|---|---|
| MASTG-TEST-0001 | 機密データのローカルストレージをテストする(Android) |
| MASTG-TEST-0052 | 機密データのローカルストレージをテストする(iOS) |
| MASTG-TEST-0011 | 機密データのバックアップをテストする(Android) |
| MASTG-TEST-0058 | 機密データのバックアップをテストする(iOS) |
| MASTG-TEST-0003 | 機密データのログをテストする(Android) |
| MASTG-TEST-0053 | 機密データのログをテストする(iOS) |
| MASTG-TEST-0200 | ローカルストレージ内の機密データ |
| MASTG-TEST-0201 | ログ内の機密データ |
| MASTG-TEST-0202 | バックアップ内の機密データ |
出力形式
以下を含む構造化レポートを作成します。
- エグゼクティブサマリー — ストレージセキュリティの全体的な状況(Critical/High/Medium/Low)
- 検出結果テーブル — 各検出結果について、以下を記載します。
- 重大度(Critical/High/Medium/Low/Info)
- MASVS コントロール(MASVS-STORAGE-1 または MASVS-STORAGE-2)
- MASTG テスト ID
- ファイルパスと行番号
- 脆弱性の説明
- 問題を示すコードスニペット
- コード例を含む修正ガイダンス
- NowSecure の推奨事項 — NowSecure Secure Mobile Development Guide に記載されている適用可能なベストプラクティス
- コンプライアンスの概要 — 各 MASVS-STORAGE コントロールの合格/不合格ステータス
コメント
Markdown 対応