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 imposibilitó que los procesos fork+exec'd heredaran capacidades, a menos que los archivos que se ejecutaban tuvieran capacidades de archivo configuradas. A su vez, las capacidades de archivo 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 iniciados por init configuren
capacidades en sus .rc archivos, lo que integra la configuración en
un solo archivo en lugar de dividirla en el
fs_config.c archivo. Esto significa que, para cualquier servicio iniciado por
init, puedes usar el archivo .rc asociado con el servicio para
configurar las capacidades de ese servicio.
Las capacidades ambientales son el mecanismo preferido para configurar 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 las capacidades del sistema de archivos con la sección caps en config.fs archivos.
Cuando configures capacidades para servicios que no se inicien con init,
continúa configurando las capacidades del sistema de archivos con
fs_config.c.
Cómo habilitar las capacidades ambientales
Para habilitar las capacidades ambientales de un servicio determinado, usa la
capabilities palabra clave en init. Para obtener detalles sobre el lenguaje init actual
consulta el archivo README.md de init.
Por ejemplo, para habilitar las capacidades ambientales del servicio AOSP
wificond, el archivo
.rc
para el servicio wificond configura el usuario y los grupos adecuados, y le 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_ADMINImplementació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 transfirieron a todas las ramas pertinentes del kernel común de Android ramas.
El parche principal de capacidades ambientales https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 se transfirió en:
- android-3.18:
- android-4.1:
Se transfirió una pequeña corrección de seguridad https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 en:
- android-3.18:
- android-4.1:
Validación
Las pruebas de unidades de Bionic incluyen pruebas de unidades para capacidades ambientales. Más allá de eso, usar la palabra clave "capabilities" en init de Android para un servicio y, luego, verificar que el servicio obtenga las capacidades esperadas permitiría probar esta función en el tiempo de ejecución.