¿Cómo deshabilitar dm-verity en Android con ROM de tipo de compilación de "usuario"?

Tengo un dispositivo Android One Plus 6T que tiene una ROM de tipo compilación user. Este dispositivo está rooteado con Magisk y quiero deshabilitarlo dm-verityen este dispositivo. Intenté ejecutar adb disable-veritypero recibí un error que decíaverity cannot be disabled/enabled - USER build

¿Hay alguna forma de desactivar esto?

Objetivo: desea colocar sepolicyun archivo personalizado en el system_rootdirectorio. He intentado hacerlo con los siguientes comandos:

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

También intenté deshabilitar Preserve force encryptiony Preserve AVB 2.0/dm-veritycasilla de verificación, pero aún así los comandos anteriores tienen el mismo resultado. También al reiniciar, estas casillas de verificación se habilitan nuevamente automáticamente.

¿Puede ser más específico a qué se dirige su pregunta, porque generalmente ya ha parcheado su dispositivo contra dm-verity (Magisk Manager tiene una casilla de verificación para)?
He agregado más detalles sobre por qué quiero hacer esto y lo que he intentado.
¿ Por qué no usar /en lugar de /system_root?
@alecxs en dispositivos del sistema como raíz Magisk monta el ramdisk de recuperación en /, no systemen la partición. /es un sistema de archivos volátil.
@IrfanLatif gracias, ¡la "recuperación" era la pieza que faltaba! Ahora este artículo tiene sentido para mí "Magisk monta el sistema en '/ system_root' y vincula el montaje '/ system_root/system' a '/ system.' " xda-developers.com/magisk-google-pixel-3-pixel-3a-android-q
@alecxs con Q las cosas han vuelto a cambiar. Ahora systemla partición se montará en /pero los archivos que se modificarán/agregarán (p. ej. init, init.rc, /sbin) se superpondrán mediante montajes de enlace. En cada caso, el objetivo debe ser sin sistema y sin detección .
Creo que necesito colocar sepolicyel archivo directamente system.imgy luego flashearlo mediante fastboot system system.imgun comando. Probé muchos tutoriales como china-devices.com/forum/index.php?threads/… pero aparece un error como "Formato de archivo disperso no válido en el encabezado magi \n Error al leer el archivo disperso". Creo que todos estos tutoriales están obsoletos para las nuevas imágenes de Android. ¿Tienen alguna idea sobre alguna herramienta que pueda extraer system.img?
La modificación de @VatishSharma system.imgno es gran cosa, pero no hace ninguna diferencia. El dispositivo no se iniciará con modificado system.imgsi dm-verityestá habilitado. Déjame escribirte una respuesta sobre lo que puedes intentar deshabilitar dm-verity.

Respuestas (2)

Voy a dar una descripción general de cómo dm-verityfuncionan las cosas relacionadas en Android de acuerdo con mi conocimiento limitado. La situación puede diferir en diferentes dispositivos y ROM.

¿CÓMO SE APLICA DM-VERITY?

dm-verity( Arranque verificado y AVB ), así como dm-crypt( FDE ), son objetivos de las device-mappercaracterísticas del kernel de Linux. dm-verityverifica la integridad de cada bloque a medida que se leen desde el dispositivo de bloques; aplicado por init_first_stagesegún lo fs_mgr_flagsestablecido en fstab ( 1 ) . En los dispositivos del sistema como raízA/B ( y non-A/B), el kernel está parcheado para forzar la veracidad durante el montaje /systemy /vendorsi verify/ avbse encuentran indicadores en el árbol de dispositivos fstab (dtb).
dm-cryptdescifra/cifra los datos de forma transparente cuando se leen/escriben desde/hacia el dispositivo de bloqueo. FBE se basa en un marco de kernel diferentefscrypt; pero ambos son administrados por vold(que se ejecuta como un servicio nativo) si fs_mgr_flagscontienen voldmanaged.

¿DÓNDE ESTÁ FSTAB?

fstabha sido tradicionalmente un archivo en Linux para especificar los sistemas de archivos que se montarán en el arranque. Es un componente central de fs_mgrla funcionalidad en Android.

En los lanzamientos anteriores a Oreo fstabestaba en ramdisk. Con Treble se movió a /vendor(o /system/vendor) mientras que las entradas de fstab para systemy vendor(y odm) se movieron a Device Tree Blob ( dtb). Kernel exporta dtb fstabentradas en el directorio del árbol de dispositivos en /proc/device-tree/firmware/android.

Algunos OEM también instalan fstabo odmparticionan nvdata.

Fuente: Configuración del dispositivo de almacenamiento de Android

¿DÓNDE ESTÁ DTB?

Device Tree es una estructura de datos para describir hardware que no es detectable por el kernel. Device Tree Source ( dts) se puede convertir a dtb(blob binario de DT) y viceversa usando dtc. El cargador de arranque carga DTB en el momento del arranque y lo pasa al kernel para que pueda descubrir el hardware y crear nodos de dispositivos en consecuencia.

DTB es:

  • Anexado al núcleo zImageo Image.gzen boot.img ( 2 ) . Se puede dividir del gziparchivo usando split-appended-dtb (sadtb).
  • O en dtbopartición como lo hacen algunos OEM. Esto se puede comprobar con:

    ~# ls -l /dev/block/bootdevice/by-name/dtbo*
    ~# grep -C5 PARTNAME=dtbo /sys/dev/block/*/uevent | grep DEVNAME | sed 's/.*=//; s|^|/dev/block/&|'
    
  • O al final de boot.imgla segunda etapa, o en odmla partición (raro, algunos OEM lo hacen).

