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 evitan que una amplia variedad de ataques de malware redirija el flujo de ejecución (el flujo de control ) de un programa.

Fondo

Un programa de computadora comúnmente cambia su flujo de control para tomar decisiones y utilizar diferentes partes del código. Dichas transferencias pueden ser directas , en el sentido de que la dirección de destino está escrita en el código mismo, o indirectas , en el sentido de 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 llama usando la pila, una transferencia indirecta hacia atrás . Cuando se llama a un puntero de función , como desde una tabla virtual , decimos que hay una transferencia indirecta de avance . [1] [2]

Los atacantes buscan inyectar código en un programa para hacer uso de sus privilegios o extraer datos de su espacio de memoria. Antes de que el código ejecutable fuera comúnmente de solo lectura, un atacante podía cambiar arbitrariamente el código a medida que se ejecuta, apuntando a transferencias directas o incluso prescindir de ninguna transferencia. Después de que W^X se generalizó, un atacante quiere redirigir la ejecución a un área separada y desprotegida que contiene el código que se va a ejecutar, haciendo uso de transferencias indirectas: se podría sobrescribir la tabla virtual para un ataque de vanguardia 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 destinos no deseados. [1]

Técnicas

Las técnicas asociadas incluyen separación de puntero de código (CPS), integridad de puntero de código (CPI), valores controlados de pila , pilas de sombra y verificación de puntero de vtable . [3] [4] [5]

Implementaciones

Las implementaciones relacionadas están 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 proporciona una opción "CFI" que funciona en el borde delantero al verificar errores en tablas virtuales y conversiones de tipos. Depende de la optimización del tiempo de enlace (LTO) saber qué funciones se supone que deben llamarse en casos normales. [14] Existe un esquema de " pila de llamadas en la sombra " independiente que defiende en el borde posterior comprobando las modificaciones de la pila de llamadas, disponible sólo para aarch64. [15]

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

Tecnología Intel de aplicación de flujo de control

La tecnología Intel Control-flow Enforcement Technology (CET) detecta compromisos para controlar la integridad del flujo con una pila de sombra (SS) y un seguimiento de rama indirecta (IBT). [18] [19]

La pila de sombra almacena una copia de la dirección de retorno de cada LLAMADA en una pila de sombra especialmente protegida. En un RET, el procesador verifica si la dirección de retorno almacenada en la pila normal y en la pila oculta son iguales. Si las direcciones no son iguales, el procesador genera un INT #21 (Fallo de protección de flujo de control).

El seguimiento de sucursales indirectas detecta instrucciones JMP o CALL indirectas con objetivos no autorizados. Se implementa agregando una nueva máquina de estados interna en el procesador. El comportamiento de las instrucciones JMP y CALL indirectas se cambia para que cambien la máquina de estado de IDLE a WAIT_FOR_ENDBRANCH. En el estado WAIT_FOR_ENDBRANCH, se requiere que la siguiente instrucción a ejecutar sea la nueva instrucción ENDBRANCH (ENDBR32 en modo de 32 bits o ENDBR64 en modo de 64 bits), que cambia la máquina de estado interna de WAIT_FOR_ENDBRANCH nuevamente a IDLE. Por lo tanto, cada objetivo autorizado de un JMP o CALL indirecto debe comenzar con ENDBRANCH. Si el procesador está en un estado WAIT_FOR_ENDBRANCH (es decir, la instrucción anterior fue un JMP o CALL indirecto) y la siguiente instrucción no es una instrucción ENDBRANCH, el procesador genera un INT #21 (Fallo de protección de flujo de control). En los procesadores que no admiten el seguimiento indirecto de sucursales de CET, las instrucciones ENDBRANCH se interpretan como NOP y no tienen ningún efecto.

Guardia de 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 del vinculador antes de vincular el programa en Visual Studio 2015 o posterior. [20]

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

