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 del flujo de control original de un objeto binario compilado, lo que dificulta considerablemente que se produzcan estos ataques.

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

La CFI de LLVM requiere la compilación con optimización del tiempo de vinculación (LTO). El LTO preserva la representación de código de bits de LLVM de los archivos objeto hasta el tiempo de vinculación, lo que permite que el compilador razone mejor sobre qué optimizaciones se pueden realizar. Habilitar LTO reduce el tamaño del objeto 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 la CFI y cómo se manejan otras verificaciones de control de reenvío, consulta la documentación de diseño de LLVM.

Implementación

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

Solución de problemas

Después de habilitarlo, soluciona cualquier error de discrepancia de tipo que pueda existir con sus controladores. Una llamada a función indirecta a través de un puntero de función incompatible activa la CFI. Cuando se detecta una falla de CFI, el kernel imprime una advertencia que incluye la función a la que se llamó y el seguimiento de pila que provocó la falla. Para corregir esto, asegúrate de que los punteros de función siempre tengan el mismo tipo que la función a la que se llama.

Para ayudar a depurar fallas de CFI, habilita CONFIG_CFI_PERMISSIVE, que imprime una advertencia en lugar de causar un pánico del kernel. No se debe usar el modo permisivo en producción.

Validación

Actualmente, no hay pruebas de CTS específicas para CFI. En su lugar, asegúrate de que las pruebas de CTS se aprueben con y sin CFI habilitado para verificar que CFI no afecte al dispositivo.