Linux con seguridad mejorada en Android

Como parte del modelo de seguridad de Android, Android usa Security-Enhanced Linux (SELinux) para aplicar el control de acceso obligatorio (MAC) sobre todos los procesos, incluso los procesos que se ejecutan con privilegios de raíz/superusuario (capacidades de Linux). Muchas empresas y organizaciones han contribuido a la implementación de SELinux de Android. Con SELinux, Android puede proteger y confinar mejor los servicios del sistema, controlar el acceso a los datos de la aplicación y los registros del sistema, reducir los efectos del software malicioso y proteger a los usuarios de posibles fallas en el código de los dispositivos móviles.

SELinux opera según el principio de denegación predeterminada: se deniega todo lo que no se permite explícitamente. SELinux puede operar en dos modos globales:

  • Modo permisivo , en el que las denegaciones de permisos se registran pero no se aplican.
  • Modo de cumplimiento , en el que las denegaciones de permisos se registran y se aplican.

Android incluye SELinux en modo de aplicación y una política de seguridad correspondiente que funciona de manera predeterminada en AOSP. En el modo de cumplimiento, se evitan las acciones no permitidas y el núcleo registra todos los intentos de infracción en dmesg y logcat . Al desarrollar, debe usar estos errores para refinar su software y las políticas de SELinux antes de aplicarlas. Para obtener más detalles, consulte Implementación de SELinux .

SELinux también admite un modo permisivo por dominio en el que se pueden hacer permisivos dominios (procesos) específicos mientras se coloca el resto del sistema en modo de aplicación global. Un dominio es simplemente una etiqueta que identifica un proceso o conjunto de procesos en la política de seguridad, donde todos los procesos etiquetados con el mismo dominio son tratados de manera idéntica por la política de seguridad. El modo permisivo por dominio permite la aplicación incremental de SELinux a una porción cada vez mayor del sistema y el desarrollo de políticas para nuevos servicios (mientras mantiene el cumplimiento del resto del sistema).

Fondo

El modelo de seguridad de Android se basa en parte en el concepto de sandbox de aplicaciones . Cada aplicación se ejecuta en su propia zona de pruebas. Antes de Android 4.3, estos entornos limitados se definían mediante la creación de un UID de Linux único para cada aplicación en el momento de la instalación. Android 4.3 y versiones posteriores usan SELinux para definir aún más los límites de la zona de pruebas de la aplicación de Android.

En Android 5.0 y versiones posteriores, SELinux se aplica por completo, basándose en el lanzamiento permisivo de Android 4.3 y la aplicación parcial de Android 4.4. Con este cambio, Android pasó de la aplicación en un conjunto limitado de dominios cruciales ( installd , netd , vold y zygote ) a todo (más de 60 dominios). Específicamente:

  • Todo está en modo de aplicación en Android 5.x y superior.
  • Ningún proceso que no sea init debe ejecutarse en el dominio init .
  • Cualquier denegación genérica (para un block_device , socket_device , default_service ) indica que el dispositivo necesita un dominio especial.

Android 6.0 fortaleció el sistema al reducir la permisividad de nuestra política para incluir un mejor aislamiento entre los usuarios, filtrado IOCTL, menor amenaza de servicios expuestos, mayor ajuste de los dominios SELinux y acceso /proc extremadamente limitado.

Android 7.0 actualizó la configuración de SELinux para bloquear aún más la zona de pruebas de la aplicación y reducir la superficie de ataque. Esta versión también dividió la pila monolítica del servidor de medios en procesos más pequeños para reducir el alcance de sus permisos. Para obtener más detalles, consulte Protección de Android con más defensas del kernel de Linux y Fortalecimiento de la pila de medios .

Android 8.0 actualizó SELinux para que funcione con Treble , que separa el código del proveedor de nivel inferior del marco del sistema Android. Esta versión actualizó la política de SELinux para permitir que los fabricantes de dispositivos y los proveedores de SOC actualicen sus partes de la política, construyan sus imágenes ( vendor.img , boot.img , etc.) y luego actualicen esas imágenes independientemente de la plataforma o viceversa.

Si bien es posible tener una versión de plataforma (marco) superior o más nueva ejecutándose en el dispositivo, el caso contrario no es compatible; las imágenes del proveedor ( vendor.img/odm.img ) no pueden tener una versión más nueva que la plataforma ( system.img ). Por lo tanto, una versión más nueva de la plataforma podría presentar problemas de compatibilidad con SELinux porque la política de SELinux de la plataforma está en una versión más nueva que las partes de la política de SELinux del proveedor. El modelo de Android 8.0 proporciona un método para mantener la compatibilidad para evitar OTA simultáneas innecesarias.

Recursos adicionales

Para obtener ayuda para construir políticas útiles de SELinux, consulte los siguientes recursos.