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 este tipo de 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 debe habilitar el CFI del kernel.

El CFI de LLVM requiere compilación con Link-Time Optimization (LTO) . LTO conserva la representación de código de bits LLVM de los archivos de objetos hasta el momento del enlace, lo que permite al compilador razonar mejor sobre 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 da como resultado una sobrecarga insignificante para 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 verificaciones de control directo, consulte la documentación de diseño de LLVM .

Implementación

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

Solución de problemas

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

Para asistir en la depuración de fallas de CFI, habilite CONFIG_CFI_PERMISSIVE , que imprime una advertencia en lugar de causar un pánico en el kernel. El modo permisivo no debe utilizarse en producción.

Validación

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