Как отключить dm-verity на Android с ПЗУ пользовательского типа сборки?

У меня есть Android-устройство One Plus 6T с ПЗУ типа сборки user. Это устройство рутировано с помощью Magisk, и я хочу отключить его dm-verityна этом устройстве. Я пытался запустить adb disable-verity, но я получил сообщение об ошибкеverity cannot be disabled/enabled - USER build

Есть ли способ отключить это?

Цель: Хотите разместить настроенный sepolicyфайл в system_rootкаталоге. Я попытался сделать это с помощью следующих команд:

C:\Users\GPU-Test>adb shell
OnePlus6T:/ $ su
OnePlus6T:/ # mount -o rw,remount /system_root
OnePlus6T:/ # cp /sdcard/selinux_policy_modified /system_root/sepolicy
cp: /system_root/sepolicy: Permission denied
1|OnePlus6T:/ # cp -f /sdcard/selinux_policy_modified /system_root/sepolicy
cp: /system_root/sepolicy: No such file or directory
1|OnePlus6T:/ # ^C
130|OnePlus6T:/ # exit
130|OnePlus6T:/ $ exit

C:\Users\GPU-Test>adb disable-verity
verity cannot be disabled/enabled - USER build

Также пытался отключить Preserve force encryptionи Preserve AVB 2.0/dm-verityустановить флажок, но все же приведенные выше команды имеют тот же результат. Также при перезагрузке эти флажки снова включаются автоматически.

не могли бы вы уточнить, на что нацелен ваш вопрос, потому что обычно вы уже исправили свое устройство против dm-verity (в Magisk Manager есть флажок)?
Я добавил более подробную информацию о том, почему я хочу это сделать и что я пробовал.
почему бы не использовать /вместо /system_root?
@alecxs на устройствах с правами root Magisk монтирует виртуальный диск восстановления в /, а не systemв раздел. /является энергозависимой файловой системой.
@IrfanLatif спасибо, «восстановление» было недостающей частью! Теперь эта статья имеет для меня смысл: «Magisk монтирует систему в «/ system_root» и привязывает монтирование «/ system_root/system» к «/ system». " xda-developers.com/magisk-google-pixel-3-pixel-3a-android-q
@alecxs с Q снова изменились. Теперь systemраздел будет монтироваться по адресу, /но файлы, которые будут изменены/добавлены (например init, init.rc, , /sbin), будут перекрываться с помощью монтирования привязки. В каждом случае цель должна быть бессистемной и необнаруживаемой .
Я думаю, что мне нужно поместить sepolicyфайл непосредственно в system.img, а затем прошить его с помощью fastboot system system.imgкоманды. Я перепробовал множество похожих на учебники china-devices.com/forum/index.php?threads/… , но получаю сообщение об ошибке типа «Неверный формат разреженного файла в заголовке magi\n Не удалось прочитать разреженный файл». Я думаю, что все эти учебники устарели для новых образов Android. Ребята, у вас есть идеи о каком-либо инструменте, который может извлечь файлы system.img?
Изменение @VatishSharma system.imgне имеет большого значения, но это не имеет значения. Устройство не будет загружаться с измененным, system.imgесли dm-verityоно включено. Позвольте мне написать вам ответ, что вы можете попробовать отключить dm-verity.

Ответы (2)

Я собираюсь дать общий обзор того, как dm-verityи связанные с этим вещи работают на Android в соответствии с моими ограниченными знаниями. Ситуация может отличаться на разных устройствах и ПЗУ.

КАК ОБЕСПЕЧИВАЕТСЯ DM-VERITY?

