🥚

Android 14でもプロキシツールで通信取得する

2024/03/18に公開

はじめに

  • Android 14(APIレベル34)では、システムで信頼される証明機関証明書の取り扱いに変更が入り、格納先が変更されました。
  • com.android.* は下記の記述の通り、Android側で予約されており、通常は性質上変更できない箇所となっています。

    AOSP APEX 用に予約されています。会社やデバイスに固有ではありません。

変更での問題

  • システム的に予約された領域の /apex/com.android.* を書き込み可能へリマウントできません。
    • tmpfs(Temporary File System)形式でのリマウントも、変更後のデータを参照せず、元の証明書データへアクセスします

対策

  • 下記のスクリプトを作成して、必要な作業を実施させます。
    • 一旦 /apex/com.android.conscrypt/cacerts/ にあるシステム証明書を、別箇所へ対比させます
    • /apex を手動でリマウントして、 PRIVATE プロパゲーションを削除して、書き込み可能に変更します
    • 書き込み可能にリマウントした /apex/apex/com.android.conscrypt/cacerts/ へ、システム証明書とプロキシ証明書を戻します
android14.txt
# 1. システム証明書の一時退避用ディレクトリを作成
mkdir -p -m 700 /data/local/tmp/tmp_ca

# 2. 現在のシステム証明書を1.のディレクトリへコピー
cp /apex/com.android.conscrypt/cacerts/* /data/local/tmp/tmp_ca

# 3. /system/etc/security/cacerts をtmpfs形式でマウント
mount -t tmpfs tmpfs /system/etc/security/cacerts

# 4. 2.でコピーしたシステム証明書を移動
mv /data/local/tmp/tmp_ca/* /system/etc/security/cacerts/

# 5. Burp Suiteなどのプロキシツールの証明書のハッシュ値ファイルを移動
cp /path/to/proxy_hash.0 /system/etc/security/cacerts/

# 6. システム証明書として利用してもらうための各種設定(権限、SELinuxラベル)
chown root:root /system/etc/security/cacerts/*
chmod 644 /system/etc/security/cacerts/*
chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*

# 7. ZygoteプロセスのPIDを取得
ZYGOTE_PID=$(pidof zygote || true)
ZYGOTE64_PID=$(pidof zygote64 || true)

# 8. 新規に起動したアプリがZygoteのマウント先の証明書を確認できるようにする
for Z_PID in "$ZYGOTE_PID" "$ZYGOTE64_PID"; do
  if [ -n "$Z_PID" ]; then
    nsenter --mount=/proc/$Z_PID/ns/mnt -- \
    /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
  fi
done

# 9. 実行中アプリに対してマウントするようにする
# 9-1. 親プロセスがZygoteであるプロセスのPIDを取得
APP_PIDS=$(
  echo "$ZYGOTE_PID $ZYGOTE64_PID" | \
  xargs -n1 ps -o 'PID' -P | \
  grep -v PID
)

# 9-2. 各アプリに対してマウントネームスペースへ注入
for PID in $APP_PIDS; do
  nsenter --mount=/proc/$PID/ns/mnt -- \
  /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts &
done

# 9-3. 完了待ち
wait

echo "System certificate injected"
android14.sh
#!/bin/bash

adb devices

adb shell < android14.txt
sleep 3
  • 下記のコマンドを実行します。

    • chmod 755 android14.sh && ./android14.sh
  • 実行後、システム証明書一覧を確認すると、Burp Suiteの証明書が追加されています。

  • Burp Suiteを通した状態でHTTPSのサイトを開くと、下記のように、正常に表示され、Burp Suite上で通信取得できることが確認できます。

    • Android
    • Burp Suite

補足

  • Androidの初期化には init プロセスが関与しており、オペレーティングシステムの起動時に Zygote プロセスが開始されます。
    • プライベートな /apex マウントを含む新しいマウント名前空間でアプリのプロセスを起動して、他のプロセスから分離されます。
    • /apex ディレクトリ内の変更が、他のプロセスへ影響しなくなります。
  • 現状、これに対して上記の作業をすることで、回避策として機能します。
    • システムクラッシュと密接な変更処理のため、各コマンド実行ではなくスクリプトとして実行させる必要があります。

参考

Discussion