CFG opera 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 implementacion

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

  1. Convierta la dirección de destino en un desplazamiento y un número de bits 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 del cuarto al octavo bits de orden inferior 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, regrese sin error.
    2. Si la dirección de destino no está en el mapa de bits, finalice el programa.

Técnicas de derivación

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

Protección de flujo extendida 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 validando las firmas de llamadas a funciones para garantizar que las llamadas a funciones indirectas sean solo para el subconjunto de funciones con la misma firma. La validación de la firma de la llamada a la 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 la 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]

Ver también

Referencias

  1. ^ ab Pagador, Mattias. "Integridad del flujo de control: una introducción". nebelwelt.net .
  2. ^ Burow, Nathan; Carr, Scott A.; Nash, José; Larsen, Per; Francisco, Michael; Brunthaler, Stefan; Pagador, Mathias (31 de enero de 2018). "Integridad del flujo de control: precisión, seguridad y rendimiento". Encuestas de Computación ACM . 50 (1): 1–33. doi : 10.1145/3054924 .
  3. ^ Pagador, Mathias ; Kuznetsov, Volodymyr. "Sobre las diferencias entre las propiedades CFI, CPS y CPI". nebelwelt.net . Consultado el 1 de junio de 2016 .
  4. ^ "El descubrimiento de errores de Adobe Flash conduce a un nuevo método de mitigación de ataques". Lectura oscura . 10 de noviembre de 2015 . Consultado el 1 de junio de 2016 .
  5. ^ Fin del juego. "Endgame se presentará en Black Hat USA 2016". www.prnewswire.com . Consultado el 1 de junio de 2016 .
  6. ^ "Control de integridad del flujo: 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". El registro . Consultado el 1 de junio de 2016 .
  8. ^ Mimoso, Michael (22 de septiembre de 2015). "Bypass desarrollado para Microsoft Memory Protection, Control Flow Guard". Puesto de amenaza | La primera parada para recibir noticias sobre seguridad . Consultado el 1 de junio de 2016 .
  9. ^ Smith, Sra. (23 de septiembre de 2015). "DerbyCon: el ex ganador del premio BlueHat omitirá Control Flow Guard en Windows 10". Mundo de la Red . Consultado el 1 de junio de 2016 .
  10. ^ "Protector de flujo de retorno". Tencent . 2 de noviembre de 2016 . Consultado el 19 de enero de 2017 .
  11. ^ Tice, Carolina; 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. "El equipo de PaX eligió protección para los exploits 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. ^ "Control de integridad del flujo: 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) . Zona de desarrolladores Intel . Archivado desde el original (PDF) el 14 de agosto de 2017 . Consultado el 5 de enero de 2021 .
  19. ^ "RIP ROP: CET internos en Windows 20H1". Seminarios y soluciones de Winsider Inc. Consultado el 5 de enero de 2021 .
  20. ^ ab "Control de protección de flujo". MSDN . Consultado el 19 de enero de 2017 .
  21. ^ "Análisis de la versió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. ^ "Evitar universalmente 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: omisión de Control Flow Guard en Windows 8.1 Actualización 3". Seguridad básica . Consultado el 19 de enero de 2017 .
  24. ^ "Control de flujo de protección" (PDF) . Tendencia Micro . Consultado el 19 de enero de 2017 .
  25. ^ ab "Partes internas de Control Flow Guard de Windows 10" (PDF) . Poder de la comunidad . Consultado el 19 de enero de 2017 .
  26. ^ abcd "Bypass Control Flow Guard de forma integral" (PDF) . Sombrero negro . Consultado el 19 de enero de 2017 .
  27. ^ "Un detalle interesante sobre Control Flow Guard". Bromo . 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 Windows". Compartir diapositivas . 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" . Consultado el 19 de mayo de 2021 .
  31. ^ "Desarrollo de explotación: entre la espada y la pared (flujo extendido): examen de XFG". 23 de agosto de 2020 . Consultado el 19 de mayo de 2021 .