dm-verity( Проверенная загрузка и AVB ), а также dm-crypt( FDE ) являются целями device-mapperфункции ядра Linux. dm-verityпроверяет целостность каждого блока по мере их считывания с блочного устройства; применяется в init_first_stageсоответствии с fs_mgr_flagsнабором в fstab ( 1 ) . На устройствах с правами root ( A/Bи non-A/B) ядро ​​исправлено , чтобы принудительно установить истину при монтировании /systemи /vendorесли в дереве устройств fstab (dtb) обнаружены verify/ флаги. прозрачно расшифровывает/шифрует данные при чтении/записи с/на блочное устройство. FBE основан на другой структуре ядра.avb
dm-cryptfscrypt; но оба управляются vold(которые работают как собственные службы), если fs_mgr_flagsсодержат файлы voldmanaged.

ГДЕ ФСТАБ?

fstabтрадиционно был файлом в Linux для указания файловых систем, которые должны быть смонтированы при загрузке. Это основной компонент fs_mgrфункциональности Android.

В выпусках до Oreo fstabбыл в формате ramdisk. С Treble он был перемещен в /vendor(или /system/vendor), а записи fstab для systemи vendorodm) перемещены в Blob дерева устройств ( dtb). Ядро экспортирует dtb fstabзаписи в каталог дерева устройств по адресу /proc/device-tree/firmware/android.

Некоторые OEM-производители также вставляют fstabили odmразделяют nvdata.

Источник: Конфигурация устройства хранения Android.

ГДЕ ДТБ?

Дерево устройств — это структура данных для описания оборудования, которое не может быть обнаружено ядром. Источник дерева устройств ( dts) можно преобразовать в dtb(бинарный большой двоичный объект DT) и наоборот с помощью dtc. DTB загружается загрузчиком во время загрузки и передается ядру, чтобы оно могло обнаруживать оборудование и соответственно создавать узлы устройств.

DTB:

  • Добавляется к ядру zImageили Image.gzв boot.img ( 2 ) . Его можно отделить от gzipархива с помощью split-appended-dtb (sadtb).
  • Или в dtboразделе, как это делают некоторые OEM-производители. Это можно проверить с помощью:

    ~# ls -l /dev/block/bootdevice/by-name/dtbo*
    ~# grep -C5 PARTNAME=dtbo /sys/dev/block/*/uevent | grep DEVNAME | sed 's/.*=//; s|^|/dev/block/&|'
    
  • Или в конце boot.imgпосле 2-го этапа, или в odmразделе (редко, некоторые OEM-производители).

non-A/BКроме того , если устройство dtb(из boot.imgи/или dtboраздела) также добавляется в recovery.imgраздел DTBO после заголовка, ядра, виртуального диска и 2-го этапа ( 3 ) . Однако это не имеет значения для обычной загрузки. Но если устройство также system-as-root, Magisk необходимо установить в этот раздел восстановления, так как он boot.imgне содержит ramdisk ( 4 ) .

В случае, если DTB не добавлен к ядру, dtb(s)преобразуются в dtb.imgиспользование mkdtimg. Тот же инструмент может вернуть изображение.

Источник: Реализация DTO

КАК ОТКЛЮЧИТЬ DM-VERITY?

В userdebugПЗУ dm-verityможно отключить с помощью adb. Он изменяет магический номер истинного блока метаданных ( 5 , 6 ) , который записывается после последнего блока файловой системы на блочном устройстве ( systemили vendor) ( 7 ) . Цитата отсюда :

отсутствие этого магического числа остановит процесс проверки

В случае AVB adbизменяет , vbmeta headerчтобы отключить проверку изображения хеш-дерева ( 8 , 9 ) . Цитата отсюда :

если AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLEDфлаг установлен в vbmeta верхнего уровня, то онandroidboot.veritymode отключен

В userсборках ro.debuggableесть 0и adbdне работает как root. Также есть другие отличия, такие как ALLOW_ADBD_DISABLE_VERITY, поэтому adbне отключается dm-verity. Другой подход заключается в удалении флага verifyor ( 10 ) из . Цитата отсюда :avb fstab

Чтобы проверить раздел...
...
В fstab для соответствующей записи добавьте verifyв fs_mgrфлаги.

