stringtranslate.com

Integridad del flujo de control

La integridad del flujo de control ( CFI ) es un término general para las técnicas de seguridad informática que impiden que una amplia variedad de ataques de malware redirijan el flujo de ejecución (el flujo de control ) de un programa.

Fondo

Un programa de computadora cambia comúnmente su flujo de control para tomar decisiones y usar diferentes partes del código. Tales transferencias pueden ser directas , en las que la dirección de destino está escrita en el código mismo, o indirectas , en las que la dirección de destino en sí es una variable en la memoria o un registro de la CPU. En una llamada de función típica, el programa realiza una llamada directa, pero regresa a la función que la llamó usando la pila: una transferencia indirecta de borde hacia atrás . Cuando se llama a un puntero de función , como desde una tabla virtual , decimos que hay una transferencia indirecta de borde hacia adelante . [1] [2]

Los atacantes intentan inyectar código en un programa para aprovechar sus privilegios o extraer datos de su espacio de memoria. Antes de que el código ejecutable se convirtiera en un código de solo lectura, un atacante podía cambiar arbitrariamente el código mientras se ejecutaba, apuntando a transferencias directas o incluso prescindiendo de cualquier transferencia. Después de que W^X se generalizara, un atacante quiere en cambio redirigir la ejecución a un área separada y desprotegida que contenga el código que se va a ejecutar, haciendo uso de transferencias indirectas: se podría sobrescribir la tabla virtual para un ataque de borde hacia adelante o cambiar la pila de llamadas para un ataque de borde hacia atrás ( programación orientada al retorno ). CFI está diseñado para proteger las transferencias indirectas de ir a ubicaciones no deseadas. [1]

Técnicas

Las técnicas asociadas incluyen separación de punteros de código (CPS), integridad de punteros de código (CPI), canarios de pila , pilas de sombra y verificación de punteros vtable . [3] [4] [5] Estas protecciones se pueden clasificar en de grano grueso o de grano fino según el número de objetivos restringidos. Una implementación de CFI de borde delantero de grano grueso podría, por ejemplo, restringir el conjunto de objetivos de llamada indirecta a cualquier función que pueda llamarse indirectamente en el programa, mientras que una de grano fino restringiría cada sitio de llamada indirecta a funciones que tengan el mismo tipo que la función que se llamará. De manera similar, para un esquema de borde hacia atrás que proteja los retornos, una implementación de grano grueso solo permitiría que el procedimiento regrese a una función del mismo tipo (de las cuales podría haber muchas, especialmente para prototipos comunes), mientras que una de grano fino impondría una coincidencia de retorno precisa (para que pueda regresar solo a la función que lo llamó).

Implementaciones

Hay implementaciones relacionadas disponibles en Clang (LLVM en general), [6] Control Flow Guard de Microsoft [7] [8] [9] y Return Flow Guard, [10] Indirect Function-Call Checks de Google [11] y Reuse Attack Protector (RAP). [12] [13]

LLVM/Clang

LLVM/Clang ofrece una opción "CFI" que funciona en el borde delantero comprobando errores en tablas virtuales y conversiones de tipos. Depende de la optimización en tiempo de enlace (LTO) para saber qué funciones se supone que deben llamarse en casos normales. [14] Hay un esquema de " pila de llamadas de sombra " independiente que defiende en el borde trasero comprobando modificaciones de la pila de llamadas, disponible solo para aarch64. [15]

Google ha enviado Android con el kernel de Linux compilado por Clang con optimización de tiempo de enlace (LTO) y CFI desde 2018. [16] SCS está disponible para el kernel de Linux como una opción, incluso en Android. [17]

Tecnología de control de flujo de Intel

La tecnología de control de flujo de Intel (CET) detecta los riesgos para controlar la integridad del flujo con una pila de sombra (SS) y un seguimiento indirecto de rama (IBT). [18] [19]

El núcleo debe asignar una región de memoria para la pila de sombras que no sea escribible para programas del espacio de usuario excepto mediante instrucciones especiales. La pila de sombras almacena una copia de la dirección de retorno de cada CALL. En un RET, el procesador verifica si la dirección de retorno almacenada en la pila normal y la pila de sombras son iguales. Si las direcciones no son iguales, el procesador genera una INT #21 (Falla de protección de flujo de control).

