Shikata Ga Nai

Private? There is no such things.

第27回:Javaデコンパイラを使った静的診断

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, (^^ゞ