Google is committed to advancing racial equity for Black communities. See how.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Implementando SELinux

SELinux está configurado en default-deny, lo que significa que cada acceso para el cual tiene un gancho en el kernel debe ser explícitamente permitido por la política. Esto significa que un archivo de política se compone de una gran cantidad de información sobre reglas, tipos, clases, permisos y más. Una consideración completa de SELinux está fuera del alcance de este documento, pero la comprensión de cómo escribir reglas de políticas es ahora esencial cuando se presentan nuevos dispositivos Android. Ya hay una gran cantidad de información disponible sobre SELinux. Consulte la documentación de respaldo para ver los recursos sugeridos.

Archivos clave

Para habilitar SELinux, integre el último kernel de Android y luego incorpore los archivos que se encuentran en el directorio system / sepolicy . Cuando se compilan, esos archivos forman parte de la política de seguridad del kernel de SELinux y cubren el sistema operativo Android anterior.

En general, no debe modificar los archivos del system/sepolicy directamente. En su lugar, agregue o edite sus propios archivos de políticas específicos del /device/ manufacturer / device-name /sepolicy en el directorio /device/ manufacturer / device-name /sepolicy . En Android 8.0 y versiones posteriores, los cambios que realice en estos archivos solo deberían afectar la política en su directorio de proveedores. Para obtener más detalles sobre la separación de la política pública en Android 8.0 y superior, consulte Personalización de la política SE en Android 8.0 o superior. Independientemente de la versión de Android, todavía está modificando estos archivos:

Archivos de política

Los archivos que terminan con *.te son archivos fuente de políticas de SELinux, que definen dominios y sus etiquetas. Es posible que deba crear nuevos archivos de políticas en /device/ manufacturer / device-name /sepolicy , pero debe intentar actualizar los archivos existentes siempre que sea posible.

Archivos de contexto

Los archivos de contexto son donde especifica etiquetas para sus objetos.

  • file_contexts asigna etiquetas a los archivos y es utilizado por varios componentes del espacio de usuario. A medida que crea nuevas políticas, cree o actualice este archivo para asignar nuevas etiquetas a los archivos. Para aplicar nuevos file_contexts , reconstruya la imagen del sistema de archivos o ejecute restorecon en el archivo que desea volver a etiquetar. En las actualizaciones, los cambios en file_contexts se aplican automáticamente al sistema y a las particiones de datos de usuario como parte de la actualización. Los cambios también se pueden aplicar automáticamente en la actualización a otras particiones agregando llamadas restorecon_recursive a su init. board .rc después de que la partición haya sido montada en lectura-escritura.
  • genfs_contexts asigna etiquetas a sistemas de archivos, como proc o vfat que no admiten atributos extendidos. Esta configuración se carga como parte de la política del kernel, pero es posible que los cambios no surtan efecto para los inodos en el núcleo, lo que requiere reiniciar o desmontar y volver a montar el sistema de archivos para aplicar completamente el cambio. También se pueden asignar etiquetas específicas a montajes específicos, como vfat usando la opción context=mount .
  • property_contexts asigna etiquetas a las propiedades del sistema Android para controlar qué procesos pueden establecerlas. Esta configuración es leído por el init del proceso durante el arranque.
  • service_contexts asigna etiquetas a los servicios de enlace de Android para controlar qué procesos pueden agregar (registrar) y encontrar (buscar) una referencia de enlace para el servicio. El proceso del servicemanager lee esta configuración durante el inicio.
  • seapp_contexts asigna etiquetas a procesos de aplicaciones y directorios /data/data . El proceso del zygote lee esta configuración en cada lanzamiento de la aplicación y la installd durante el inicio.
  • mac_permissions.xml asigna una etiqueta seinfo a las aplicaciones según su firma y, opcionalmente, el nombre de su paquete. La etiqueta seinfo se puede utilizar como clave en el archivo seapp_contexts para asignar una etiqueta específica a todas las aplicaciones con esa etiqueta seinfo . system_server lee esta configuración durante el inicio.

BoardConfig.mk makefile

Después de editar o agregar archivos de política y contexto, actualice su /device/ manufacturer / device-name /BoardConfig.mk makefile para hacer referencia al subdirectorio sepolicy y cada nuevo archivo de política. Para obtener más información sobre las variables BOARD_SEPOLICY , consulte el archivo system/sepolicy/README .

BOARD_SEPOLICY_DIRS += \
        <root>/device/manufacturer/device-name/sepolicy

BOARD_SEPOLICY_UNION += \
        genfs_contexts \
        file_contexts \
        sepolicy.te

Después de la reconstrucción, su dispositivo está habilitado con SELinux. Ahora puede personalizar sus políticas de SELinux para adaptarse a sus propias adiciones al sistema operativo Android como se describe en Personalización o verificar su configuración existente como se cubre en Validación .

Cuando los nuevos archivos de políticas y las actualizaciones de BoardConfig.mk están en su lugar, la nueva configuración de políticas se integra automáticamente en el archivo final de políticas del kernel. Para obtener más información sobre cómo se crea sepolicy en el dispositivo, consulte Creación de sepolicy .