El seguimiento de bifurcaciones indirectas detecta instrucciones JMP o CALL indirectas dirigidas a destinos no autorizados. Se implementa añadiendo una nueva máquina de estados interna en el procesador. El comportamiento de las instrucciones JMP y CALL indirectas se modifica de modo que cambien la máquina de estados de IDLE a WAIT_FOR_ENDBRANCH. En el estado WAIT_FOR_ENDBRANCH, la siguiente instrucción que se debe ejecutar debe ser la nueva instrucción ENDBRANCH (ENDBR32 en modo de 32 bits o ENDBR64 en modo de 64 bits), que cambia la máquina de estados interna de WAIT_FOR_ENDBRANCH a IDLE. Por lo tanto, cada destino autorizado de una JMP o CALL indirecta debe comenzar con ENDBRANCH. Si el procesador está en un estado WAIT_FOR_ENDBRANCH (es decir, la instrucción anterior era una JMP o CALL indirecta) y la siguiente instrucción no es una instrucción ENDBRANCH, el procesador genera una INT #21 (Fallo de protección de flujo de control). En los procesadores que no admiten el seguimiento de rama indirecta CET, las instrucciones ENDBRANCH se interpretan como NOP y no tienen efecto.

Protección del flujo de control de Microsoft

Control Flow Guard (CFG) se lanzó por primera vez para Windows 8.1 Update 3 (KB3000850) en noviembre de 2014. Los desarrolladores pueden agregar CFG a sus programas agregando el /guard:cfindicador de enlazador antes de vincular el programa en Visual Studio 2015 o posterior. [20]

A partir de Windows 10 Creators Update (versión 1703 de Windows 10), el kernel de Windows se compila con CFG. [21] El kernel de Windows utiliza Hyper-V para evitar que el código de kernel malicioso sobrescriba el mapa de bits CFG. [22]

CFG funciona creando un mapa de bits por proceso , donde un bit establecido indica que la dirección es un destino válido. Antes de realizar cada llamada de función indirecta, la aplicación verifica si la dirección de destino está en el mapa de bits. Si la dirección de destino no está en el mapa de bits, el programa finaliza. [20] Esto hace que sea más difícil para un atacante explotar un uso después de la liberación reemplazando el contenido de un objeto y luego usando una llamada de función indirecta para ejecutar una carga útil. [23]

Detalles de implementación

Para todas las llamadas de funciones indirectas protegidas, _guard_check_icallse llama a la función que realiza los siguientes pasos: [24]

  1. Convierte la dirección de destino en un desplazamiento y un número de bit en el mapa de bits.
    1. Los 3 bytes más altos son el desplazamiento de bytes en el mapa de bits.
    2. El desplazamiento de bits es un valor de 5 bits. Los primeros cuatro bits son los bits de orden inferior del 4.º al 8.º de la dirección.
    3. El quinto bit del desplazamiento de bits se establece en 0 si la dirección de destino está alineada con 0x10 (los últimos cuatro bits son 0) y en 1 si no lo está.
  2. Examinar el valor de la dirección del objetivo en el mapa de bits
    1. Si la dirección de destino está en el mapa de bits, regresa sin error.
    2. Si la dirección de destino no está en el mapa de bits, finalice el programa.

Técnicas de bypass

Existen varias técnicas genéricas para evitar CFG:

Protección de flujo ampliada de Microsoft

eXtended Flow Guard (XFG) aún no se ha lanzado oficialmente, pero está disponible en la vista previa de Windows Insider y se presentó públicamente en Bluehat Shanghai en 2019. [29]

XFG extiende CFG al validar las firmas de llamadas de función para garantizar que las llamadas de función indirectas se realicen únicamente al subconjunto de funciones con la misma firma. La validación de la firma de llamada de función se implementa agregando instrucciones para almacenar el hash de la función de destino en el registro r10 inmediatamente antes de la llamada indirecta y almacenando el hash de función calculado en la memoria inmediatamente antes del código de la dirección de destino. Cuando se realiza la llamada indirecta, la función de validación XFG compara el valor en r10 con el hash almacenado de la función de destino. [30] [31]

Véase también

