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