stringtranslate.com

Programación orientada al retorno

La programación orientada al retorno ( ROP ) es una técnica de explotación de seguridad informática que permite a un atacante ejecutar código en presencia de defensas de seguridad [1] [2], como la protección del espacio ejecutable y la firma de código . [3]

En esta técnica, un atacante obtiene el control de la pila de llamadas para secuestrar el flujo de control del programa y luego ejecuta secuencias de instrucciones de máquina cuidadosamente seleccionadas que ya están presentes en la memoria de la máquina, llamadas "gadgets". [4] [nb 1] Cada dispositivo generalmente termina en una instrucción de devolución y está ubicado en una subrutina dentro del programa existente y/o código de biblioteca compartida. [nb 1] Encadenados entre sí, estos dispositivos permiten a un atacante realizar operaciones arbitrarias en una máquina empleando defensas que frustran ataques más simples.

Fondo

Un diseño de ejemplo de una pila de llamadas. La subrutina DrawLineha sido llamada por DrawSquare. Tenga en cuenta que la pila crece hacia arriba en este diagrama.

La programación orientada al retorno es una versión avanzada de un ataque de destrucción de pilas . Generalmente, este tipo de ataques surgen cuando un adversario manipula la pila de llamadas aprovechando un error en el programa, a menudo una saturación del búfer . En una saturación del búfer, una función que no realiza una verificación de límites adecuada antes de almacenar los datos proporcionados por el usuario en la memoria aceptará más datos de entrada de los que puede almacenar correctamente. Si los datos se escriben en la pila, el exceso de datos puede desbordar el espacio asignado a las variables de la función (por ejemplo, "locales" en el diagrama de pila a la derecha) y sobrescribir la dirección de retorno. Esta dirección será utilizada posteriormente por la función para redirigir el flujo de control nuevamente al autor de la llamada . Si se ha sobrescrito, el flujo de control se desviará a la ubicación especificada por la nueva dirección del remitente.

En un ataque de desbordamiento de búfer estándar, el atacante simplemente escribiría el código de ataque (la "carga útil") en la pila y luego sobrescribiría la dirección del remitente con la ubicación de estas instrucciones recién escritas. Hasta finales de los años 1990, los principales sistemas operativos no ofrecían ninguna protección contra estos ataques; Microsoft Windows no proporcionó ninguna protección contra el desbordamiento del búfer hasta 2004. [5] Con el tiempo, los sistemas operativos comenzaron a combatir la explotación de errores de desbordamiento del búfer marcando la memoria donde se escriben los datos como no ejecutables, una técnica conocida como protección del espacio ejecutable . Con esto habilitado, la máquina se negaría a ejecutar cualquier código ubicado en áreas de memoria en las que el usuario pueda escribir, evitando que el atacante coloque la carga útil en la pila y salte a ella mediante una sobrescritura de la dirección de retorno. Posteriormente estuvo disponible soporte de hardware para fortalecer esta protección.

Con la prevención de ejecución de datos, un adversario no puede ejecutar directamente instrucciones escritas en un búfer porque la sección de memoria del búfer está marcada como no ejecutable. Para vencer esta protección, un ataque de programación orientada al retorno no inyecta instrucciones maliciosas, sino que utiliza secuencias de instrucciones ya presentes en la memoria ejecutable, llamadas "gadgets", mediante la manipulación de direcciones de retorno. Una implementación típica de prevención de ejecución de datos no puede defenderse contra este ataque porque el adversario no ejecutó directamente el código malicioso, sino que combinó secuencias de instrucciones "buenas" cambiando las direcciones de retorno almacenadas; por lo tanto, el código utilizado se marcaría como ejecutable.

Técnica de regreso a la biblioteca

La implementación generalizada de la prevención de ejecución de datos hizo que las vulnerabilidades tradicionales de desbordamiento del búfer fueran difíciles o imposibles de explotar de la manera descrita anteriormente. En cambio, un atacante estaba restringido al código que ya estaba en la memoria marcado como ejecutable, como el código del programa en sí y cualquier biblioteca compartida vinculada . Dado que las bibliotecas compartidas, como libc , a menudo contienen subrutinas para realizar llamadas al sistema y otras funciones potencialmente útiles para un atacante, son las candidatas más probables para encontrar código para montar un ataque.

