Hello there, ('ω')ノ
🔗 URLスキームとは?
URLスキームとは、特定のアプリを起動したり、特定の画面に直接ジャンプしたりするためのURL形式のインテント呼び出しの仕組みです。
例:
myapp://user/profile?id=12345
このようなスキームが設定されていると、他のアプリやブラウザからこのリンクをタップするだけで、自社アプリのユーザー画面を直接開けたりします。
非常に便利な機能ですが、適切な制御がされていないと深刻な問題を引き起こします。
⚠️ どんな問題が起こるの?
| 問題タイプ | 内容 |
|---|---|
| 情報漏洩 | URLパラメータで送られた機密情報(例:トークン、ID)がログや他アプリから読み取られる |
| 意図しない画面遷移 | 攻撃者が細工したURLを送信し、アプリを異常な状態で起動させる |
| 不正な操作の実行 | データ削除や決済などがスキーム経由で勝手に呼び出せてしまう |
| CSRF風攻撃 | 外部アプリがスキームを使って操作を間接的に強制する |
💥 実例:情報漏洩パターン
✅ 1. ユーザートークン付きスキーム
myapp://auth/callback?token=abc123xyz
このURLをログ出力してしまうと:
Log.d("AuthCallback", "Token: " + token);
→ 他のアプリや攻撃者により、ログファイルからトークンが盗まれる可能性があります。
✅ 2. スキームを誰でも使えるようにしている
AndroidManifest.xml:
<intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="myapp" /> </intent-filter>
→ この設定だけだと、誰でもそのスキームを呼び出せる状態になります。
🧪 診断ポイント(静的・動的)
🔍 静的解析(Manifestのチェック)
intent-filterによるandroid:scheme定義を確認- アプリが処理するURIのパス・パラメータに検証・認証の処理があるか?
🔍 動的解析(実機テスト)
- ADBを使ってカスタムスキームを呼び出す:
adb shell am start -a android.intent.action.VIEW -d "myapp://admin/reset"
- 認証不要で操作が実行されてしまう場合、設計ミスや検証不足の可能性があります。
🛡️ 対策方法
| 対策 | 内容 |
|---|---|
| パラメータの検証 | スキーム経由で渡された値(id、tokenなど)は必ずサーバー側でも再確認 |
| アクセス制限 | 操作に認証(ログイン状態やトークンチェック)を組み込む |
| ログ出力の制御 | URIやトークンを Log.d() などで出力しない |
| インテントフィルタの範囲を絞る | android:host や android:pathPrefix を使って受け取るURIを制限する |
| Android 11以降の制限を活用 | android:exported="false" などで外部呼び出しを明示的に制限 |
🧠 よくある誤解と注意点
| 誤解 | 実際は… |
|---|---|
| スキームは自分のアプリしか使えない | 他のアプリや攻撃者もURLを発行できる |
| URIに書かれた値は安全 | ログや履歴に残ることもあり、誰でも読める場合もある |
| スキームは便利なショートカット程度 | しっかり認証・検証されていないと攻撃の入口になる |
✅ まとめ
- URLスキームはアプリ連携や画面遷移をスムーズにする便利な仕組み
- しかし、適切な制限・認証がなければ、情報漏洩や不正操作のきっかけに
- パラメータの検証・ログ制御・アクセス制限が最小限の防衛線
- 実機で
adb shell am startを使って動的検証することで、再現と診断が可能
Best regards, (^^ゞ