Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

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 mucho la realización de tales 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 debe habilitar la CFI del kernel.

CFI de LLVM requiere compilar con Link-Time Optimization (LTO) . LTO conserva la representación de código de bits LLVM de los archivos de objeto hasta el momento del enlace, lo que permite al compilador razonar mejor sobre las optimizaciones que 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 en el tamaño y el rendimiento del código; en unos pocos casos ambos mejoraron.

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

Implementación

El soporte para el kernel CFI existe en las versiones comunes del kernel de Android 4.9 y 4.14. Si su kernel está basado en la versión 4.9 o 4.14 y lo compila con Clang, entonces puede habilitarlo. Para habilitar kCFI, debe copiar los parches relevantes y actualizar su archivo de configuración del kernel.

Copiar parches de kCFI

Agregue estos cambios a su kernel:

Habilitar kCFI

Una vez que haya copiado los cambios relevantes, debe habilitar kCFI en el archivo de configuración de su kernel, como /kernel/ PROJECT /+/ BRANCH /arch/arm64/configs/ PROJECT _defconfig .

Para habilitar kCFI, agregue estas líneas:

CONFIG_LTO_CLANG=y
CONFIG_CFI_CLANG=y

Solución de problemas

Después de habilitarlo, solucione cualquier error de desajuste de tipos 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 que se llamó como el seguimiento de 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 causar un pánico en el kernel. El modo permisivo no debe usarse en producción.

Validación

Actualmente, no hay una 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.