En un ataque de regreso a la biblioteca, un atacante secuestra el flujo de control del programa explotando una vulnerabilidad de desbordamiento del búfer, exactamente como se analizó anteriormente. En lugar de intentar escribir una carga útil de ataque en la pila, el atacante elige una función de biblioteca disponible y sobrescribe la dirección del remitente con su ubicación de entrada. Luego se sobrescriben otras ubicaciones de la pila, obedeciendo las convenciones de llamada aplicables , para pasar cuidadosamente los parámetros adecuados a la función para que realice una funcionalidad útil para el atacante. Esta técnica fue presentada por primera vez por Solar Designer en 1997, [6] y luego se amplió al encadenamiento ilimitado de llamadas a funciones. [7]

Fragmentos de código prestados

El auge de los procesadores x86 de 64 bits trajo consigo un cambio en la convención de llamada de subrutinas que requería que los primeros argumentos de una función se pasaran en registros en lugar de en la pila. Esto significaba que un atacante ya no podía configurar una llamada a una función de biblioteca con los argumentos deseados simplemente manipulando la pila de llamadas mediante un exploit de desbordamiento del búfer. Los desarrolladores de bibliotecas compartidas también comenzaron a eliminar o restringir funciones de biblioteca que realizaban acciones particularmente útiles para un atacante, como envoltorios de llamadas al sistema . Como resultado, los ataques de regreso a la biblioteca se volvieron mucho más difíciles de realizar con éxito.

La siguiente evolución se produjo en forma de un ataque que utilizaba fragmentos de funciones de la biblioteca, en lugar de funciones enteras en sí, para explotar las vulnerabilidades de desbordamiento del búfer en máquinas con defensas contra ataques más simples. [8] Esta técnica busca funciones que contengan secuencias de instrucciones que extraigan valores de la pila en registros. La selección cuidadosa de estas secuencias de código permite a un atacante colocar valores adecuados en los registros adecuados para realizar una llamada a una función según la nueva convención de llamada. El resto del ataque se desarrolla como un ataque de regreso a la biblioteca.

Ataques

La programación orientada al retorno se basa en el enfoque de fragmentos de código prestado y lo extiende para proporcionar al atacante una funcionalidad completa de Turing , incluidos bucles y ramas condicionales . [9] [10] Dicho de otra manera, la programación orientada al retorno proporciona un "lenguaje" completamente funcional que un atacante puede utilizar para hacer que una máquina comprometida realice cualquier operación deseada. Hovav Shacham publicó la técnica en 2007 [11] y demostró cómo todas las construcciones de programación importantes se pueden simular utilizando programación orientada al retorno contra una aplicación de destino vinculada con la biblioteca estándar C y que contiene una vulnerabilidad de desbordamiento de búfer explotable.

Un ataque de programación orientado al retorno es superior a los otros tipos de ataque discutidos, tanto en poder expresivo como en resistencia a las medidas defensivas. Ninguna de las técnicas de contraexplotación mencionadas anteriormente, incluida la eliminación total de funciones potencialmente peligrosas de bibliotecas compartidas, es eficaz contra un ataque de programación orientado al retorno.

En la arquitectura x86

Aunque los ataques de programación orientados al retorno se pueden realizar en una variedad de arquitecturas, [11] el artículo de Shacham y la mayoría del trabajo de seguimiento se centran en la arquitectura Intel x86 . La arquitectura x86 es un conjunto de instrucciones CISC de longitud variable . La programación orientada a retornos en x86 aprovecha el hecho de que el conjunto de instrucciones es muy "denso", es decir, es probable que cualquier secuencia aleatoria de bytes sea interpretable como algún conjunto válido de instrucciones x86.

Por lo tanto, es posible buscar un código de operación que altere el flujo de control, en particular la instrucción de retorno (0xC3) y luego buscar hacia atrás en el binario los bytes anteriores que formen instrucciones posiblemente útiles. Estos conjuntos de "dispositivos" de instrucciones se pueden encadenar sobrescribiendo la dirección de retorno, mediante un exploit de desbordamiento del búfer, con la dirección de la primera instrucción del primer dispositivo. La primera dirección de los siguientes dispositivos se escribe sucesivamente en la pila. Al finalizar el primer gadget, se ejecutará una instrucción de retorno, que extraerá la dirección del siguiente gadget de la pila y saltará a él. Al finalizar ese gadget, la cadena continúa con el tercero, y así sucesivamente. Al encadenar pequeñas secuencias de instrucciones, un atacante puede producir un comportamiento de programa arbitrario a partir de código de biblioteca preexistente. Shacham afirma que dada una cantidad suficientemente grande de código (incluida, entre otras, la biblioteca estándar C), existirán suficientes dispositivos para una funcionalidad completa de Turing. [11]

