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

Escudo

Scudo es un asignador de dinámica en modo de usuario de la memoria, o asignador montón, diseñado para ser resistente contra las vulnerabilidades del montón-relacionados (tales como el desbordamiento de heap tampón , uso después de liberación , y doble libre ) mientras se mantiene el rendimiento. Proporciona la asignación C y desasignación primitivas estándar (como malloc y libre), así como las primitivas C ++ (como nuevo y Borrar).

Scudo es más de una mitigación de un detector de error de memoria de pleno derecho como AddressSanitizer (ASAN) .

A partir de la versión de Android 11, scudo se usa para todo el código nativo (excepto en dispositivos con poca memoria, donde todavía se usa jemalloc). En tiempo de ejecución, todas las asignaciones y desasignaciones nativas del montón son atendidas por Scudo para todos los ejecutables y sus dependencias de biblioteca, y el proceso se interrumpe si se detecta una corrupción o un comportamiento sospechoso en el montón.

En Android 10, Scudo tuvieron que ser habilitado en una base por binaria estableciendo el LOCAL_SANITIZE := scudo opción en el archivo o la .mk sanitize: { scudo: true, } en el archivo .bp.

Scudo es de código abierto y parte del proyecto compilador-rt de LLVM. La documentación está disponible en https://llvm.org/docs/ScudoHardenedAllocator.html . Las naves de tiempo de ejecución Scudo como parte de la cadena de herramientas de Android y el apoyo se añadió a Soong y hacen para permitir una fácil habilitación del asignador de un binario.

Puede habilitar o deshabilitar la mitigación adicional dentro del asignador utilizando las opciones que se describen a continuación.

Personalización

Algunos parámetros del asignador se pueden definir por proceso de varias maneras:

  • Estáticamente: definir un __scudo_default_options función en el programa que devuelve la cadena de opciones para ser analizada. Esta función debe tener el siguiente prototipo: extern "C" const char *__scudo_default_options() .
  • Dinámicamente: Utilice la variable de entorno SCUDO_OPTIONS que contienen la cadena de opciones que se analizan. Opciones definidas de esta manera anulan cualquier definición hecha a través __scudo_default_options .

Las siguientes opciones están disponibles.

Opción Predeterminado de 64 bits Predeterminado de 32 bits Descripción
QuarantineSizeKb 256 64 El tamaño (en KB) de la cuarentena utilizada para retrasar la desasignación real de fragmentos. Un valor más bajo puede reducir el uso de memoria pero disminuir la efectividad de la mitigación; un valor negativo vuelve a los valores predeterminados. Ajuste de los dos esto y ThreadLocalQuarantineSizeKb a cero desactiva la cuarentena por completo.
QuarantineChunksUpToSize 2048 512 El tamaño (en bytes) hasta el que se pueden poner en cuarentena los fragmentos.
ThreadLocalQuarantineSizeKb 64 16 El tamaño (en KB) del caché por subproceso que se utiliza para descargar la cuarentena global. Un valor más bajo puede reducir el uso de memoria, pero puede aumentar la contención en la cuarentena global. Ajuste de los dos esto y QuarantineSizeKb a cero desactiva la cuarentena por completo.
DeallocationTypeMismatch false false Habilita el informe de errores en malloc / delete, new / free, new / delete []
DeleteSizeMismatch true true Habilita el informe de errores sobre la discrepancia entre los tamaños de nuevo y eliminar.
ZeroContents false false Permite cero contenido de fragmentos en la asignación y desasignación.
allocator_may_return_null false false Especifica que el asignador puede devolver un valor nulo cuando se produce un error recuperable, en lugar de finalizar el proceso.
hard_rss_limit_mb 0 0 Cuando el RSS del proceso alcanza este límite, el proceso termina.
soft_rss_limit_mb 0 0 Cuando RSS del proceso alcanza este límite, nuevas asignaciones fallan o devolución null (en función del valor de allocator_may_return_null ), hasta que el flujo vuelve a bajar para permitir nuevas asignaciones.
allocator_release_to_os_interval_ms N / A 5000 Solo afecta a un asignador de 64 bits. Si se establece, intenta liberar memoria no utilizada al sistema operativo, pero no más a menudo que este intervalo (en milisegundos). Si el valor es negativo, la memoria no se libera al sistema operativo.
abort_on_error true true Si se establece, las llamadas herramientas abort() en lugar de _exit() después de imprimir el mensaje de error.

Validación

Actualmente, no hay pruebas CTS específicas para Scudo. En su lugar, asegúrese de que las pruebas CTS pasen con o sin Scudo habilitado para un binario determinado para verificar que no afecte al dispositivo.

Solución de problemas

Si se detecta un problema no recuperable, el asignador muestra un mensaje de error en el descriptor de error estándar y luego finaliza el proceso. Los seguimientos de pila que conducen a la terminación se agregan al registro del sistema. La salida por lo general comienza con Scudo ERROR: seguido de un breve resumen del problema junto con los punteros.

A continuación, se muestra una lista de los mensajes de error actuales y sus posibles causas:

  • corrupted chunk header : La verificación de la suma de comprobación de la cabecera trozo ha fallado. Es probable que esto se deba a una de estas dos cosas: el encabezado se sobrescribió (parcial o totalmente) o el puntero pasado a la función no es un fragmento.
  • race on chunk header : Dos hilos diferentes están tratando de manipular la misma cabecera al mismo tiempo. Esto suele ser sintomático de una condición de carrera o una falta general de bloqueo al realizar operaciones en ese fragmento.
  • invalid chunk state : El trozo no está en el estado de espera para una operación dada, por ejemplo, no es asignado al intentar liberarla, o no está en cuarentena cuando se trata de reciclarlo. Un doble gratis es la razón típica de este error.
  • misaligned pointer : requisitos de alineación básicos están fuertemente cumplir: 8 bytes en plataformas de 32 bits y 16 bytes en plataformas de 64 bits. Si un puntero pasado a nuestras funciones no se ajusta a ellas, el puntero pasado a una de las funciones está desalineado.
  • allocation type mismatch : Cuando esta opción está activada, una función de cancelación de asignación llamada en un trozo tiene que coincidir con el tipo de función que se llama asignarlo. Este tipo de discrepancia puede generar problemas de seguridad.
  • invalid sized delete : Cuando se utiliza el tamaño operador delete de C ++ 14, y el control opcional está activado, hay un desajuste entre el tamaño que fue aprobada cuando desasignar un trozo y el tamaño que se solicitó en la asignación de la misma. Esto es típicamente una cuestión compilador o un tipo de confusión en el objeto que está siendo desasignado.
  • RSS limit exhausted : El RSS máximo opcionalmente especificado se ha excedido.

Si va a depurar un accidente en el sistema operativo en sí, se puede utilizar una acumulación Hwasan OS . Si va a depurar un accidente en una aplicación, es posible utilizar un Hwasan aplicación acumulación también.