Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Higienización por desbordamiento de enteros

Los desbordamientos de enteros no intencionados pueden provocar daños en la memoria o vulnerabilidades de divulgación de información en variables asociadas con accesos o asignaciones de memoria. Para combatir esto, agregamos desinfectantes de desbordamiento de enteros firmados y no firmados UndefinedBehaviorSanitizer (UBSan) de Clang para fortalecer el marco de medios en Android 7.0. En Android 9, ampliamos UBSan para abarcar más componentes y mejoramos la compatibilidad con el sistema de compilación.

Esto está diseñado para agregar comprobaciones en torno a operaciones / instrucciones aritméticas, que pueden desbordarse, para abortar un proceso de forma segura si se produce un desbordamiento. Estos desinfectantes pueden mitigar una clase completa de corrupción de memoria y vulnerabilidades de divulgación de información donde la causa principal es un desbordamiento de enteros, como la vulnerabilidad Stagefright original.

Ejemplos y fuente

Integer Overflow Sanitization (IntSan) es proporcionado por el compilador y agrega instrumentación al binario durante el tiempo de compilación para detectar desbordamientos aritméticos. Está habilitado de forma predeterminada en varios componentes de la plataforma, por ejemplo /platform/external/libnl/Android.bp .

Implementación

IntSan utiliza desinfectantes de desbordamiento de enteros firmados y sin firmar 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 Integer Overflow Sanitization para componentes adicionales. Los candidatos ideales son el código nativo privilegiado o el código nativo que analiza la entrada del usuario que no es de confianza. Hay una pequeña sobrecarga de rendimiento asociada con el desinfectante que depende del uso del código y la prevalencia de operaciones aritméticas. Espere un pequeño porcentaje de gastos generales y pruebe si el rendimiento es un problema.

Soporte de IntSan en archivos MAKE

Para habilitar IntSan en un archivo MAKE, agregue:

LOCAL_SANITIZE := integer_overflow
# Optional features
LOCAL_SANITIZE_DIAG := integer_overflow
LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt
  • LOCAL_SANITIZE toma una lista de desinfectantes separados por comas, con integer_overflow como un conjunto de opciones preempaquetadas para los desinfectantes de desbordamiento de enteros firmados y sin firmar con una lista negra predeterminada .
  • LOCAL_SANITIZE_DIAG activa el modo de diagnóstico para los desinfectantes. Utilice el modo de diagnóstico solo durante las pruebas, ya que no se interrumpirá en caso de desbordamientos, lo que anulará por completo la ventaja de seguridad de la mitigación. Consulte Solución de problemas para obtener detalles adicionales.
  • LOCAL_SANITIZE_BLACKLIST permite especificar un archivo de lista negra para evitar que se desinfecten funciones y archivos fuente. Consulte Solución de problemas para obtener detalles adicionales.

Si desea un control más granular, habilite los desinfectantes individualmente usando uno o ambos indicadores:

LOCAL_SANITIZE := signed-integer-overflow, unsigned-integer-overflow
LOCAL_SANITIZE_DIAG := signed-integer-overflow, unsigned-integer-overflow

Soporte de IntSan en archivos de planos

Para habilitar la desinfección de desbordamiento de enteros en un archivo de plano, como /platform/external/libnl/Android.bp , agregue:

   sanitize: {
      integer_overflow: true,
      diag: {
          integer_overflow: true,
      },
      blacklist: "modulename_blacklist.txt",
   },

Al igual que con los archivos make, la propiedad integer_overflow es un conjunto de opciones preempaquetadas para los desinfectantes de desbordamiento de enteros firmados y sin firmar con una lista negra predeterminada .

El diag conjunto de propiedades permite a modo de diagnóstico para los desinfectantes. Utilice el modo de diagnóstico solo durante la prueba. El modo de diagnóstico no cancela los desbordamientos, lo que niega por completo la ventaja de seguridad de la mitigación en las compilaciones de usuarios. Consulte Solución de problemas para obtener detalles adicionales.

La propiedad de blacklist permite la especificación de un archivo de lista negra que permite a los desarrolladores evitar que se desinfecten funciones y archivos fuente. Consulte Solución de problemas para obtener detalles adicionales.

