Darò una panoramica generale di come dm-verity
e le cose correlate funzionano su Android in base alle mie conoscenze limitate. La situazione potrebbe differire su diversi dispositivi e ROM.
COME VIENE APPLICATO DM-VERITY?
dm-verity
(Avvio verificato e AVB) così come dm-crypt
(FDE) sono obiettivi di device-mapper
caratteristica del kernel Linux. dm-verity
verifica l'integrità di ciascun blocco man mano che vengono letti dal dispositivo a blocchi; imposto da init_first_stage
come da fs_mgr_flags
impostato in fstab . Sui dispositivi system-as-root (A/B
e non-A/B
), il kernel è aggiornato per forzare la verità durante il montaggio di /system
e /vendor
se verify
/avb
i flag si trovano nell'albero dei dispositivi fstab (dtb).
dm-crypt
decrittografa/crittografa i dati in modo trasparente quando viene letto/scritto da/a un dispositivo a blocchi. FBE è basato su un diverso framework del kernel fscrypt
; ma entrambi sono gestiti da vold
(che viene eseguito come servizio nativo) if fs_mgr_flags
contenere voldmanaged
.
DOVE SI TROVA FSTAB?
fstab
è stato tradizionalmente un file su Linux per specificare i filesystem da montare all'avvio. È un componente fondamentale di fs_mgr
funzionalità su Android.
Nelle versioni pre-Oreo fstab
era in ramdisk
. Con Treble è stato spostato in /vendor
(o /system/vendor
) mentre le voci fstab per system
e vendor
(e odm
) vengono spostati in Device Tree Blob (dtb
). Il kernel esporta dtb fstab
voci nella directory dell'albero dei dispositivi in /proc/device-tree/firmware/android
.
Alcuni OEM inseriscono anche fstab
in odm
o nvdata
partizioni.
Fonte: Configurazione del dispositivo di archiviazione Android
DOVE SI TROVA DTB?
Device Tree è una struttura dati per descrivere l'hardware che non è rilevabile dal kernel. Origine dell'albero dei dispositivi (dts
) può essere convertito in dtb
(blob binario di DT) e viceversa usando dtc
. DTB viene caricato dal bootloader al momento dell'avvio e passato al kernel in modo che possa rilevare l'hardware e creare i nodi del dispositivo di conseguenza.
DTB è:
- Aggiunto al kernel
zImage
oImage.gz
inboot.img
. Può essere separato dagzip
archivia usandosplit-appended-dtb (sadtb)
. -
O in
dtbo
partizione come fanno alcuni OEM. Questo può essere verificato 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 alla fine di
boot.img
dopo la seconda fase o inodm
partizione (raro, alcuni OEM lo fanno).
Anche se il dispositivo è non-A/B
, dtb
(da boot.img
e/o dtbo
partizione) viene aggiunta anche a recovery.img
nella sezione DTBO dopo header, kernel, ramdisk e 2nd stage . Tuttavia questo non ha importanza per l'avvio normale. Ma se il dispositivo è anche system-as-root
, Magisk deve essere installato in questa partizione di ripristino come boot.img
non contiene ramdisk
.
Nel caso in cui DTB non sia aggiunto al kernel, dtb(s)
vengono convertiti in dtb.img
utilizzando mkdtimg
. Lo stesso strumento può eseguire il dump dell'immagine.
Fonte: Implementazione di DTO
COME DISABILITARE DM-VERITY?
Su userdebug
ROM, dm-verity
può essere disabilitato usando adb
. Modifica il numero magico del blocco di metadati di verità che viene scritto dopo l'ultimo blocco del filesystem sul dispositivo a blocchi (system
o vendor
). Citato da qui:
l'assenza di questo numero magico interromperà il processo di verifica
In caso di AVB, adb
modifica vbmeta header
per disabilitare la verifica dell'immagine hashtree . Citato da qui:
se
AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLED
flag è impostato nel vbmeta di primo livello, quindiandroidboot.veritymode
è impostato su disabilitato
Su user
costruisce ro.debuggable
è 0
e adbd
non è in esecuzione come root. Inoltre ci sono altre differenze come quella di ALLOW_ADBD_DISABLE_VERITY
, quindi adb
non disabiliterà dm-verity
. Un altro approccio consiste nel rimuovere verify
o avb
flag da fstab
. Citato da qui:
Per verificare la partizione...
...
Nel fstab per la voce pertinente, aggiungiverify
alfs_mgr
flag.
Allo stesso modo per rimuovere la crittografia, forceencrypt=
, forcefdeorfbe=
o fileencryption=
deve essere sostituito con encryptable=
. Tuttavia, la crittografia non può essere rimossa senza il ripristino delle impostazioni di fabbrica (anche FBE?), quindi deselezionando Preserve force encryption
nell'app Magisk non farà nulla.
Alcuni OEM usano anche support_scfs
fs_mgr
flag e ro.config.dmverity=true
property sui dispositivi con dm-verity
abilitato.
Ci sono anche alcuni exploit scoperti nel bootloader e nell'implementazione adb di alcuni OEM che possono essere usati per disabilitare dm-verity
sui dispositivi interessati. Tuttavia, tali difetti di sicurezza di solito vengono risolti nel tempo con gli aggiornamenti degli OEM.
OPZIONE 1
Imposta le opzioni nel file di configurazione prima di installare Magisk:
~# echo 'KEEPVERITY=false' >/cache/.magisk
~# echo 'KEEPFORCEENCRYPT=true' >>/cache/.magisk
Se installato, dopo aver deselezionato Preserve AVB v2.0/dm-verity
nell'app, Magisk deve essere reinstallato. Citato da qui:
in Magisk Manager, "Disinstalla> Ripristina immagini" per ripristinare le immagini, seleziona la casella "Preserve AVB 2.0/dm-verity" in Impostazioni avanzate, quindi reinstalla Magisk tramite l'app.
OPZIONE 2
Usa un po' di dm-verity
zip di disattivazione come questa.
OPZIONE 3
Scopri dove si trova fstab
voci di /system
e /vendor
sono sul tuo dispositivo.
Se in ramdisk
(pre-acuti):
- Estrai
ramdisk
, modificafstab
e reimballare. -
O patch
ramdisk
direttamente:~# magiskboot cpio ramdisk.cpio 'patch false true'
Se in dtb
:
- Se aggiunto al kernel:
- Estrai
boot.img
- Split aggiunto
dtb(s)
- Patch
dtb(s)
. - Aggiungi
dtb(s)
al kernel - Riconfeziona
boot.img
- Estrai
- Se in
dtbo
partizione o inboot.img
dopo la seconda fase, patchdtb.img
e riscrivi nella partizione oboot.img
.
Come decomprimere/reimballare l'immagine di avvio o di ripristino e il Ramdisk?
Usa AIK o magiskboot
.
Come patchare dtb
?
Patch direttamente usando magiskboot
o convertire manualmente dtb
a dts
, modifica dts
con qualsiasi editor di testo per rimuovere dm-verity
flags e convertire dts
torna a dtb
.
RELAZIONATO:
- Come funziona Magisk?
- Partizioni e file system del dispositivo Android