Las capacidades permiten que los procesos de Linux eliminen la mayoría de los privilegios de raíz, mientras que y retienen el subconjunto de privilegios que necesitan para cumplir su función. La implementación original de las capacidades impidió que la ejecución de fork+exec para heredar capacidades, a menos que los archivos en ejecución tuvieran capacidades configuradas. A su vez, las funciones de archivos presentan un riesgo de seguridad ya que cualquier proceso que ejecute un archivo con capacidades de archivo puede esas capacidades.
Las capacidades ambiente permiten que los servicios del sistema iniciados por init se configuren
en sus archivos .rc
, lo que permite que la configuración
un solo archivo, en lugar de dividir la configuración 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 capacidades para ese servicio.
Las capacidades ambientales son el mecanismo preferido para establecer capacidades
para los servicios lanzados por init (este método mantiene todos los aspectos
configuración en un solo archivo .rc
). Recomendamos usar modo
en lugar de
configurando el archivo
del sistema con la sección de límites en archivos config.fs
.
Cuando configuras capacidades para servicios no iniciados por init,
sigue configurando las capacidades del sistema de archivos
fs_config.c
Cómo habilitar las funciones de ambiente
Para habilitar las capacidades ambientales para un servicio determinado, usa el
Palabra clave capabilities
en el valor init. Para el idioma init actual
consulta la página
init README.md.
Por ejemplo, para habilitar las capacidades ambiente para el servicio del AOSP.
wificond
, el
Archivo.rc
para el servicio wificond
, configura la
usuario y grupos, y le da al servicio las capacidades especificadas usando el
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 necesarios
Se trasladaron los parches necesarios a todos los kernel comunes de Android relevantes. ramas.
Parche principal de capacidades ambientales: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 se trasladaron a una versión anterior en:
- Android-3.18
- Android 4.1
Una pequeña solución de seguridad: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 se trasladaron a una versión anterior en:
- Android-3.18
- Android 4.1
Validación
Biónico las pruebas de unidades incluyen pruebas de unidades para las capacidades de ambiente. Más allá de eso, usar las “capacidades” en el init de Android de un servicio y, luego, comprobar que el servicio obtiene las capacidades esperadas permitirían realizar pruebas en el tiempo de ejecución de esta función.