Además, si el dispositivo es non-A/B, dtb(desde boot.imgy/o dtbopartición) también se agrega en recovery.imgla sección DTBO después del encabezado, kernel, ramdisk y la segunda etapa ( 3 ) . Sin embargo, esto no importa para el arranque normal. Pero si el dispositivo también lo es system-as-root, Magisk debe instalarse en esta partición de recuperación ya que boot.imgno contiene ramdisk ( 4 ) .

En caso de que DTB no se agregue al kernel, dtb(s)se convierten para dtb.imgusar mkdtimg. La misma herramienta puede volcar la imagen.

Fuente: Implementación de DTO

¿CÓMO DESACTIVAR DM-VERITY?

En userdebuglas ROM, dm-verityse puede desactivar usando adb. Modifica el número mágico del bloque de metadatos de verdad ( 5 , 6 ) que se escribe después del último bloque del sistema de archivos en el dispositivo de bloque ( systemo vendor) ( 7 ) . Citado de aquí :

la ausencia de este número mágico detendrá el proceso de verificación

En el caso de AVB, adbse modifica vbmeta headerpara deshabilitar la verificación de imágenes de hashtree ( 8 , 9 ) . Citado de aquí :

si la AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLEDbandera está configurada en vbmeta de nivel superior, entonces androidboot.veritymodeestá deshabilitada

En userlas compilaciones ro.debuggablese está 0y adbdno se está ejecutando como root. También hay otras diferencias como la de ALLOW_ADBD_DISABLE_VERITY, por lo adbque no se deshabilitará dm-verity. Otro enfoque es eliminar verifyo ( 10 ) marcar de . Citado de aquí :avb fstab

Para verificar la partición...
...
En el fstab para la entrada relevante, agregue verifya las fs_mgrbanderas.

Del mismo modo, para eliminar el cifrado, forceencrypt=o forcefdeorfbe=debe fileencryption=reemplazarse por encryptable=. Sin embargo, el cifrado no se puede eliminar sin restablecer los valores de fábrica (¿FBE también?), por lo que desmarcar Preserve force encryptionla aplicación Magisk no hará nada.

Algunos OEM también usan marcas y propiedades en dispositivos habilitados.support_scfs fs_mgrro.config.dmverity=truedm-verity

También se han descubierto algunos exploits en el cargador de arranque y en la implementación de adb de algunos OEM que se pueden usar para deshabilitarlos dm-verityen los dispositivos afectados. Sin embargo, tales fallas de seguridad generalmente se solucionan con el tiempo con actualizaciones de los OEM.

OPCIÓN 1
Configure las opciones en el archivo de configuración antes de instalar Magisk:

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

Si está instalado, después de desmarcar Preserve AVB v2.0/dm-verityla aplicación, Magisk debe reinstalarse. Citado de aquí :

en Magisk Manager, "Desinstalar> Restaurar imágenes" para restaurar las imágenes, marque la casilla "Conservar AVB 2.0/dm-verity" en Configuración avanzada, luego reinstale Magisk a través de la aplicación.

OPCIÓN 2
Usa algunos dm-verityzips desactivadores como este .

OPCIÓN 3
Averigua dónde están las fstabentradas de /systemy /vendoren tu dispositivo.

Si está en ramdisk(pre-agudos):

  • Extraer ramdisk, modificar fstaby reempaquetar.
  • O parchear ramdiskdirectamente:

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

Si en dtb:

  • Si se adjunta al núcleo:
    • Extractoboot.img
    • División adjuntadtb(s)
    • parche dtb(s)_
    • Agregar dtb(s)al núcleo
    • reempacarboot.img
  • Si está en dtbola partición o boot.imgdespués de la segunda etapa, parchee dtb.imgy vuelva a escribir en la partición o boot.img.

¿Cómo desempaquetar/reempaquetar la imagen de arranque o recuperación y el disco RAM?
Utilice AIK o magiskboot.

¿ Cómo parchear dtb?
Parche directamente usando magiskbooto convierta manualmente dtba dts, edite dtscon cualquier editor de texto para eliminar dm-veritymarcas y dtsvuelva a convertir a dtb.

RELACIONADO:

En los dispositivos SAR lanzados con Android 10, construí un kernel con indicadores avb (no se encontró ningún indicador de verity) eliminado de las entradas de fsmgr_flags y lo hice permisivo. También vacíe el vbmeta con el indicador de verificación deshabilitado. ¿Es suficiente que se deshabilite un dm-verity? (No puedo probarlo porque twrp no está actualizado a Android 10 y aún no sé cómo montar una partición dinámica con shell adb rooteado en recuperación)
@VatishSharma Lo siento, no he probado con Android 10, así que no puedo decir nada con seguridad.
¿Tiene idea de montar particiones dinámicas (he hecho twrp y he rooteado adb shell, pero sí, no está actualizado para particiones dinámicas y, por lo tanto, carece de funciones de montaje)?
@VatishSharma ni idea.

Simplemente puede editar el paquete raíz de Magisk para deshabilitar SOLAMENTE el indicador dm-verity. Literalmente, solo está comentando algunas líneas de scripts de Magisk, ya que la funcionalidad está inherentemente presente en Magisk. Aquí está el enlace a dicho paquete: Descargue magisk-onlynoveritypatch.zip Arranque en twrp, instale desde zip y seleccione este zip.

Gracias por compartir. lamentablemente solo los usuarios registrados pueden descargar. y es dificil registrarse porque no hay captcha en ingles :(