Se ha desarrollado una herramienta automatizada para ayudar a automatizar el proceso de localización de dispositivos y construcción de un ataque contra un binario. [12] Esta herramienta, conocida como ROPgadget, busca a través de un binario dispositivos potencialmente útiles e intenta ensamblarlos en una carga útil de ataque que genera un shell para aceptar comandos arbitrarios del atacante.

Sobre la aleatorización del diseño del espacio de direcciones

La aleatorización del diseño del espacio de direcciones también tiene vulnerabilidades. Según el artículo de Shacham et al., [13] el ASLR en arquitecturas de 32 bits está limitado por el número de bits disponibles para la aleatorización de direcciones. Sólo 16 de los 32 bits de dirección están disponibles para la aleatorización, y 16 bits de aleatorización de direcciones pueden ser derrotados mediante un ataque de fuerza bruta en minutos. Las arquitecturas de 64 bits son más robustas, con 40 de los 64 bits disponibles para aleatorización. Es posible un ataque de fuerza bruta para la aleatorización de 40 bits, pero es poco probable que pase desapercibido. [ cita necesaria ] Además de los ataques de fuerza bruta, existen técnicas para eliminar la aleatorización .

Incluso con una aleatorización perfecta, si hay alguna fuga de información sobre el contenido de la memoria, sería útil calcular la dirección base de, por ejemplo, una biblioteca compartida en tiempo de ejecución. [14]

Sin uso de la instrucción de devolución

Según el artículo de Checkoway et al., [15] es posible realizar programación orientada al retorno en arquitecturas x86 y ARM sin utilizar una instrucción de retorno (0xC3 en x86). En su lugar, utilizaron secuencias de instrucciones cuidadosamente elaboradas que ya existen en la memoria de la máquina para comportarse como una instrucción de retorno. Una instrucción de retorno tiene dos efectos: en primer lugar, lee el valor de cuatro bytes en la parte superior de la pila y establece el puntero de instrucción en ese valor y, en segundo lugar, aumenta el valor del puntero de la pila en cuatro (equivalente a una operación pop). . En la arquitectura x86, las secuencias de instrucciones jmp y pop pueden actuar como instrucción de retorno. En ARM, las secuencias de instrucciones de carga y bifurcación pueden actuar como instrucciones de retorno.

Dado que este nuevo enfoque no utiliza una instrucción de devolución, tiene implicaciones negativas para la defensa. Cuando un programa de defensa comprueba no sólo varios retornos sino también varias instrucciones de salto, se puede detectar este ataque.

Defensas

Libre de G

La técnica G-Free fue desarrollada por Kaan Onarlioglu, Leyla Bilge, Andrea Lanzi, Davide Balzarotti y Engin Kirda. Es una solución práctica contra cualquier forma posible de programación orientada al retorno. La solución elimina todas las instrucciones de rama libre no alineadas (instrucciones como RET o CALL que los atacantes pueden usar para cambiar el flujo de control) dentro de un ejecutable binario y protege las instrucciones de rama libre para que no sean utilizadas por un atacante. La forma en que G-Free protege la dirección del remitente es similar al canario XOR implementado por StackGuard. Además, verifica la autenticidad de las llamadas a funciones agregando un bloque de validación. Si no se encuentra el resultado esperado, G-Free provoca que la aplicación falle. [dieciséis]

Aleatorización del diseño del espacio de direcciones

