AgentSkillsCN

android-security-review

安卓安全审查

SKILL.md

android-security-review

⚠️ このSkillはレビュー専用です。コード生成ではなく、レビュー結果の出力に使用します。

適用トリガ(いつ使うか)

  • PRやコード差分のセキュリティレビューを行うとき
  • リリース前のセキュリティ監査を行うとき
  • OWASP Mobile Top 10 に基づく脆弱性チェックを行うとき
  • セキュリティインシデントの原因調査を行うとき

出力形式(どう返すか)

必ず以下のフォーマットで出力すること:

markdown
## セキュリティレビュー結果

### 1. 変更点サマリ(3行以内)
- [変更内容を簡潔に記載]
- [主要な変更ポイント]
- [影響範囲]

### 2. リスク一覧

| # | 重大度 | カテゴリ | 該当箇所 | 根拠 |
|---|--------|---------|----------|------|
| 1 | High/Med/Low | IPC/Permission/Data/etc | file.kt:123 | [具体的な理由] |

### 3. 攻撃シナリオ

#### リスク #1: [リスク名]
- **成立条件**: [攻撃が成立するための条件]
- **影響範囲**: [攻撃成功時の影響]
- **攻撃手順**:
  1. [手順1]
  2. [手順2]

### 4. 推奨修正

#### リスク #1: [リスク名]
- **修正案**: [具体的な修正方法]
- **差分案**:
\`\`\`diff
- old code
+ new code
\`\`\`

### 5. 追加テスト観点

- [ ] [セキュリティ回帰テスト項目1]
- [ ] [セキュリティ回帰テスト項目2]

### 6. 総合判定

- [ ] ✅ 承認(セキュリティ上の問題なし)
- [ ] ⚠️ 条件付き承認(Low/Med 修正後)
- [ ] ❌ 要修正(High が1つ以上)

代表ユースケース

  1. PR/MRのセキュリティレビュー
  2. 機密データ取り扱いの監査
  3. 公開コンポーネントの脆弱性確認
  4. ネットワーク通信のセキュリティ検証
  5. サプライチェーンセキュリティ評価

概要

Androidアプリケーションのセキュリティレビューを実施するためのレビュー専用Skillです。コード差分やPRに対してセキュリティリスクを評価し、上記フォーマットで結果を出力します。


レビュー観点(最低限チェックすべき項目)

1. IPC(プロセス間通信)

exported components

  • Activity/Service/Receiver/Provider の exported 属性が明示されているか
  • exported=true のコンポーネントに適切な権限保護があるか
  • 不要な公開コンポーネントがないか

AIDL / Binder

  • 呼び出し元の UID/PID 検証が実装されているか
  • Binder.getCallingUid() による検証が省略されていないか
  • DeathRecipient が適切に実装されているか

PendingIntent

  • FLAG_IMMUTABLE または FLAG_MUTABLE が明示されているか
  • 暗黙的 Intent を PendingIntent に渡していないか
  • getActivity/getService/getBroadcast の使い分けが適切か

Broadcast

  • 機密データを含む Broadcast に権限保護があるか
  • LocalBroadcastManager または明示的 Broadcast を使用しているか
  • 受信側で送信元の検証を行っているか

2. Permission(権限)

保護レベル

  • 機密操作に適切な保護レベル(signature等)が設定されているか
  • カスタム権限の protectionLevel が適切か

チェック漏れ

  • 機密操作前に権限チェックが実装されているか
  • checkCallingPermission / checkSelfPermission が適切に使用されているか

署名権限の濫用

  • 署名権限を不適切に緩和していないか
  • signature|privileged 権限の要求が妥当か

3. Data(データ保護)

ログ

  • ログに機密情報(PII、トークン、パスワード)が出力されていないか
  • リリースビルドでデバッグログが無効化されているか

PII(個人識別情報)

  • PII が暗号化されて保存されているか
  • PII の収集・送信に同意を取得しているか

暗号化

  • 機密データが適切に暗号化されているか
  • 弱い暗号アルゴリズム(DES, MD5, SHA1)を使用していないか
  • 暗号鍵がハードコードされていないか

KeyStore

  • 機密情報の保存に Android KeyStore を使用しているか
  • EncryptedSharedPreferences を使用しているか

バックアップ

  • android:allowBackup が適切に設定されているか
  • 機密データがバックアップから除外されているか

外部ストレージ

  • 機密データを外部ストレージに保存していないか
  • 外部ストレージ使用時のリスクが考慮されているか

4. Web/Network(通信)

TLS

  • すべての通信が HTTPS を使用しているか
  • android:usesCleartextTraffic="false" が設定されているか
  • TLS 1.2 以上を強制しているか

証明書ピンニング

  • 証明書ピンニングが必要な場合、実装されているか
  • ピンニング失敗時の処理が適切か

TODO: 証明書ピンニング方針を記載(必須/推奨/不要の判断基準)

クリアテキスト

  • HTTP(非HTTPS)通信が存在しないか
  • Network Security Config が適切に設定されているか

SSRF

  • ユーザー入力を URL に使用する場合、ホワイトリスト検証があるか
  • 内部ネットワークへのアクセスが防止されているか

5. Input(入力検証)

Intent 注入

  • 外部 Intent のデータを検証しているか
  • Deep Link パラメータを検証しているか
  • getParcelableExtra 等の戻り値を検証しているか

URI / Path traversal

  • ファイルパスにユーザー入力を使用する場合、正規化・検証しているか
  • ../ 等のパストラバーサルを防止しているか
  • ContentProvider の URI を検証しているか

コマンド実行

  • Runtime.exec() にユーザー入力を渡していないか
  • ProcessBuilder にユーザー入力を渡していないか

WebView

  • JavaScript が不要な場合は無効化されているか
  • @JavascriptInterface の使用が最小限か
  • loadUrl に外部 URL を渡す場合の検証があるか
  • ファイルアクセス設定が適切か

6. Supply chain(サプライチェーン)

依存関係

  • 既知の脆弱性を含むライブラリを使用していないか
  • 依存関係が信頼できるリポジトリから取得されているか
  • 依存関係の更新が適切に行われているか

ProGuard/R8

  • リリースビルドで難読化が有効か
  • セキュリティ関連クラスが適切に難読化されているか

debuggable

  • リリースビルドで android:debuggable="false"
  • デバッグ用コードが残存していないか

テスト用コード残存

  • テスト用のバックドアやモック設定が残存していないか
  • デバッグ用のログ出力が残存していないか
  • BuildConfig.DEBUG の条件分岐が適切か

重大度の判定基準

High(高)

  • 認証・認可のバイパスが可能
  • 機密データの漏洩・改ざんが可能
  • リモートコード実行が可能
  • 権限昇格が可能

Medium(中)

  • 条件付きで機密データにアクセス可能
  • ローカル攻撃でのデータ漏洩
  • DoS(サービス拒否)攻撃が可能
  • 情報漏洩(非機密情報)

Low(低)

  • 情報の間接的な漏洩
  • ベストプラクティスからの逸脱
  • 将来的なリスクの可能性
  • 防御多層化の不足

カテゴリ略称

略称正式名
IPCInter-Process Communication
PERMPermission
DATAData Protection
NETNetwork/Web Security
INPUTInput Validation
SUPPLYSupply Chain

参考リンク

TODO: 社内セキュリティポリシー、インシデント報告フローへのリンクを追加 TODO: 証明書ピンニング方針ドキュメントへのリンクを追加