Точно так же, чтобы удалить шифрование, forceencrypt=или forcefdeorfbe=необходимо fileencryption=заменить на encryptable=. Однако шифрование нельзя удалить без сброса настроек (также FBE?), поэтому снятие флажка Preserve force encryptionв приложении Magisk ничего не даст.

Некоторые OEM-производители также используют флаг и свойство на устройствах с включенной функцией.support_scfs fs_mgrro.config.dmverity=truedm-verity

Есть также некоторые эксплойты , обнаруженные в реализации загрузчика и adb некоторых OEM-производителей, которые можно использовать для отключения dm-verityна уязвимых устройствах. Однако такие недостатки безопасности обычно со временем исправляются с помощью обновлений от OEM-производителей.

ВАРИАНТ 1
Установите параметры в файле конфигурации перед установкой Magisk:

~# echo 'KEEPVERITY=false' >/cache/.magisk
~# echo 'KEEPFORCEENCRYPT=true' >>/cache/.magisk

Если установлен, после снятия отметки Preserve AVB v2.0/dm-verityв приложении необходимо переустановить Magisk. Цитата отсюда :

в Magisk Manager «Удалить > Восстановить образы», ​​чтобы восстановить образы, установите флажок «Сохранить AVB 2.0/dm-verity» в «Дополнительных настройках», затем переустановите Magisk через приложение.

ВАРИАНТ 2
Используйте некоторые dm-verityпочтовые индексы отключения, подобные этому .

ВАРИАНТ 3.
Выясните, где находятся fstabзаписи /systemи /vendorна вашем устройстве.

Если в ramdisk(до высоких частот):

  • Извлеките ramdisk, измените fstabи перепакуйте.
  • Или исправить ramdiskнапрямую:

    ~# magiskboot cpio ramdisk.cpio 'patch false true'
    

Если в dtb:

  • Если добавлено к ядру:
    • Извлекатьboot.img
    • Разделение добавленоdtb(s)
    • Патч dtb(s).
    • Присоединить dtb(s)к ядру
    • Перепаковатьboot.img
  • Если в dtboразделе или boot.imgпосле 2-го этапа, исправьте dtb.imgи запишите обратно в раздел или boot.img.

Как распаковать/перепаковать образ Boot или Recovery и Ramdisk?
Используйте АИК или magiskboot.

Как пропатчить dtb? Исправление
напрямую с помощью или magiskbootпреобразование вручную dtbв формат .dtsdtsdm-veritydtsdtb

СВЯЗАННЫЙ:

В устройствах SAR, запущенных с Android 10, я собрал ядро ​​с флагами avb (флаг проверки не найден), удаленными из записей fsmgr_flags, и сделал его разрешающим. Также очистите vbmeta с отключенным флагом проверки. Достаточно ли отключить dm-verity? (Я не могу проверить это, так как twrp не обновлен до Android 10, и я еще не знаю, как смонтировать динамический раздел с корневой оболочкой adb в рекавери)
@VatishSharma Извините, я не тестировал Android 10, поэтому не могу ничего сказать наверняка.
У вас есть идея монтировать динамические разделы (я сделал twrp и получил рутированную оболочку adb, но да, она не обновлена ​​для динамических разделов и поэтому не имеет функций монтирования)?
@VatishSharma без понятия.

Вы можете просто отредактировать корневой пакет Magisk, чтобы ТОЛЬКО отключить флаг dm-verity. Это буквально просто комментирование нескольких строк скриптов Magisk, поскольку функциональность изначально присутствует в Magisk. Вот ссылка на такой пакет: Скачать magisk-onlynoveritypatch.zip Загрузитесь в twrp, установите из zip и выберите этот zip.

Спасибо за обмен. к сожалению, скачивать могут только зарегистрированные пользователи. и трудно зарегистрироваться, потому что нет английской капчи :(