Se han propuesto varias técnicas para subvertir ataques basados ​​en programación orientada al retorno. [17] La ​​mayoría se basa en la aleatorización de la ubicación del código del programa y de la biblioteca, de modo que un atacante no pueda predecir con precisión la ubicación de las instrucciones que podrían ser útiles en los dispositivos y, por lo tanto, no pueda montar una cadena exitosa de ataque de programación orientada al retorno. Una implementación bastante común de esta técnica, la aleatorización del diseño del espacio de direcciones (ASLR), carga bibliotecas compartidas en una ubicación de memoria diferente en cada carga del programa. Aunque ampliamente implementado por los sistemas operativos modernos, ASLR es vulnerable a ataques de fuga de información y otros enfoques para determinar la dirección de cualquier función de biblioteca conocida en la memoria. Si un atacante puede determinar con éxito la ubicación de una instrucción conocida, se puede inferir la posición de todas las demás y se puede construir un ataque de programación orientado al retorno.

Este enfoque de aleatorización se puede llevar más allá reubicando todas las instrucciones y/u otros estados del programa (registros y objetos de pila) por separado, en lugar de solo las ubicaciones de la biblioteca. [18] [19] [20] Esto requiere un amplio soporte en tiempo de ejecución, como un traductor dinámico de software, para reconstruir las instrucciones aleatorias en tiempo de ejecución. Esta técnica logra hacer que los dispositivos sean difíciles de encontrar y utilizar, pero conlleva importantes gastos generales.

Otro enfoque, adoptado por kBouncer, modifica el sistema operativo para verificar que las instrucciones de devolución realmente desvíen el flujo de control a una ubicación inmediatamente después de una instrucción de llamada. Esto evita el encadenamiento de dispositivos, pero conlleva una gran penalización de rendimiento [ se necesita aclaración ] y no es efectivo contra ataques de programación orientados a saltos que alteran saltos y otras instrucciones que modifican el flujo de control en lugar de retornos. [21]

Aleatorización de código binario

Algunos sistemas modernos, como Cloud Lambda (FaaS) y las actualizaciones remotas de IoT, utilizan la infraestructura de la nube para realizar una compilación sobre la marcha antes de la implementación del software. Una técnica que introduce variaciones en cada instancia de un software en ejecución puede aumentar drásticamente la inmunidad del software a los ataques ROP. La fuerza bruta de Cloud Lambda puede dar lugar a un ataque a varias instancias del software aleatorio, lo que reduce la eficacia del ataque. Asaf Shelly publicó la técnica en 2017 [22] y demostró el uso de aleatorización binaria en un sistema de actualización de software. Para cada dispositivo actualizado, el servicio basado en la nube introdujo variaciones en el código, realiza una compilación en línea y envía el binario. Esta técnica es muy eficaz porque los ataques ROP se basan en el conocimiento de la estructura interna del software. El inconveniente de esta técnica es que el software nunca se prueba completamente antes de implementarlo porque no es factible probar todas las variaciones del software aleatorio. Esto significa que muchas técnicas de aleatorización binaria son aplicables para interfaces de red y programación de sistemas y son menos recomendadas para algoritmos complejos.

SEHOP

La protección contra sobrescritura del controlador de excepciones estructurado es una característica de Windows que protege contra los ataques de desbordamiento de pila más comunes, especialmente contra ataques a un controlador de excepciones estructurado.

Contra ataques de flujo de control

A medida que proliferan los pequeños sistemas integrados debido a la expansión del Internet de las cosas , también aumenta la necesidad de protección de dichos sistemas integrados. Utilizando el control de acceso a memoria basado en instrucciones (IB-MAC) implementado en hardware, es posible proteger sistemas integrados de bajo costo contra ataques maliciosos de flujo de control y desbordamiento de pila. La protección se puede proporcionar separando la pila de datos y la pila de retorno. Sin embargo, debido a la falta de una unidad de gestión de memoria en algunos sistemas integrados, la solución de hardware no se puede aplicar a todos los sistemas integrados. [23]

Contra los rootkits orientados al retorno

En 2010, Jinku Li et al. propuso [24] que un compilador adecuadamente modificado podría eliminar completamente los "dispositivos" orientados al retorno reemplazando cada uno con la secuencia de instrucciones y cada uno con la secuencia de instrucciones , donde representa una tabulación inmutable de todas las direcciones de retorno "legítimas" en el programa y representa una índice específico en esa tabla. [24] : 5–6  Esto evita la creación de un gadget orientado al retorno que regresa directamente desde el final de una función a una dirección arbitraria en medio de otra función; en cambio, los gadgets sólo pueden regresar a direcciones de devolución "legítimas", lo que aumenta drásticamente la dificultad de crear gadgets útiles. Li y col. afirmó que "nuestra técnica de indirección de retorno esencialmente desgeneraliza la programación orientada a retorno al antiguo estilo de retorno a libc". [24] Su compilador de prueba de concepto incluyó una fase de optimización de mirilla para tratar con "ciertas instrucciones de máquina que contienen el código de operación de retorno en sus códigos de operación u operandos inmediatos", [24] como .call fpushl $index; jmp fretpopl %reg; jmp table(%reg)tableindexmovl $0xC3, %eax

