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 necesarios para realizar la función. La implementación original de las capabilities hacía imposible que los procesos bifurcados y ejecutados heredaran capabilities, a menos que los archivos que se ejecutaban tuvieran capacidades de archivo configuradas. Las capacidades de los archivos, a su vez, presentan un riesgo de seguridad, ya que cualquier proceso que ejecute un archivo con capacidades de archivo puede obtener esas capacidades.
Las capacidades ambientales permiten que los servicios del sistema que inicia 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 inicie init, puedes usar el archivo .rc
asociado con el servicio para configurar las funciones de ese servicio.
Las capacidades ambientales son el mecanismo preferido para establecer capacidades para los servicios que inicia init (este método mantiene todos los aspectos de la configuración del servicio en un solo archivo .rc
). Te recomendamos que uses las funciones de entorno en lugar de configurar las funciones del sistema de archivos con la sección de mayúsculas en los archivos config.fs
.
Cuando configures capacidades para servicios que no se inician con init, continúa configurando las capacidades del sistema de archivos con fs_config.c
.
Habilita las funciones de ambiente
Para habilitar las funciones de ambiente para un servicio determinado, usa la palabra clave capabilities
en init. Para obtener detalles sobre el lenguaje de init actual, consulta el archivo init README.md.
Por ejemplo, para habilitar las funciones de ambiente para el servicio wificond
de AOSP, el archivo.rc del servicio wificond
configura el usuario y los grupos adecuados, y le otorga al servicio las funciones 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 de kernel comunes de Android relevantes.
El parche principal de funciones de ambiente https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 se retroportó en las siguientes versiones:
- android-3.18:
- android-4.1:
Se retroportó una pequeña corrección de seguridad https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3:
- android-3.18:
- android-4.1:
Validación
Las pruebas de unidades de Bionic incluyen pruebas de unidades para capacidades ambientales. Además, usar la palabra clave "capabilities" en el inicio 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.