Para habilitar los desinfectantes individualmente, use:

   sanitize: {
      misc_undefined: ["signed-integer-overflow", "unsigned-integer-overflow"],
      diag: {
          misc_undefined: ["signed-integer-overflow",
                           "unsigned-integer-overflow",],
      },
      blacklist: "modulename_blacklist.txt",
   },

Solución de problemas

Si habilita la desinfección de desbordamiento de enteros en nuevos componentes, o confía en las bibliotecas de plataforma que han tenido una desinfección de desbordamiento de enteros, puede encontrarse con algunos problemas con desbordamientos de enteros benignos que causan abortos. Debe probar los componentes con la desinfección habilitada para asegurarse de que puedan surgir desbordamientos benignos.

Para encontrar, abortos causados ​​por desinfección en compilaciones de usuarios, busque bloqueos SIGABRT con mensajes de Abort que indiquen un desbordamiento detectado por UBSan, como:

pid: ###, tid: ###, name: Binder:###  >>> /system/bin/surfaceflinger <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'ubsan: sub-overflow'

El seguimiento de la pila debe incluir la función que provoca la interrupción, sin embargo, los desbordamientos que se producen en las funciones en línea pueden no ser evidentes en el seguimiento de la pila.

Para determinar más fácilmente la causa raíz, habilite los diagnósticos en la biblioteca que activan el aborto e intente reproducir el error. Con los diagnósticos habilitados, el proceso no se abortará y, en cambio, continuará ejecutándose. No abortar ayuda a maximizar el número de desbordamientos benignos en una ruta de ejecución en particular sin tener que volver a compilar después de corregir cada error. Diagnostics produce un mensaje de error que incluye el número de línea y el archivo de origen que provocan el aborto:

frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:2188:32: runtime error: unsigned integer overflow: 0 - 1 cannot be represented in type 'size_t' (aka 'unsigned long')

Una vez que se localiza la operación aritmética problemática, asegúrese de que el desbordamiento sea benigno y intencionado (por ejemplo, que no tenga implicaciones de seguridad). Puede abordar el aborto del desinfectante de la siguiente manera:

  • Refactorizar el código para evitar el desbordamiento ( ejemplo )
  • Desbordamiento explícito a través de las funciones de desbordamiento __builtin _ * _ de Clang ( ejemplo )
  • Deshabilitar la desinfección en la función especificando el atributo no_sanitize ( ejemplo )
  • Deshabilitar la desinfección de una función o archivo fuente a través de un archivo de lista negra ( ejemplo )

Debe utilizar la solución más granular posible. Por ejemplo, una función grande con muchas operaciones aritméticas y una sola operación de desbordamiento debería tener la operación única refactorizada en lugar de la función completa en la lista negra.

Los patrones comunes que pueden resultar en desbordamientos benignos incluyen:

  • Conversiones implícitas en las que se produce un desbordamiento sin firmar antes de convertirse en un tipo firmado ( ejemplo )
  • Eliminaciones de listas vinculadas que disminuyen el índice de bucle al eliminarlas ( ejemplo )
  • Asignar un tipo sin firmar a -1 en lugar de especificar el valor máximo real ( ejemplo )
  • Bucles que reducen un entero sin signo en la condición ( ejemplo , ejemplo )

Se recomienda que los desarrolladores se aseguren de que los casos en los que el desinfectante detecte un desbordamiento sea realmente benigno sin efectos secundarios no deseados o implicaciones de seguridad antes de deshabilitar la desinfección.

Deshabilitar IntSan

Puede desactivar IntSan con listas negras o atributos de función. Desactive con moderación y solo cuando la refactorización del código no sea razonable o si hay una sobrecarga de rendimiento problemática.

Consulte la documentación de Clang anterior para obtener más información sobre cómo deshabilitar IntSan con atributos de función y formato de archivo de lista negra . La lista negra debe estar dirigida al desinfectante en particular mediante el uso de nombres de sección que especifiquen el desinfectante objetivo para evitar afectar a otros desinfectantes.

Validación

Actualmente, no hay ninguna prueba CTS específica para la desinfección por desbordamiento de enteros. En su lugar, asegúrese de que las pruebas CTS pasen con o sin IntSan habilitado para verificar que no afecte al dispositivo.