Voy a dar una descripción general de cómo dm-verity
y las cosas relacionadas funcionan en Android según 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 device-mapper
característica del kernel de Linux. dm-verity
verifica la integridad de cada bloque a medida que se leen desde el dispositivo de bloques; aplicado por init_first_stage
según fs_mgr_flags
configurado en fstab. En dispositivos del sistema como raíz (A/B
y non-A/B
), el núcleo está parcheado para forzar la veracidad mientras se monta /system
y /vendor
si verify
/avb
las banderas se encuentran en el árbol de dispositivos fstab (dtb).
dm-crypt
descifra/cifra los datos de forma transparente cuando se leen/escriben desde/hacia el dispositivo de bloqueo. FBE se basa en un marco de kernel diferente fscrypt
; pero ambos son administrados por vold
(que se ejecuta como un servicio nativo) si fs_mgr_flags
contiene voldmanaged
.
¿DÓNDE ESTÁ FSTAB?
fstab
ha 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_mgr
funcionalidad en Android.
En versiones anteriores a Oreo fstab
estaba en ramdisk
. Con Treble se movió a /vendor
(o /system/vendor
) mientras que las entradas de fstab para system
y vendor
(y odm
) se mueven a Device Tree Blob (dtb
). Exportaciones del núcleo dtb fstab
entradas en el directorio del árbol de dispositivos en /proc/device-tree/firmware/android
.
Algunos OEM también ponen fstab
en odm
o nvdata
particiones.
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. Fuente del árbol de dispositivos (dts
) se puede convertir a dtb
(blob binario de DT) y viceversa usando dtc
. El gestor de arranque carga DTB en el momento del arranque y lo pasa al núcleo para que pueda descubrir el hardware y crear nodos de dispositivos en consecuencia.
DTB es:
- Agregado al kernel
zImage
oImage.gz
enboot.img
. Se puede dividir desdegzip
archivar usandosplit-appended-dtb (sadtb)
. -
O en
dtbo
partició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.img
después de la 2ª etapa, o enodm
partición (raro, algunos OEM lo hacen).
También si el dispositivo es non-A/B
, dtb
(de boot.img
y/o dtbo
partición) también se agrega a recovery.img
en la sección DTBO después del encabezado, kernel, ramdisk y 2da etapa. Sin embargo, esto no importa para el arranque normal. Pero si el dispositivo también es system-as-root
, Magisk debe instalarse en esta partición de recuperación como boot.img
no contiene ramdisk
.
En caso de que DTB no se agregue al kernel, dtb(s)
se convierten a dtb.img
usando mkdtimg
. La misma herramienta puede volcar la imagen.
Fuente: Implementando DTO
¿CÓMO DESACTIVAR DM-VERITY?
En userdebug
ROM, dm-verity
se puede deshabilitar usando adb
. Modifica el número mágico del bloque de metadatos de verdad que se escribe después del último bloque del sistema de archivos en el dispositivo de bloque (system
o vendor
) . Citado de aquí:
la ausencia de este número mágico detendrá el proceso de verificación
En caso de BAV, adb
modifica vbmeta header
para deshabilitar la verificación de imagen hashtree. Citado de aquí:
si el AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLED
el indicador se establece en el vbmeta de nivel superior, luego androidboot.veritymode
está configurado como deshabilitado
En user
compila ro.debuggable
es 0
y adbd
no se está ejecutando como root. También hay otras diferencias como la de ALLOW_ADBD_DISABLE_VERITY
, entonces adb
no deshabilitará dm-verity
. Otro enfoque es eliminar verify
o avb
bandera de fstab
. Citado de aquí:
Para verificar la partición...
...
En el fstab para la entrada relevante, agregue verify
al fs_mgr
banderas.
De manera similar para eliminar el cifrado, forceencrypt=
, forcefdeorfbe=
o fileencryption=
necesita ser reemplazado con encryptable=
. Sin embargo, el cifrado no se puede eliminar sin restablecer los valores de fábrica (¿FBE también?), así que desmarque Preserve force encryption
en la aplicación Magisk no hará nada.
Algunos OEM también usan support_scfs
fs_mgr
bandera y ro.config.dmverity=true
propiedad en dispositivos con dm-verity
activado.
También se han descubierto algunos exploits en el cargador de arranque y en la implementación adb de algunos OEM que se pueden usar para deshabilitar dm-verity
en 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-verity
en la aplicación, Magisk necesita ser reinstalado. 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 algo de dm-verity
zips desactivadores como este.
OPCIÓN 3
Averigua dónde está el fstab
entradas de /system
y /vendor
están en su dispositivo.
Si en ramdisk
(antes de los agudos):
- Extraer
ramdisk
, modificarfstab
y reempacar. -
O parche
ramdisk
directamente:~# magiskboot cpio ramdisk.cpio 'patch false true'
Si en dtb
:
- Si se adjunta al kernel:
- Extraer
boot.img
- Dividir adjunto
dtb(s)
- Parche
dtb(s)
. - Anexar
dtb(s)
al núcleo - Reempaquetar
boot.img
- Extraer
- Si está en
dtbo
partición o enboot.img
después de la segunda etapa, parchedtb.img
y volver a escribir en la partición oboot.img
.
¿Cómo desempaquetar/reempaquetar la imagen de arranque o recuperación y el disco RAM?
Usa AIK o magiskboot
.
Cómo parchear dtb
?
Parchear directamente usando magiskboot
o convertir manualmente dtb
a dts
, edite dts
con cualquier editor de texto para eliminar dm-verity
banderas y convertir dts
volver a dtb
.
RELACIONADO:
- ¿Cómo funciona Magisk?
- Particiones de dispositivos Android y sistemas de archivos