Hello there, ('ω')ノ
✅ バックドアとは?
定義:
開発者がテストや保守の目的でアプリに組み込んだ隠し機能。
通常は使われないパスや特定のコマンド、入力によって有効になります。
🔍 想定されるバックドアのパターン
| タイプ | 例 |
|---|---|
| 隠しアクティビティ | 特定のIntentで起動する“隠し画面” |
| 裏パスワード | 特定の文字列を入力すると認証をスキップ |
| ハードコードされた管理者ID | 特定IDでログインするとフル権限になる |
| デバッグモードONスイッチ | 特定のBroadcastやFlagで有効化 |
🧪 Step 1:MobSFやAPKToolでコード構造を調査
調査ポイント:
MainActivityやLoginActivityにif文で裏条件がないか?Intentを受け取って動作するAdminActivityのような名称のクラスがないか?BuildConfig.DEBUG == true時に実行される処理が隠されていないか?
例:怪しいコード発見!
if (username.equals("admin") && password.equals("letmein")) { // 通常ログイン処理をスキップ moveToAdminPage(); }
👉 ハードコードされた管理用バイパスを確認。これは明確なバックドアです。
🧪 Step 2:DrozerでExportedなコンポーネントを再チェック
run app.package.attacksurface com.example.notepadapp
→ com.example.notepadapp.AdminActivity が exported=true で登録されていることを発見。
run app.activity.start --component com.example.notepadapp/.AdminActivity
👉 通常の操作ではたどり着けない“管理者画面”が起動してしまう
🧪 Step 3:Logcat・フックツール(Frida)で隠し処理を探る
Fridaを使って、LoginActivity にフックし、ログイン判定を監視:
Java.perform(function() {
var login = Java.use("com.example.notepadapp.LoginActivity");
login.checkLogin.implementation = function(u, p) {
console.log("[*] Trying username: " + u);
console.log("[*] Trying password: " + p);
return this.checkLogin(u, p);
};
});
→ 特定のパスワード(例:letmein)を入力したときだけ挙動が変わることが確認できる。
📋 今回の演習で発見されたバックドア一覧
| 機能 | 内容 | 想定されるリスク |
|---|---|---|
裏パスワード letmein |
通常認証を回避 | 誰でも管理者権限を奪取できる |
| AdminActivity(隠し画面) | Intentから直接起動可能 | セキュリティ設定やデータに直接アクセス可能 |
フラグ debug=true で裏機能有効化 |
起動オプションで開発用UIが出現 | 攻撃者が機能を発見・操作する可能性あり |
✅ 対応策(開発者に伝えるべき内容)
| 対象 | 対策案 |
|---|---|
| ハードコードの裏口 | リリースビルドでは必ず削除 |
| Exportedな隠しActivity | exported="false" + android:enabled="false" に設定 |
| デバッグスイッチ | BuildConfig.DEBUG で本番ビルドでは無効化 |
| ログ出力 | バックドアに関するログは出力しない、または開発中のみ |
✅ まとめ
- バックドアは「うっかり残ったコード」でも、攻撃者には「最大のチャンス」になる
- Drozer, Frida, MobSF, Logcat を活用することで見えない機能を見える化できる
- セキュア開発の観点では、「不要なコードはデプロイしない」が鉄則
Best regards, (^^ゞ