Hello there, ('ω')ノ
🧠 静的診断ってなに?
「静的」とは、アプリを実行せずにソースコードや設定ファイルなどを解析することです。 実行中の挙動を観察する「動的解析」とは対になる考え方ですね。
静的診断のメリットは:
- 実機がなくてもできる
- 複雑な動作でも構造的に見つけられる
- 暗号化設定や認証情報など「隠れたリスク」をコードから把握できる
🔧 使用する主なツール:Javaデコンパイラ
✅ jadx(推奨)
- GUIとCLI両方対応のJava逆コンパイラ
- APKを読み込むだけで、内部のJavaコードをかなり読みやすい形で表示してくれる
公式サイト:https://github.com/skylot/jadx
📦 解析の流れ:APKをコードに戻すまで
✅ 1. APKファイルを準備
- Google Playなどで対象アプリを入手(もしくは開発中のAPK)
✅ 2. jadxでAPKを開く
jadx-gui sample.apk
→ GUIが起動し、左側にJavaのパッケージ一覧が表示されます。
✅ 3. 気になるコードを探して読む
特に次のようなクラスや関数に注目します:
| 狙いどころ | 具体的なキーワード |
|---|---|
| ログイン処理 | login, auth, password |
| 通信処理 | HttpURLConnection, okhttp, Retrofit |
| 暗号化処理 | Cipher, AES, Base64 |
| 許可処理 | onRequestPermissionsResult, Manifest.permission |
| WebView関連 | loadUrl, addJavascriptInterface |
| 秘密情報 | apikey, token, secret などの定数 |
🕵️♀️ 実際の診断ポイント(静的に見つかること)
✅ ハードコードされたAPIキー・パスワード
private static final String API_KEY = "sk_test_xxxx";
→ これはそのまま漏洩につながる
✅ 不適切なWebViewの使い方
webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new JsBridge(), "bridge");
→ JavaScriptインターフェースが有効な場合、任意コード実行のリスクが
✅ 証明書検証のスキップ
TrustManager[] trustAllCerts = ...
→ SSLピンニングや証明書チェックを回避していないか確認
✅ 危険なログ出力
Log.d("login", "password=" + password);
→ 本番環境でログにパスワード出力はNG!
💡 デコンパイル時の注意点
- 完全に元のコードと同じにはならない(特に変数名)
- 難読化されていると、読み解くのが難しくなる
- Kotlinベースのアプリでは
.kt→.javaの変換精度が落ちることもある - ProGuardなどの難読化ツールが有効だと、クラス名が
a.a.a.aなどになる
🛠 MobSFで補助も可能
MobSFはjadxベースで内部解析をしており、GUI上で以下のような情報も確認できます:
- 設定ファイル(AndroidManifest.xml)
- ハードコード検出(Secrets/Keys)
- 暗号APIの使用状況
- 使用権限の一覧と危険性スコア
静的診断のファーストステップとしてMobSF → 次にjadxで深堀りという流れが効率的です。
✅ まとめ
- Javaデコンパイラ(特にjadx)を使うと、APKファイルから内部のJavaコードを読めるようになる
- 静的解析では、実行せずに構造的な脆弱性や秘密情報を見つけることができる
- 通信処理・ログ出力・暗号化設定・WebViewの使い方などを重点的にチェックしよう
- MobSFと組み合わせると、よりスムーズに診断を進められる
Best regards, (^^ゞ