SELinux es un mecanismo de seguridad que impide el acceso no autorizado de los procesos a otros procesos, acciones y sistemas de archivos (el "archivo" de UNIX incluye todos los archivos regulares, directorios, dispositivos de bloqueo, dispositivos de caracteres, sockets, etc.). Cada proceso, archivo, directorio y acción se etiqueta con un contexto SELinux, y luego se define una política sobre lo que un contexto puede hacer a otro contexto. La política se carga por el kernel o init
en cada bota, y cualquier cosa no definida en la política es negada por el núcleo. Para más detalles ver esta respuesta .
Los contextos de los sistemas de archivos también se generan junto con la política. En Android, tanto sepolicy
y file_contexts
se guardan en las root /
o /{system,vendor,odm}/etc/selinux/
directorios. Los contextos de los sistemas de archivos pueden ser cambiados manualmente usando chcon
o de file_contexts
usando restorecon
. El proceso puede ejecutarse en un contexto determinado utilizando runcon
. init
también inicia todos los procesos con una predefinida seclabel
en *.rc
archivos. Algunos también se establecen contextos de sistemas de archivos en cada bota usando restorecon
comando en *.rc
archivos.
Arreglar los contextos en el TWRP arregla las etiquetas de contexto del sistema de archivos de un /file_contexts
archivo. Pero si este archivo es para un dispositivo diferente o contiene contextos erróneos, anticuados o incompletos, el dispositivo puede entrar en el bootloop. Mejor evitar el uso de "Fix Contexts", en su lugar usar chcon
o restorecon
manualmente si es necesario. O reemplazar file_contexts
en la recuperación ramdisk
con un archivo actualizado de su actual ROM.
EJEMPLO:
Tengo alrededor de 40000 reglas de política en mi dispositivo, una de ellas es:
~# sesearch --allow -s init -t system_data_file -c dir /sys/fs/selinux/policy
Found 1 semantic av rules:
allow init system_data_file : dir { search read open ioctl write create getattr setattr relabelfrom relabelto mounton add_name remove_name rmdir } ;
De los más de 2.000 contextos de sistemas de archivos, uno es:
~# grep system_data_file /system/etc/selinux/*contexts
/data(/.*)? u:object_r:system_data_file:s0
El contexto SELinux de init
proceso:
~# ps -p 1 -o pid,cmd,label
PID CMD LABEL
1 /init u:r:init:s0
Contexto SELinux del directorio que contiene la configuración del sistema:
~# ls -dZ /data/system
u:object_r:system_data_file:s0 /data/system
Así que si /data/system
está etiquetada con el contexto equivocado, init
no será capaz de realizar search
, read
y open
operaciones en el directorio y el dispositivo puede hacer bootloop.
DAC vs MAC :
SELinux es una implementación del Control de Acceso Obligatorio (MAC). El Control de Acceso Discrecional (DAC) logra el mismo objetivo de manera menos agresiva asignando UIDs/GIDs a los procesos y archivos:
~# ls -ld /data /data/system
drwxrwx--x 41 system system 4096 Oct 21 17:40 /data
drwxrwxr-x 21 system system 3488 Nov 9 13:36 /data/system
El modo de permiso y propiedad explica que sólo los procesos que se ejecutan con UID o GID 1000
( system
) podrá leer y escribir en el directorio y las aplicaciones normales (con UIDs/GIDs en el rango 10000
a 19999
) no pueden leer los ajustes del sistema.
Una desventaja del DAC es que está permitido por defecto y tiene un Super Usuario (Usuario root con UID 0
se le permite hacer cualquier cosa). Mientras que el MAC es negado por defecto y no hay Súper Contexto por lo que es menos propenso a las hazañas. Las autoridades del usuario de root también se dividen en capacidades para seguir el principio de los menores privilegios . Combinados, tanto el DAC como el MAC proporcionan un aislamiento más robusto, protección y arenero.
2 votos
Cero uno parece tener una buena explicación