コース目次 / 第3章

マニフェストの誤設定を見つける

apktool dで逆コンパイルしたAndroidManifest.xmlから、allowBackup・usesCleartextTraffic・無防備なexportedコンポーネントの3つの誤設定を読み取ります。それぞれの実害を理解します。

第3章 / 全6章目安 約11分この章のゴール: マニフェストの3つの誤設定を読み取り、それぞれの実害を説明できるようになる

AndroidManifest.xml は、apktool で APK を逆コンパイルすれば、誰でも平文で読めます。この章は、そこに書かれた3つの誤設定を読み取ります。

マニフェストを、読み返す

apktool d -f -o decompiled vulnnotes.apk
cat decompiled/AndroidManifest.xml
<manifest ... package="com.example.vulnnotes" ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:label="VulnNotes" android:allowBackup="true" android:usesCleartextTraffic="true">
        <activity android:name=".MainActivity" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".AdminActivity" android:exported="true" />
    </application>
</manifest>

誤設定1 — allowBackup="true"

allowBackup は、「このアプリのデータを、OS のバックアップ機構でまるごと保存してよいか」を決めます。true(既定値でもあります)にしておくと、USBデバッグが有効な端末では、adb backup のようなコマンドで、アプリの保存データを丸ごと端末外に取り出せます。中に暗号化していないトークンやユーザーデータがあれば、そのまま流出します。機密性の高いデータを扱うアプリでは、false にするのが基本です。

誤設定2 — usesCleartextTraffic="true"

sec-http・sec-burp で、HTTPS の意味(通信を暗号化し、なりすましを防ぐ)を学びました。usesCleartextTraffic=“true” は、暗号化されていない平文の HTTP 通信を許可する設定です。これが有効だと、Wi-Fi を共有する誰かに通信を覗かれたり、割り込まれたりする余地が生まれます。Android 9(API 28)以降は既定で false(平文禁止)ですが、この練習用APKのように明示的に true にする実装が、実際にも見られます。

誤設定3 — 無防備な exported コンポーネント

2つの <activity> を見比べてください。MainActivity は起動画面(intent-filter で LAUNCHER に指定)なので exported=“true” が必要です——ホーム画面から起動できる必要があるからです。
でも AdminActivity は、起動画面でもなく、他に何の説明もないのに exported=“true”になっています。これは——他のどんなアプリからでも、この画面を直接起動できるということです。もし AdminActivity が管理者向けの機能(実際の名前が示唆するように)を持っていたら、悪意あるアプリが、あなたのアプリの正規の画面遷移やログインを一切通らずに、直接その機能を呼び出せてしまいます。sec-authz で見た「垂直の権限昇格」「フォースブラウジング」の、モバイル版です。

読み方のコツ — マニフェストは、短時間で全体を見渡せる

コードは何千行にもなりますが、マニフェストは、たいてい数十〜数百行で収まります。診断の最初の一歩として、マニフェスト全体にまず目を通すのは、費用対効果の高い作業です。allowBackup・usesCleartextTraffic・各コンポーネントの exported は、grep一発でも拾えます。

持ち帰る一言

マニフェストは、公開された設計図。 allowBackupはバックアップ経由の抽出、usesCleartextTrafficは平文通信、無防備なexportedは他アプリからの直接起動——どれも、この短いXMLに書かれた一行が、そのまま守りの強さです。次の章で、この3つと前章の秘密を、まとめて直します。

こうなっていればOK

卒業まであと2章です。

この章はまだ完了していません。