Códigos de autenticación de puntero (PAC)

La arquitectura ARMv8.3-A introduce una nueva característica a nivel de hardware que aprovecha los bits no utilizados en el espacio de direcciones del puntero para firmar criptográficamente direcciones de puntero utilizando un cifrado de bloque modificable especialmente diseñado [25] [26] que firma el valor deseado. (normalmente, una dirección de retorno) combinado con un valor de "contexto local" (por ejemplo, el puntero de la pila).

Antes de realizar una operación sensible (es decir, regresar al puntero guardado), se puede verificar la firma para detectar manipulación o uso en el contexto incorrecto (por ejemplo, aprovechar una dirección de retorno guardada de un contexto de trampolín de explotación).

En particular, los chips Apple A12 utilizados en los iPhone se han actualizado a ARMv8.3 y utilizan PAC. Linux obtuvo soporte para la autenticación de puntero dentro del kernel en la versión 5.7 lanzada en 2020; En 2018 se agregó soporte para aplicaciones de espacio de usuario. [27]

En 2022, investigadores del MIT publicaron un ataque de canal lateral contra PAC denominado PACMAN. [28]

Identificación de destino de sucursal (BTI)

La arquitectura ARMv8.5-A introduce otra característica nueva a nivel de hardware que identifica explícitamente objetivos válidos de instrucciones de bifurcación. El compilador inserta una instrucción especial, código de operación denominado "BTI", en cada punto de aterrizaje esperado de instrucciones de rama indirecta. Estos destinos de sucursal identificados generalmente incluyen puntos de entrada de funciones y bloques de códigos de interruptor/caja.

Las instrucciones BTI se utilizan en páginas de memoria de código que están marcadas como "protegidas" por el compilador y el vinculador. Cualquier instrucción de derivación indirecta que aterrice, en una página protegida, en cualquier instrucción que no sea una BTI genera una falla.

Los destinos identificados donde se inserta una instrucción BTI representan aproximadamente el 1% de todas las instrucciones en el código de aplicación promedio. Por lo tanto, el uso de BTI aumenta el tamaño del código en la misma cantidad. [29]

Los dispositivos que se utilizan en un ataque ROP se encuentran en cualquier parte del código de la aplicación. Por lo tanto, en promedio, el 99% de los dispositivos comienzan con una instrucción que no es una BTI. Por lo tanto, la bifurcación a estos dispositivos produce una falla. Teniendo en cuenta que un ataque ROP está formado por una cadena de múltiples dispositivos, la probabilidad de que todos los dispositivos de una cadena formen parte del 1% que comienza con un BTI es muy baja.

PAC y BTI son mecanismos complementarios para prevenir inyecciones de código no autorizado mediante ataques de programación orientados al retorno y al salto. Mientras que PAC se centra en el origen de la operación de una sucursal (un puntero firmado), BTI se centra en el destino de la sucursal. [30]

Ver también

Notas

  1. ^ ab Algunos autores usan el término gadget de una manera algo diferente y se refieren a él como meros fragmentos de lógica de programa o secuencias cortas de códigos de operación diseñados para realizar alguna acción deseada. [31]