Referencias

  1. ^ ab Payer, Mattias. "Integridad del flujo de control: una introducción". nebelwelt.net .
  2. ^ Burow, Nathan; Carr, Scott A.; Nash, Joseph; Larsen, Per; Franz, Michael; Brunthaler, Stefan; Payer, Mathias (31 de enero de 2018). "Integridad del flujo de control: precisión, seguridad y rendimiento". Encuestas de informática de ACM . 50 (1): 1–33. doi : 10.1145/3054924 .
  3. ^ Payer, Mathias ; Kuznetsov, Volodymyr. "Sobre las diferencias entre las propiedades CFI, CPS e CPI". nebelwelt.net . Consultado el 1 de junio de 2016 .
  4. ^ "El descubrimiento de un error en Adobe Flash conduce a un nuevo método de mitigación de ataques". Dark Reading . 10 de noviembre de 2015 . Consultado el 1 de junio de 2016 .
  5. ^ Endgame. "Endgame se presentará en Black Hat USA 2016". www.prnewswire.com (Nota de prensa) . Consultado el 1 de junio de 2016 .
  6. ^ "Control Flow Integrity — Documentación de Clang 3.9". clang.llvm.org . Consultado el 1 de junio de 2016 .
  7. ^ Pauli, Darren. "El mitigador de malware de Microsoft se actualizó, pero incluso Redmond dice que ya no es necesario". The Register . Consultado el 1 de junio de 2016 .
  8. ^ Mimoso, Michael (22 de septiembre de 2015). "Bypass desarrollado para Microsoft Memory Protection, Control Flow Guard". Threatpost | La primera parada para noticias de seguridad . Consultado el 1 de junio de 2016 .
  9. ^ Smith, Ms. (23 de septiembre de 2015). "DerbyCon: el antiguo ganador del premio BlueHat omitirá Control Flow Guard en Windows 10". Network World . Archivado desde el original el 27 de septiembre de 2015. Consultado el 1 de junio de 2016 .
  10. ^ "Return Flow Guard". Tencent . 2 de noviembre de 2016 . Consultado el 19 de enero de 2017 .
  11. ^ Tice, Caroline; Roeder, Tom; Collingbourne, Peter; Checkoway, Stephen; Erlingsson, Úlfar; Lozano, Luis; Pike, Geoff (1 de enero de 2014). Aplicación de la integridad del flujo de control de vanguardia en GCC y LLVM. págs. 941–955. ISBN 9781931971157.
  12. ^ Seguridad, heise (4 de mayo de 2016). "PaX Team decidió proteger sus vulnerabilidades de reutilización de código". Seguridad (en alemán) . Consultado el 1 de junio de 2016 .
  13. ^ "Preguntas frecuentes sobre RAP" . Consultado el 1 de junio de 2016 .
  14. ^ "Integridad del flujo de control — Documentación de Clang 17.0.0git". clang.llvm.org .
  15. ^ "ShadowCallStack — Documentación de Clang 17.0.0git". clang.llvm.org .
  16. ^ "Parches Clang LTO actualizados para el kernel de Linux - Phoronix".
  17. ^ "ShadowCallStack". Proyecto de código abierto de Android .
  18. ^ "Especificación de tecnología de aplicación de flujo de control" (PDF) . Intel Developer Zone . Archivado desde el original (PDF) el 2017-08-14 . Consultado el 2021-01-05 .
  19. ^ "RIP ROP: CET Internals en Windows 20H1". Winsider Seminars & Solutions Inc. 5 de enero de 2020. Consultado el 5 de enero de 2021 .
  20. ^ ab "Control Flow Guard". MSDN . Consultado el 19 de enero de 2017 .
  21. ^ "Análisis de la liberación de Shadow Brokers y mitigación con seguridad basada en virtualización de Windows 10". Microsoft Technet . 16 de junio de 2017 . Consultado el 20 de junio de 2017 .
  22. ^ "Cómo eludir universalmente el CFG mediante el abuso de mutabilidad" (PDF) . Blog de Alex Ionescu . Consultado el 7 de julio de 2017 .
  23. ^ abc Falcón, Francisco (25 de marzo de 2015). "Explotación de CVE-2015-0311, parte II: eludir Control Flow Guard en Windows 8.1 Update 3". Core Security . Consultado el 19 de enero de 2017 .
  24. ^ "Control Flow Guard" (PDF) . Trend Micro . Consultado el 19 de enero de 2017 .
  25. ^ ab "Componentes internos de Windows 10 Control Flow Guard" (PDF) . El poder de la comunidad . Consultado el 19 de enero de 2017 .
  26. ^ abcd "Control de derivación de flujo de protección integral" (PDF) . BlackHat . Consultado el 19 de enero de 2017 .
  27. ^ "Un detalle interesante sobre Control Flow Guard". Bromium . Consultado el 19 de enero de 2017 .
  28. ^ Thomas, Sam (18 de agosto de 2016). "Explotación orientada a objetos: nuevas técnicas para evitar la mitigación de vulnerabilidades en Windows". Slideshare . Consultado el 19 de enero de 2017 .
  29. ^ "Avanzando en la seguridad de Windows" . Consultado el 19 de mayo de 2021 .
  30. ^ "PROTECCIÓN DE FLUJO EXTENDIDA BAJO EL MICROSCOPIO". 18 de mayo de 2021. Consultado el 19 de mayo de 2021 .
  31. ^ "Desarrollo de exploits: entre la espada y la pared (Xtended Flow): análisis de XFG". 23 de agosto de 2020. Consultado el 19 de mayo de 2021 .