2025年版 iOSおよびAndroid向けモバイルアプリ セキュリティチェックリスト
ソースコードの保護
- 最小特権の原則に基づくコードへのアクセス制御。保護されたブランチと必須のレビュー。
- CI/CDに統合された静的解析とシークレットスキャン。深刻度の高い発見事項がある場合はマージをブロック。
- 開発者のワークステーションの衛生管理と、リポジトリおよびビルドアーティファクトに対するデータ損失防止(DLP)。
- 依存関係とサプライチェーンの衛生管理(バージョンのロック、監視)。
-
.envファイルや構成ファイルにシークレットを保存するのではなく、専用のシークレット管理ツール(例:HashiCorp Vault、AWS Secrets Manager、GitHub Secrets)を使用する。 - アーティファクトリポジトリ内のビルドアーティファクトを保護し、アクセスできるユーザーを制御し、本番環境にビルドを昇格させる。
- ハードコードされたシークレットなし、安全でない暗号化のデフォルトなし、一貫したコードレビューのカバレッジ。
認証(MFA)とセッションセキュリティ
- 多要素認証(MFA)。可能な場合はSMSよりもアプリベースまたはプッシュベースの要素を優先する。
- 機密性の高いアクションに対するアカウントのロックアウトとステップアップ認証。
- セッションの衛生管理:有効期間の短いトークン、リフレッシュトークン(refresh tokens)の安全な保存、堅牢なログアウト/ローテーションフロー。
- OTPの再利用防止、一貫したロックアウトのしきい値、ブルートフォースやリプレイ攻撃への耐性。
通信のエンドツーエンドの暗号化(TLS + 証明書のピニング)
- 最新のTLSを強制。プレーンテキストのエンドポイントおよびプロトコルのダウングレードを許可しない。
- 信頼できないネットワーク上でのMITMのリスクを軽減するため、SSL/TLS証明書のピニングを実装する。
- すべての証明書を検証し、検証エラー時にはフェイルクローズ(fail closed)する。
- 混在コンテンツや安全でないトランスポートへのフォールバック(fallback)なし。計画的なピンのローテーションと緊急時のピニング解除パス。
ペネトレーションテストと継続的なセキュリティテスト
- 自動スキャンと専門家による手動テストを組み合わせ、ビジネスロジックの欠陥を検出する。
- モバイル特有の攻撃ベクトルを含める:サイドチャネル攻撃(タイミング)、メモリダンプ、ローカルでの権限昇格、およびプロセス間通信(IPC)のエクスプロイト。
- 認可のバイパスやデータ漏洩を特定するために、ディープリンク(deep linking)、カスタムURLスキーム、インテントハンドラー(Android)など、アプリ特有の機能に対するテストを含める。
- 実際の攻撃者の行動を反映した、ブルートフォース、ファジング、およびインジェクションテストを含める。
- 発見事項を修正SLAを持つバックログアイテムとして扱う。再テストし、完了の証拠を記録する。
- 認証、セッション管理、ストレージ、API呼び出し、およびクライアント側の保護に対するテストカバレッジ。
APIセキュリティのガバナンス
- ドキュメントと所有者を含む、モバイルで消費されるすべてのAPIのインベントリを維持する。
- 強力な認証と認可を強制する。最小特権の原則(PoLP)を適用する。
- メディエーション(ゲートウェイポリシー)、レート制限(rate limiting)、入力の検証、および一貫したロギング/監視を追加する。
- オブジェクトレベルの認可の不備(IDOR)、インジェクションの欠陥、および構成ミスの防止。
実行時保護(RASP)と改ざん防止
- ジェイルブレイク/root化、フッキングフレームワーク、デバッガーの接続、およびエミュレーターの使用を検出する。(ジェイルブレイク/root化の実行時チェックは完璧ではなく、洗練された攻撃者は静的チェックをバイパスできることに注意してください)。
- 適応的な対応:ブロックする、機能を低下させる、または再認証を促す。常にシグナルをログに記録する。
- 実行時のチェックは簡単にバイパスされるべきではない。対応が正常な状態のUXを損なうことはない。
安全なデータストレージ(Keychain/Keystore)
- プレーンテキストでシークレットを絶対に保存しない。認証情報とキーにはプラットフォームのキーストア(keystores)を使用する。
- 最新のアルゴリズムを使用して、サーバー側でパスワードをハッシュ化およびソルト化する。保存時の機密レコードを暗号化する。
- バックアップと一時ストレージを保護する。機密データに対する安全な削除を実装する。
- 機密データはログ、スクリーンショット、キャッシュ、または暗号化されていないバックアップに表示されない。
ロギング、監視、およびインシデントへの備え
- 機密アクションと状態の変更に対する監査証跡を作成する。テレメトリを中央集権化する。
- 異常な動作や失敗したセキュリティチェックに対するアラート。定期的に調査および調整を行う。
- 検出/対応時間を短縮するために、ランブック(runbooks)を維持し、インシデントドリルを実践する。
- ログは機密データの露出を避けつつ、調査に十分なコンテキストを保持する。
更新、依存関係、および最小OSポリシー
- ソフトウェアコンポジション解析(SCA)ツールをCI/CDに統合し、コミット時に脆弱な依存関係を検出する。ロックファイル(
Podfile.lock、package-lock.json、gradle.lock)を使用して、再現性のあるビルドを確保し、推移的依存関係の予期せぬ変更を防ぐ。 - 頻繁にアップデートを出荷する。脆弱なSDKやサードパーティの依存関係に迅速にパッチを当てる。
- 最小OSバージョンポリシーを定義してレビューする。ユーザーへの明確なメッセージとともに、安全でないOSバージョンを廃止する。
- 重要なセキュリティアップデートについて、アプリ内でユーザーを促す。
- セキュリティを弱める非推奨(deprecated)のAPIは使用しない。依存関係のリスクが監視され、対応されている。
リバースエンジニアリング保護
- コードの難読化、シンボルの除去、および改ざん防止チェックを適用する。
- 一般的な動的計装(dynamic instrumentation)の試みを検出し、適切に対応する。
- 機密性の高いローカルアセットを暗号化する。起動時および実行時にアプリの整合性を検証する。
- パフォーマンスを損なうことなく攻撃者を減速させ、労力を増やすために、保護は階層化されている。
コンプライアンスと監査への対応
- チェックリストを、認められたモバイルセキュリティ要件およびセクターのニーズにマッピングする。
- 証拠を維持する:ポリシー、テストレポート、再テストの確認、および変更ログ。
- 該当する場合は、業界の義務(プライバシーおよび金融セクターのガイダンス)を考慮する。
- 監査または評価中に、コントロールのカバレッジと発見事項の解決を証明できる。
90日間のセキュリティ堅牢化ロードマップ
graph TD
H1["<b>第1-2週:ベースラインとポリシー</b>"]
A1["アプリ、SDK、APIのインベントリ作成<br/>データフローと脅威パスの文書化"]
A2["コード、シークレット、暗号化ポリシーの公開<br/>SASTとシークレットスキャンの有効化"]
H2["<b>第3-6週:コアの堅牢化</b>"]
B1["TLSと証明書ピニングの強制<br/>ローテーションと緊急ピニング解除の文書化"]
B2["認証とセッション管理の堅牢化<br/>ロックアウトとOTPの処理"]
B3["ログの中央集権化と実行時チェックの有効化<br/>Root/ジェイルブレイク/フッキングの検出"]
H3["<b>第7-10週:深度とカバレッジ</b>"]
C1["APIテスト:認可、インジェクション、IDOR"]
C2["ストレージの堅牢化:Keystore/Keychain<br/>暗号化されたレコードと安全な削除"]
C3["ファジングとネガティブテスト<br/>四半期ごとのペンテストサイクルの開始"]
H4["<b>第11-13週:保証とスケール</b>"]
D1["難読化と改ざん防止チェック"]
D2["発見事項の再テストと証拠の維持<br/>最小OSポリシーのレビュー"]
D3["変更ログと最終更新マーカーの公開"]
H1 --> A1 --> A2 --> H2 --> B1 --> B2 --> B3 --> H3 --> C1 --> C2 --> C3 --> H4 --> D1 --> D2 --> D3
classDef phase fill:#D5E4F2,stroke:#333,stroke-width:2px,color:#000,font-weight:bold
classDef task fill:#E8F4F8,stroke:#666,stroke-width:1px,color:#000
class H1,H2,H3,H4 phase
class A1,A2,B1,B2,B3,C1,C2,C3,D1,D2,D3 task
避けるべきよくある落とし穴
- トークンやPIIをプレーンテキストで保存する(ログ、キャッシュ、バックアップ)
- クライアント側の検証のみを信頼する。サーバー側の認可がない
- サードパーティSDKの監査を怠る
- 安全なローテーションや緊急時のピニング解除なしでのピニング
- 脆弱な認可 → IDOR / 権限昇格
- 階層化された防御に対し、単一の実行時チェックに過度に依存する
- 再テストと証拠なしに、ペンテストを完了として扱う
クイックチェック表
| 領域 | 要件 |
|---|---|
| コードとCI | 静的解析 + シークレットスキャン。保護されたブランチと必須のレビュー |
| 認証とセッション | 可能な場合はSMS以外のMFA。ロックアウト。短期トークンと安全なストレージ |
| トランスポート | 最新のTLSの強制。計画的なローテーションと安全なフォールバックを備えた証明書ピニング |
| API | インベントリ。PoLP。レート制限。認可ミドルウェア。一貫したロギング |
| テスト | 自動スキャン + 専門家によるペンテスト。ファジング。証拠を伴う再テスト |
| 実行時 | Root/ジェイルブレイク/フッキング/デバッガー検出。適応的な対応 |
| ストレージ | Keystore/Keychainの使用。暗号化されたレコード。安全な削除。バックアップの保護 |
| 可観測性 | 中央集権化されたログ。アラート。ランブック。定期的な訓練 |
| 更新 | 依存関係とSDKの衛生管理。明確な最小OSポリシー |
| リバースエンジニアリング | 難読化。改ざん防止。整合性チェック。暗号化されたアセット |
| コンプライアンス | マッピングされたコントロール、証拠リポジトリ、変更ログ、および「最終更新」バッジ |