Shikata Ga Nai

Private? There is no such things.

第25回:Javaコードに埋め込まれた秘密情報を見抜くには?

Hello there, ('ω')ノ

🔐 なぜ「埋め込み」が危険なのか?

アプリ開発中、つい便利さからAPIキーやパスワードをソースコードにベタ書きしてしまうことがあります。

String apiKey = "sk_test_51Hh...";
String password = "admin1234";

開発段階では便利でも、APKとしてビルドされた時点で誰でも取り出せる状態になっています。 つまり「アプリを配布した時点で秘密はバレている」と考えなければなりません。


🛠 何が「秘密情報」と見なされるのか?

種類
APIキー・トークン Stripe, Firebase, AWS, Google Mapsなどのキー
パスワード・認証情報 初期設定用や管理者パスワード
暗号化キー・IV AESキー、初期化ベクトル
サーバー情報 内部向けのエンドポイントURL、DB接続情報など

これらがJavaコードやリソースファイル(strings.xml など)にハードコードされていたら要注意です。


🔍 秘密情報の見つけ方:静的解析のすすめ

✅ 1. MobSFでの自動スキャン

MobSFでは、APKをアップロードするだけで「Hardcoded Secret Detection」レポートが生成されます。 以下のような結果が確認できます:

  • Hardcoded API Key found in MainActivity.java
  • Base64 encoded string suspicious: "c2VjcmV0MTIz" → Base64でエンコードされているだけの可能性あり

✅ 2. JadxやAPKToolでコードから直接探す

APKをJadxでデコンパイルして、以下のキーワードで検索します:

よく使われる秘密情報のパターン:

  • "api_key"
  • "secret"
  • "token"
  • "password"
  • "authorization"
  • "base64"
String token = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI...";

→ JWTのようなトークンがそのまま埋め込まれていることも。


✅ 3. grepでソースコードを一括検索(Linux/WSLなど)

grep -rniE 'apikey|token|secret|password' ./source/

→ 特定の文字列が含まれる行番号・ファイルが一覧で表示されます。


✅ 4. Base64データにも注意!

開発者は「秘密情報を暗号化してるつもり」で、実はただBase64エンコードしているだけのケースも多いです。

String encoded = "U29tZVZlcnlTZWNyZXRWYWx1ZQ==";

echo "U29tZVZlcnlTZWNyZXRWYWx1ZQ==" | base64 -d で簡単に復元できます。


🧠 診断時のチェックポイント

チェック項目 意図
固定文字列で秘密情報が書かれていないか "..." でAPIキーやトークンを指定していないか
リソースファイル内に不審なキーがないか strings.xml に秘密情報が定義されていないか
Base64っぽい文字列が含まれていないか 末尾が == などになっている文字列に注意
デバッグ用コードがそのまま残っていないか テスト用の秘密情報がリリースに含まれていないか

💡 開発時の対策ポイント

  • 秘密情報はコードに埋め込まず、バックエンド側で管理する
  • APIキーやトークンは、アプリ起動時に取得して使用する(動的に発行)
  • デバッグビルドと本番ビルドでビルドフレーバーを分ける
  • MobSFなどで定期的に静的解析して検出漏れを防ぐ

✅ まとめ

  • JavaコードにAPIキーやトークンを直接書くのは超NG行為
  • MobSFやjadxを使えば、埋め込み済みの秘密情報を発見できる
  • Base64や変数名にも注意して、目立たない埋め込みも見逃さないことが重要
  • セキュリティ対策の第一歩は「コード内に秘密を残さない」ことから!

Best regards, (^^ゞ