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

Escudo

Scudo es un asignador de memoria dinámico en modo de usuario, o asignador de montón , diseñado para resistir las vulnerabilidades relacionadas con el montón (como el desbordamiento de búfer basado en el montón , usar después de la liberación y doble libre ) mientras se mantiene el rendimiento. Proporciona las primitivas estándar de asignación y desasignación de C (como malloc y free), así como las primitivas de C ++ (como new y delete).

Scudo es más una mitigación que un detector de errores de memoria completo 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 tenía que habilitarse por binario configurando la LOCAL_SANITIZE := scudo en el archivo .mk o sanitize: { scudo: true, } en el archivo .bp.

Scudo es de código abierto y parte del proyecto compiler-rt de LLVM. La documentación está disponible en https://llvm.org/docs/ScudoHardenedAllocator.html . El tiempo de ejecución de Scudo se envía como parte de la cadena de herramientas de Android y se agregó soporte a Soong y Make para permitir una fácil habilitación del asignador en 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: defina una función __scudo_default_options en el programa que devuelve la cadena de opciones que se analizará. Esta función debe tener el siguiente prototipo: extern "C" const char *__scudo_default_options() .
  • Dinámicamente: use la variable de entorno SCUDO_OPTIONS contiene la cadena de opciones que se analizará. Las opciones definidas de esta manera anulan cualquier definición realizada a través de __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. Establecer tanto this como ThreadLocalQuarantineSizeKb en cero deshabilita 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. Establecer tanto esto como QuarantineSizeKb en cero deshabilita 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 el RSS del proceso alcanza este límite, las asignaciones adicionales fallan o devuelven un null (según el valor de allocator_may_return_null ), hasta que el RSS 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, la herramienta llama a abort() 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 generalmente comienza con Scudo ERROR: seguido de un breve resumen del problema junto con los indicadores.

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 del encabezado del fragmento 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 subprocesos diferentes están intentando manipular el mismo encabezado 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 fragmento no se encuentra en el estado esperado para una operación determinada, por ejemplo, no se asigna al intentar liberarlo o no se pone en cuarentena cuando se intenta reciclarlo. Un doble gratis es la razón típica de este error.
  • misaligned pointer : los requisitos básicos de alineación se aplican enérgicamente: 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á habilitada, una función de desasignación llamada en un fragmento debe coincidir con el tipo de función que se llamó para asignarlo. Este tipo de discrepancia puede generar problemas de seguridad.
  • invalid sized delete : cuando se usa el operador de eliminación de tamaño C ++ 14 y la verificación opcional está habilitada, hay una falta de coincidencia entre el tamaño que se pasó al desasignar un fragmento y el tamaño que se solicitó al asignarlo. Esto suele ser un problema del compilador o una confusión de tipos en el objeto que se desasigna.
  • RSS limit exhausted : se ha superado el máximo de RSS especificado opcionalmente.

Si está depurando un bloqueo en el propio sistema operativo, puede utilizar una compilación del sistema operativo HWASan . Si está depurando un bloqueo en una aplicación, también es posible utilizar una compilación de la aplicación HWASan .