LímitesDesinfectante

BoundsSanitizer (BoundSan) agrega instrumentación a los binarios para insertar comprobaciones de límites alrededor de los accesos a matrices. Estas comprobaciones se añaden si el compilador no puede probar en el momento de la compilación que el acceso será seguro y si el tamaño de la matriz se conocerá en tiempo de ejecución, de modo que pueda comprobarse. Android 10 implementa BoundSan en Bluetooth y códecs. BoundSan lo proporciona el compilador y está habilitado de forma predeterminada en varios componentes de la plataforma.

Implementación

BoundSan utiliza el desinfectante de límites de UBSan . Esta mitigación está habilitada a nivel de módulo. Ayuda a mantener seguros los componentes críticos de Android y no debe desactivarse.

Le recomendamos encarecidamente que habilite BoundSan para componentes adicionales. Los candidatos ideales son el código nativo privilegiado o el código nativo complejo que analiza la entrada del usuario que no es de confianza. La sobrecarga de rendimiento asociada con la habilitación de BoundSan depende de la cantidad de accesos al arreglo que no se puede probar que sean seguros. Espere un pequeño porcentaje de gastos generales en promedio y pruebe si el rendimiento es una preocupación.

Habilitación de BoundSan en archivos blueprint

BoundSan se puede habilitar en archivos blueprint agregando "bounds" a la propiedad sanitize misc_undefined para módulos binarios y de biblioteca:

sanitize: {
   misc_undefined: ["bounds"],
   diag: {
      misc_undefined: ["bounds"],
   },
   blacklist: "modulename_blacklist.txt",

diagnóstico

La propiedad diag habilita el modo de diagnóstico para los desinfectantes. Use el modo de diagnóstico solo durante la prueba. El modo de diagnóstico no se cancela en los desbordamientos, lo que anula la ventaja de seguridad de la mitigación y conlleva una mayor sobrecarga de rendimiento, por lo que no se recomienda para compilaciones de producción.

lista negra

La propiedad de la blacklist permite la especificación de un archivo de lista negra que los desarrolladores pueden usar para evitar que las funciones y los archivos fuente se desinfecten. Use esta propiedad solo si el rendimiento es una preocupación y los archivos/funciones de destino contribuyen sustancialmente. Audite manualmente estos archivos/funciones para asegurarse de que los accesos a la matriz sean seguros. Consulte Solución de problemas para obtener detalles adicionales.

Habilitación de BoundSan en archivos MAKE

BoundSan se puede habilitar en makefiles agregando "bounds" a la variable LOCAL_SANITIZE para módulos binarios y de biblioteca:

LOCAL_SANITIZE := bounds
# Optional features
LOCAL_SANITIZE_DIAG := bounds
LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt

LOCAL_SANITIZE acepta una lista de desinfectantes separados por una coma.

LOCAL_SANITIZE_DIAG activa el modo de diagnóstico. Use el modo de diagnóstico solo durante la prueba. El modo de diagnóstico no se cancela en los desbordamientos, lo que anula la ventaja de seguridad de la mitigación y conlleva una mayor sobrecarga de rendimiento, por lo que no se recomienda para compilaciones de producción.

LOCAL_SANITIZE_BLACKLIST permite la especificación de un archivo de lista negra que permite a los desarrolladores evitar que se desinfecten las funciones y los archivos fuente. Use esta propiedad solo si el rendimiento es una preocupación y los archivos/funciones de destino contribuyen sustancialmente. Audite manualmente estos archivos/funciones para asegurarse de que los accesos a la matriz sean seguros. Consulte Solución de problemas para obtener detalles adicionales.

Deshabilitar BoundSan

Puede deshabilitar BoundSan en funciones y archivos fuente con listas negras o atributos de funciones. Es mejor mantener habilitado BoundSan, así que solo desactívelo si la función o el archivo genera una gran sobrecarga de rendimiento y la fuente se revisó manualmente.

Para obtener más información sobre cómo deshabilitar BoundSan con atributos de función y formato de archivo de lista negra , consulte la documentación de Clang LLVM. Alcance la lista negra para el desinfectante en particular mediante el uso de nombres de sección que especifiquen el desinfectante de destino para evitar que afecte a otros desinfectantes.

Validación

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

Solución de problemas

Pruebe exhaustivamente los componentes después de habilitar BoundSan para asegurarse de que se aborden los accesos fuera de los límites no detectados anteriormente.

Los errores de BoundSan se pueden identificar fácilmente, ya que incluyen el siguiente mensaje de cancelación de desecho:

pid: ###, tid: ###, name: Binder:###  >>> /system/bin/foobar <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'ubsan: out-of-bounds'

Cuando se ejecuta en modo de diagnóstico, el archivo de origen, el número de línea y el valor del índice se imprimen en logcat . De forma predeterminada, este modo no arroja un mensaje de cancelación. Revise logcat para comprobar si hay errores.

external/foo/bar.c:293:13: runtime error: index -1 out of bounds for type 'int [24]'