¿Por qué los intentos de escritura en /system/priv-app hacen que /system cambie a solo lectura?

Estoy intentando escribir archivos en el directorio /system/priv-app. Arranco en recovery (TWRP) y ejecuto adb shell.

~ # mount /system
~ # mount
rootfs on / type rootfs (rw,seclabel)
...
/dev/block/mmcblkXXXX on /system type ext4 (rw,seclabel,relatime,data=ordered)

Entonces puedo ejecutar:

~ # mkdir /system/tmp
~ # touch /system/tmp/test

Esto funciona bien: no tengo problemas para modificar /system. (También puedo eliminar cosas de /system/priv-app). Pero si intento escribir en /system/priv-app obtengo lo siguiente:

~ # mkdir /system/priv-app/test
mkdir: can't create directory '/system/priv-app/test': Read-only file system
~ # mount
rootfs on / type rootfs (rw,seclabel)
...
/dev/block/mmcblkXXXX on /system type ext4 (ro,seclabel,relatime,data=ordered)

¡Ahora /system se monta repentinamente en modo de solo lectura! Los permisos y la propiedad son idénticos en /system y /system/priv-app y estoy ejecutando como root.

~ # ls -al /
...
drwxr-xr-x   18 root     root          4096 Nov 25 07:32 system
~ # ls -al /system
...
drwxr-xr-x   59 root     root          4096 Aug  5  1972 priv-app

Mientras está en TWRP, SELinux está configurado como permisivo:

~ # getenforce
Permissive

Estoy ejecutando Lineage OS 14.1 (Android Nougat) en un Moto G 2015 (también conocido como Moto G3). Está enraizado con el complemento oficial Lineage su. También probé Magisk y obtuve el mismo resultado.

Me he quedado sin ideas y no puedo descifrar los términos de búsqueda correctos, porque probé un montón de cosas y no encontré nada.

¿Cómo puedo habilitar la escritura en /system/priv-app?

¡Gracias, @IrfanLatif! Eso funcionó para mí, aunque todavía no entiendo cómo / system se vuelve a montar de solo lectura sobre la marcha. Mi mejor suposición en este punto es alguna política de selinux que se activa al escribir en priv-app, pero estoy al borde de mi conocimiento allí.

Respuestas (1)

Proteger Android de códigos maliciosos siempre ha sido una prioridad para Google, los OEM y los proveedores de SOC. Incluso la protección contra escritura /system ha sido implementada a nivel de kernel por algunos OEM. Y, de forma predeterminada, Android monta /systemsolo lectura para evitar cambios intencionales o accidentales para que AVB/dm-verity funcione correctamente. Solo las actualizaciones OTA pueden modificar la partición del sistema.
Sin embargo, si dm-verity está deshabilitado mientras se rootea el dispositivo o cuando se actualiza el kernel/ROM personalizado, podemos realizar /system read/writemodificaciones. Pero algunos programas tienen un código incorporado para verificar si /system está montado rwy, de ser así, revertir el estado a ro. Estados de Solid Explorer :

Si el punto de montaje se monta en modo r/o, se volverá a montar temporalmente en r/w. Una vez que se completa la operación (con éxito o no), la aplicación vuelve a montar la partición en el estado r/o.

TWRP también tiene una opción mount_sys_ro_chk y, de forma predeterminada, monta /system read-only .
Entonces, la solución es cambiar el punto de montaje /systema otra cosa, ya que eso no se verificará normalmente.

Otro factor que puede forzar roel montaje de una partición es la opción de montaje del kernel de LinuxERROR =remount-ro . Esta opción de montaje suele ser predeterminada en un sistema de archivos recién creado:

~# tune2fs -l /dev/block/bootdevice/by-name/system | grep Error
Errors behavior:          Remount read-only

Por lo tanto, el sistema de archivos se montará como de solo lectura si se produce un error, por ejemplo, Max Mount Countse alcanza y e2fsckno se ejecuta. Sin embargo, este rara vez es el caso en Android. Puede ver el registro del kernel para ver si hay errores de este tipo:

~# dmesg | grep mount

No se recomienda cambiar el comportamiento predeterminado y puede ser realmente dañino:

~# mkdir /system-temp
~# mount -o rw,errors=continue /dev/block/bootdevice/by-name/system /system-temp
+1 No sabía que algunos programas del sistema tenían un código para verificar el estado del montaje y cambiarlo, si difería del estándar.