Integridad del flujo de control del kernel

La integridad del flujo de control (CFI) es un mecanismo de seguridad que no permite cambios en el gráfico de flujo de control original de un binario compilado, lo que dificulta significativamente la realización de dichos ataques.

En Android 9, habilitamos la implementación de CFI de LLVM en más componentes y también en el kernel. El CFI del sistema está activado de forma predeterminada, pero es necesario habilitar el CFI del kernel.

El CFI de LLVM requiere compilación con Link-Time Optimization (LTO) . LTO conserva la representación del código de bits LLVM de los archivos objeto hasta el momento del enlace, lo que permite al compilador razonar mejor qué optimizaciones se pueden realizar. Habilitar LTO reduce el tamaño del binario final y mejora el rendimiento, pero aumenta el tiempo de compilación. En las pruebas en Android, la combinación de LTO y CFI genera una sobrecarga insignificante en el tamaño y el rendimiento del código; en algunos casos ambos mejoraron.

Para obtener más detalles técnicos sobre CFI y cómo se manejan otras comprobaciones de control directo, consulte la documentación de diseño de LLVM .

Implementación

Los parches de kCFI se encuentran en todas las versiones compatibles del kernel de Android. La opción CONFIG_CFI_CLANG habilita kCFI y está configurada de forma predeterminada en GKI.

Solución de problemas

Después de habilitarlo, solucione cualquier error de discrepancia de tipos que pueda existir con sus controladores. Una llamada de función indirecta a través de un puntero de función incompatible activa CFI. Cuando se detecta una falla de CFI, el kernel imprime una advertencia que incluye tanto la función que se llamó como el seguimiento de la pila que provocó la falla. Corrija esto asegurándose de que los punteros de función siempre tengan el mismo tipo que la función que se llama.

Para ayudar a depurar fallas de CFI, habilite CONFIG_CFI_PERMISSIVE , que imprime una advertencia en lugar de provocar un pánico en el kernel. El modo permisivo no se debe utilizar en producción.

Validación

Actualmente, no existe ninguna prueba CTS específica para CFI. En su lugar, asegúrese de que las pruebas CTS pasen con o sin CFI habilitado para verificar que CFI no esté afectando el dispositivo.