Capacidades ambientales

Las capacidades permiten que los procesos de Linux eliminen la mayoría de los privilegios de raíz y conserven a la vez el subconjunto de privilegios que requieren para realizar su función. La implementación original de las capacidades imposibilitaba que los procesos bifurcados y ejecutados heredaran capacidades, a menos que los archivos que se ejecutaban tuvieran capacidades de archivo configuradas. A su vez, las capacidades de archivos representan un riesgo de seguridad, ya que cualquier proceso que ejecute un archivo con capacidades de archivos puede obtener esas capacidades.

Las capacidades ambientales permiten que los servicios del sistema iniciados por init configuren capacidades en sus archivos .rc, lo que integra la configuración en un solo archivo en lugar de dividirla en el archivo fs_config.c. Esto significa que, para cualquier servicio que se inicie con init, puedes usar el archivo .rc asociado al servicio para configurar las capacidades de ese servicio.

Las capacidades ambientales son el mecanismo preferido para establecer capacidades para los servicios iniciados por init (este método mantiene todos los aspectos de la configuración del servicio en un solo archivo .rc). Te recomendamos que uses capacidades ambientales en lugar de configurar capacidades del sistema de archivos con la sección caps en los archivos config.fs.

Cuando configures capacidades para servicios no iniciados por init, continúa configurando las capacidades del sistema de archivos con fs_config.c.

Cómo habilitar las funciones de Modo ambiente

Para habilitar las capacidades ambientales de un servicio determinado, usa la palabra clave capabilities en init. Para obtener detalles sobre el idioma de inicialización actual, consulta el archivo init README.md.

Por ejemplo, para habilitar las capacidades ambientales para el servicio wificond de AOSP, el archivo.rc del servicio wificond configura el usuario y los grupos adecuados, y otorga al servicio las capacidades especificadas con la palabra clave capabilities:

service wificond /system/bin/wificond
    class main
    user wifi
    group wifi net_raw net_admin
    capabilities NET_RAW NET_ADMIN

Implementación de referencia

La implementación de referencia es el kernel común de Android https://android.googlesource.com/kernel/common/.

Parches obligatorios

Los parches obligatorios se portaron a todas las ramas relevantes del kernel común de Android.

El parche principal de capacidades ambientales https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 se portó a versiones anteriores en los siguientes lugares:

Se realizó un port a versiones anteriores de una pequeña corrección de seguridad https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 en las siguientes versiones:

Validación

Las pruebas de unidades de Bionic incluyen pruebas de unidades para las capacidades ambientales. Además, usar la palabra clave "capabilities" en la inicialización de Android para un servicio y, luego, verificar que el servicio obtenga las capacidades esperadas permitiría realizar pruebas de tiempo de ejecución de esta función.