Init del proveedor

El proceso init tiene permisos casi ilimitados y usa secuencias de comandos de entrada de las particiones del sistema y del proveedor para inicializar el sistema durante el inicio el proceso de administración de recursos. Este acceso causa un gran agujero en la división entre el sistema y el proveedor de Treble, ya que Las secuencias de comandos del proveedor pueden indicar a init que acceda a archivos, propiedades, etc., que no tienen forman parte de la interfaz binaria de aplicación (ABI) estable de aplicaciones para proveedores de sistemas.

El init de proveedor está diseñado para cerrar este agujero con un fragmento dominio de Linux con seguridad mejorada (SELinux) vendor_init que se ejecutará comandos que se encuentran en /vendor con permisos específicos del proveedor.

Mecanismo

El init del proveedor bifurca un subproceso de init al principio del proceso de inicio con el Contexto de SELinux u:r:vendor_init:s0. Este contexto de SELinux tiene permisos mucho menos que los del contexto init predeterminado y su acceso es a archivos, propiedades, etc., específicos del proveedor o que formen parte la ABI estable del proveedor del sistema.

Init verifica cada secuencia de comandos que carga para ver si la ruta de acceso comienza con. /vendor y, de ser así, lo etiqueta con una indicación de que sus comandos debe ejecutarse en el contexto init del proveedor. Cada init integrado se anota con un booleano que especifica si el comando debe ejecutarse o no en la inicialización del proveedor subproceso:

  • La mayoría de los comandos que acceden al sistema de archivos se anotan para ejecutarse en el proveedor init y, por lo tanto, están sujetos a la instrucción SEPolicy del proveedor.
  • La mayoría de los comandos que afectan el estado de inicio interno (p.ej., inicio y detención servicios) se ejecutan en el proceso init normal. Estos comandos están hechos que una secuencia de comandos del proveedor lo llama para ejecutar su propio servicio y el manejo de permisos.

El bucle de procesamiento principal de init contiene una verificación de que si un comando está anotado se ejecute en el subproceso del proveedor y se origina a partir de una secuencia de comandos del proveedor, que se envía a través de la comunicación entre procesos (IPC) al init del proveedor subprocess, que ejecuta el comando y envía el resultado de vuelta a init.

Usa el valor Init del proveedor

El init del proveedor está habilitado de forma predeterminada y sus restricciones se aplican a todas las secuencias de comandos init presente en la partición /vendor. El valor init del proveedor debe ser transparente a los proveedores cuyas secuencias de comandos ya no acceden a archivos solo del sistema propiedades, etcétera.

Sin embargo, si los comandos en una secuencia de comandos de proveedor determinada infringen la instrucción de restricciones, los comandos fallarán. Los comandos con errores tienen una línea en el kernel. log (visible con dmesg) de init que indica un error. Una auditoría de SELinux acompaña a cualquier comando con errores que falle debido a la política SELinux. Ejemplo de una falla, incluida una auditoría de SELinux:

type=1400 audit(1511821362.996:9): avc: denied { search } for pid=540 comm="init" name="nfc" dev="sda45" ino=1310721 scontext=u:r:vendor_init:s0 tcontext=u:object_r:nfc_data_file:s0 tclass=dir permissive=0
init: Command 'write /data/nfc/bad_file_access 1234' action=boot (/vendor/etc/init/hw/init.walleye.rc:422) took 2ms and failed: Unable to write to file '/data/nfc/bad_file_access': open() failed: Permission denied

Si un comando falla, hay dos opciones:

  • Si el comando falla debido a una restricción intencionada (por ejemplo, si el accede a un archivo del sistema o una propiedad), se debe y se volvió a implementar de una manera compatible con Treble, pasando solo por interfaces estables. Las reglas "Neverallow" impiden que se agreguen permisos para acceder a los archivos del sistema parte de la ABI estable del proveedor del sistema.
  • Si la etiqueta SELinux es nueva y aún no tiene permisos en el el sistema vendor_init.te ni los permisos excluidos mediante el comando reglas de firewall, se le pueden otorgar permisos a la etiqueta nueva vendor_init.te

En el caso de los dispositivos que se inicien con versiones anteriores a Android 9, es posible que se omitan agregando el typeattribute data_between_core_and_vendor_violators a el archivo vendor_init.te específico del dispositivo.

Ubicaciones de los códigos

La mayor parte de la lógica para la IPC de inicio del proveedor está en system/core/init/subcontext.cpp.

La tabla de comandos se encuentra en la clase BuiltinFunctionMap en system/core/init/builtins.cpp e incluye anotaciones que indican si el comando debe ejecutarse en el proveedor init.

La SEPolicy de init del proveedor se divide en las privadas (system/sepolicy/private/vendor_init.te). y pública (system/sepolicy/public/vendor_init.te) directorios en system/sepolicy.