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]'