Referencias

  1. ^ Vázquez, Hugo (1 de octubre de 2007). "Hackeo de plataforma segura de Check Point" (PDF) . Pentest . Barcelona, ​​España: Pentest Consultores. pag. 219.
  2. ^ "Subproceso: Desbordamientos de búfer múltiples de CheckPoint Secure Platform". El grupo de usuarios de Check Point .
  3. ^ Shacham, Hovav; Buchanan, Erik; Roemer, Ryan; Salvaje, Stefan. "Programación orientada al retorno: exploits sin inyección de código" . Consultado el 12 de agosto de 2009 .
  4. ^ Buchanan, E.; Roemer, R.; Shacham, H.; Savage, S. (octubre de 2008). "Cuando las buenas instrucciones salen mal: generalización de la programación orientada al retorno a RISC" (PDF) . Actas de la 15ª conferencia ACM sobre seguridad informática y de las comunicaciones - CCS '08 . págs. 27–38. doi :10.1145/1455770.1455776. ISBN 978-1-59593-810-7. S2CID  11176570.
  5. ^ Prevención de ejecución de datos de Microsoft Windows XP SP2
  6. ^ Solar Designer, exploits de retorno a lib(c), Bugtraq
  7. ^ Nergal, Phrack 58 Artículo 4, exploits de retorno a lib(c)
  8. ^ Sebastian Krahmer, Explotaciones de desbordamiento de búfer x86-64 y técnica de explotación de fragmentos de código prestado , 28 de septiembre de 2005
  9. ^ Abadi, MN; Budiu, M.; Erlingsson, Ú.; Ligatti, J. (noviembre de 2005). "Integridad del flujo de control: principios, implementaciones y aplicaciones". Actas de la 12ª conferencia ACM sobre seguridad informática y de las comunicaciones - CCS '05 . págs. 340–353. doi :10.1145/1102120.1102165. ISBN 1-59593-226-7. S2CID  3339874.
  10. ^ Abadi, MN; Budiu, M.; Erlingsson, Ú.; Ligatti, J. (octubre de 2009). "Principios, implementaciones y aplicaciones de integridad del flujo de control". Transacciones ACM sobre Seguridad de la Información y Sistemas . 13 : 1–40. doi :10.1145/1609956.1609960. S2CID  207175177.
  11. ^ abc Shacham, H. (octubre de 2007). "La geometría de la carne inocente sobre el hueso: retorno a libc sin llamadas a funciones (en el x86)". Actas de la 14ª conferencia ACM sobre seguridad informática y de las comunicaciones - CCS '07 . págs. 552–561. doi :10.1145/1315245.1315313. ISBN 978-1-59593-703-2. S2CID  11639591.
  12. ^ Jonathan Salwan y Allan Wirth, ROPgadget: buscador de dispositivos y cuerda automática
  13. ^ [Shacham et al., 2004] Hovav Shacham, Matthew Page, Ben Pfaff, Eu-Jin Goh, Nagendra Modadugu y Dan Boneh. Sobre la eficacia de la aleatorización del espacio de direcciones. En Actas de la undécima conferencia ACM sobre seguridad informática y de las comunicaciones (CCS), 2004.
  14. ^ [Bennett et al., 2013] James Bennett, Yichong Lin y Thoufique Haq. El número de la bestia, 2013. https://www.fireeye.com/blog/threat-research/2013/02/the-number-of-the-beast.html
  15. ^ Checkoway, S., Davi, L., Dmitrienko, A., Sadeghi, A.-R., Shacham, H., Winandy, M. 2010. Programación orientada al retorno sin retornos. En Actas de CCS 2010, A. Keromytis y V. Shmatikov, Eds. Prensa ACM , 559–572
  16. ^ Onarlioglu, K., Bilge, L., Lanzi, A., Balzarotti, D., Kirda, E. 2010. G-Free: Derrotando la programación orientada al retorno a través de binarios sin dispositivos. En Actas de ACSAC 2010, M. Franz y J. McDermott, Eds. Prensa ACM , 49–58.
  17. ^ Skowyra, R.; Casteel, K.; Okhravi, H.; Zeldovich, N.; Streilein, W. (octubre de 2013). "Análisis sistemático de las defensas contra la programación orientada al retorno" (PDF) . Investigación en Ataques, Intrusiones y Defensas . Apuntes de conferencias sobre informática. vol. 8145, págs. 82-102. doi :10.1007/978-3-642-41284-4_5. ISBN 978-3-642-41283-7. Archivado desde el original (PDF) el 22 de febrero de 2014.
  18. ^ Venkat, Ashish; Shamasunder, Sriskanda; Shajam, Hovav; Tullsen, Dean M. (1 de enero de 2016). "HIPStR". Actas de la XXI Conferencia Internacional sobre soporte arquitectónico para lenguajes de programación y sistemas operativos . ASPLOS '16. Nueva York, NY, Estados Unidos: ACM. págs. 727–741. doi :10.1145/2872362.2872408. ISBN 9781450340915. S2CID  7853786.
  19. ^ Hiser, J.; Nguyen-Tuong, A.; Co, M.; Salón, M.; Davidson, JW (mayo de 2012). "ILR: ¿Adónde fueron mis dispositivos?". Simposio IEEE 2012 sobre seguridad y privacidad . págs. 571–585. doi :10.1109/SP.2012.39. ISBN 978-1-4673-1244-8. S2CID  15696223.
  20. ^ Estados Unidos 9135435, Venkat, Ashish; Krishnaswamy, Arvind & Yamada, Koichi et al., "Reubicación del estado del programa impulsado por traductor binario", publicado el 15 de septiembre de 2015, asignado a Intel Corp. 
  21. ^ Vasilis Pappas. kBouncer: Mitigación de ROP eficiente y transparente . Abril de 2012.
  22. ^ Solicitud de EE. UU. 2019347385, Shelly, Asaf, "Métodos y sistemas de seguridad por mutación de código", publicada el 14 de noviembre de 2019 , abandonada desde entonces. 
  23. ^ Francillon, A., Perito, D., Castelluccia, C. 2009. Defensa de los sistemas integrados contra ataques de flujo de control. En Actas de SecuCode 2009, S. Lachmund y C. Schaefer, Eds. Prensa ACM , 19–26.
  24. ^ abcd Li, Jinku; Wang, Zhi; Jiang, Xuxian; Gracia, Mike; Bahram, Sina. Derrotar a los rootkits orientados al retorno con núcleos "sin retorno". En Actas de EuroSys 2010 , editado por G. Muller. Prensa ACM , 195–208.
  25. ^ Avanzi, Roberto (2016). La familia de cifrado de bloques QARMA (PDF) . Transacciones IACR sobre criptología simétrica (ToSC). vol. 17 (publicado el 8 de marzo de 2017). págs. 4–44. doi : 10.13154/tosc.v2017.i1.4-44. Archivado desde el original (PDF) el 13 de mayo de 2020.
  26. ^ Seguridad de productos Qualcomm. "Autenticación de puntero en ARMv8.3" (PDF) . Qualcomm Technologies Inc. Archivado (PDF) desde el original el 6 de junio de 2020 . Consultado el 16 de junio de 2020 . Por lo tanto, diseñamos QARMA, una nueva familia de cifrados de bloques ligeros y modificables.
  27. ^ "Linux 5.7 para ARM de 64 bits ofrece autenticación de puntero en el kernel y monitores de actividad: Phoronix". www.phoronix.com . Consultado el 31 de marzo de 2020 .
  28. ^ Ravichandran, José; Na, Weon Taek; Lang, Jay; Yan, Mengjia (junio de 2022). "PACMAN: atacando la autenticación de puntero ARM con ejecución especulativa". Actas del 49º Simposio Internacional Anual sobre Arquitectura de Computadores . Asociación para Maquinaria de Computación. doi : 10.1145/3470496.3527429 . hdl : 1721.1/146470 .
  29. ^ "Aplicación de técnicas PAC y BTI al código real". desarrollador.arm.com . Consultado el 4 de febrero de 2024 .
  30. ^ "Control Flow Integrity, protección activa antimalware en sistemas Arm64" (PDF) . sipearl.com . Consultado el 4 de febrero de 2024 .
  31. ^ Cha, Sang Kil; Pak, Brian; Brumley, David ; Lipton, Richard Jay (8 de octubre de 2010) [4 de octubre de 2010]. Programas independientes de la plataforma (PDF) . Actas de la 17ª conferencia ACM sobre seguridad informática y de las comunicaciones (CCS'10). Chicago, Illinois, EE.UU.: Universidad Carnegie Mellon , Pittsburgh, Pensilvania, EE.UU. / Instituto de Tecnología de Georgia , Atlanta, Georgia, EE.UU. págs. 547–558. doi :10.1145/1866307.1866369. ISBN 978-1-4503-0244-9. Archivado (PDF) desde el original el 26 de mayo de 2022 . Consultado el 26 de mayo de 2022 .[1] (12 páginas) (Ver también: [2]) (NB. Utiliza el término gadget para fragmentos de lógica de programa, en este caso dividido en encabezado de gadget y cuerpo de gadget ).

enlaces externos