Implementación

Para comenzar con SELinux:

  1. Habilite SELinux en el kernel: CONFIG_SECURITY_SELINUX=y
  2. Cambie el parámetro kernel_cmdline para que:
    BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive
    Esto es solo para el desarrollo inicial de la política para el dispositivo. Una vez que tenga una política de arranque inicial, elimine este parámetro para que su dispositivo se cumpla o fallará CTS.
  3. Arranque el sistema en permisivo y vea qué rechazos se encuentran en el arranque:
    En Ubuntu 14.04 o más reciente:
    adb shell su -c dmesg | grep denied | audit2allow -p out/target/product/BOARD/root/sepolicy
    
    En Ubuntu 12.04:
    adb pull /sys/fs/selinux/policy
    adb logcat -b all | audit2allow -p policy
    
  4. Evalúe la salida en busca de advertencias que se parezcan a init: Warning! Service name needs a SELinux domain defined; please fix! Consulte Validación para obtener instrucciones y herramientas.
  5. Identifique dispositivos y otros archivos nuevos que necesiten etiquetado.
  6. Utilice etiquetas nuevas o existentes para sus objetos. Mire los archivos *_contexts para ver cómo se etiquetaron las cosas anteriormente y use el conocimiento de los significados de las etiquetas para asignar una nueva. Idealmente, esta será una etiqueta existente que se ajustará a la política, pero a veces se necesitará una nueva etiqueta y se necesitarán reglas para acceder a esa etiqueta. Agregue sus etiquetas a los archivos de contexto apropiados.
  7. Identifique dominios / procesos que deberían tener sus propios dominios de seguridad. Es probable que deba redactar una política completamente nueva para cada uno. Todos los servicios generados por init , por ejemplo, deberían tener los suyos propios. Los siguientes comandos ayudan a revelar aquellos que permanecen en ejecución (pero TODOS los servicios necesitan tal tratamiento):
    adb shell su -c ps -Z | grep init
    
    adb shell su -c dmesg | grep 'avc: '
    
  8. Revise init. device .rc para identificar cualquier dominio que no tenga un tipo de dominio. Déles un dominio al principio de su proceso de desarrollo para evitar agregar reglas a init o confundir los accesos de init con los que están en su propia política.
  9. Configure BOARD_CONFIG.mk para usar las variables BOARD_SEPOLICY_* . Consulte el system/sepolicy README en system/sepolicy para obtener detalles sobre cómo configurar esto.
  10. Examine el archivo init. device .rc y fstab. device y asegúrese de que cada uso de mount corresponda a un sistema de archivos debidamente etiquetado o que se especifique una opción context= mount .
  11. Revise cada negación y cree una política de SELinux para manejar cada una de manera adecuada. Vea los ejemplos en Personalización .

Debe comenzar con las políticas en el AOSP y luego desarrollarlas para sus propias personalizaciones. Para obtener más información sobre la estrategia de políticas y una mirada más cercana a algunos de estos pasos, consulte Redacción de políticas de SELinux .

Casos de uso

A continuación, se muestran ejemplos específicos de exploits a considerar al diseñar su propio software y las políticas de SELinux asociadas:

Enlaces simbólicos : debido a que los enlaces simbólicos aparecen como archivos, a menudo se leen como archivos, lo que puede generar vulnerabilidades. Por ejemplo, algunos componentes privilegiados, como init , cambian los permisos de ciertos archivos, a veces para que sean excesivamente abiertos.

Los atacantes podrían reemplazar esos archivos con enlaces simbólicos al código que controlan, lo que permite al atacante sobrescribir archivos arbitrarios. Pero si sabe que su aplicación nunca atravesará un enlace simbólico, puede prohibirle que lo haga con SELinux.

Archivos del sistema : considere la clase de archivos del sistema que solo debe modificar el servidor del sistema. Aún así, dado que netd , init y vold ejecutan como root, pueden acceder a esos archivos del sistema. Entonces, si netd se netd comprometido, podría comprometer esos archivos y potencialmente el servidor del sistema.

Con SELinux, puede identificar esos archivos como archivos de datos del servidor del sistema. Por lo tanto, el único dominio que tiene acceso de lectura / escritura a ellos es el servidor del sistema. Incluso si netd vio comprometido, no podría cambiar de dominio al dominio del servidor del sistema y acceder a esos archivos del sistema aunque se ejecute como root.

Datos de la aplicación : otro ejemplo es la clase de funciones que deben ejecutarse como root pero no deben acceder a los datos de la aplicación. Esto es increíblemente útil ya que se pueden hacer afirmaciones de amplio alcance, como que se prohíba el acceso a Internet de ciertos dominios no relacionados con los datos de la aplicación.

setattr : para comandos como chmod y chown , puede identificar el conjunto de archivos donde el dominio asociado puede realizar setattr . Cualquier cosa fuera de eso podría estar prohibida por estos cambios, incluso por root. Por lo tanto, una aplicación puede ejecutar chmod y chown contra los etiquetados app_data_files pero no shell_data_files o system_data_files .