Articulo de referencia

Programación orientada al retorno

La programación orientada a retorno ( ROP ) es una técnica de explotación de seguridad informática que permite a un atacante ejecutar código a pesar de la presencia de defensas ...

La programación orientada a retorno ( ROP ) es una técnica de explotación de seguridad informática que permite a un atacante ejecutar código a pesar de la presencia de defensas de seguridad [ 1 ] [ 2 ] que de otro modo lo impedirían, 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 elegidas que ya están presentes en la memoria de la máquina, llamadas "gadgets". [ 4 ] [ nb 1 ] Cada gadget generalmente termina en una instrucción de retorno y se encuentra en una subrutina dentro del programa existente y/o código de biblioteca compartida. [ nb 1 ] Encadenados entre sí, estos gadgets permiten a un atacante realizar operaciones arbitrarias en una máquina que emplea defensas que atrapan ataques más simples.

Fondo

Ejemplo de la disposición de una pila de llamadas. La subrutina DrawLineha sido llamada por DrawSquare. Nótese que la pila crece hacia arriba en este diagrama.

La programación orientada a retorno es una versión avanzada de un ataque de desbordamiento de pila . Generalmente, este tipo de ataques surgen cuando un adversario manipula la pila de llamadas aprovechando un error en el programa, a menudo un desbordamiento de búfer . En un desbordamiento de búfer, una función que no realiza una comprobación de límites adecuada antes de almacenar 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, "locals" en el diagrama de pila de 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 de vuelta a la función que la llamó . Si ha sido sobrescrita, el flujo de control se desviará a la ubicación especificada por la nueva dirección de retorno.

En un ataque estándar de desbordamiento de búfer, el atacante simplemente escribiría el código de ataque (la "carga útil") en la pila y luego sobrescribiría la dirección de retorno con la ubicación de estas instrucciones recién escritas. Hasta finales de la década de 1990, los principales sistemas operativos no ofrecían ninguna protección contra estos ataques. Por ejemplo, Microsoft Windows no proporcionó protección contra desbordamiento de búfer hasta 2004. [ 5 ] Con el tiempo, los sistemas operativos comenzaron a combatir la explotación de errores de desbordamiento de búfer marcando la memoria donde se escriben los datos como no ejecutable, una técnica conocida como protección del espacio ejecutable . Con esto habilitado, la máquina rechazaría ejecutar cualquier código ubicado en áreas de memoria escribibles por el usuario, impidiendo que el atacante colocara la carga útil en la pila y saltara a ella mediante la sobrescritura de la dirección de retorno. Más tarde, se dispuso de soporte de hardware para reforzar esta protección.

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

Técnica de devolución a la biblioteca

La implementación generalizada de la prevención de ejecución de datos dificultó o imposibilitó la explotación de las vulnerabilidades tradicionales de desbordamiento de búfer de la manera descrita anteriormente. En cambio, un atacante se vio limitado al código ya presente en la memoria y marcado como ejecutable, como el propio código del programa y las bibliotecas compartidas vinculadas . Dado que las bibliotecas compartidas, como libc , suelen contener subrutinas para realizar llamadas al sistema y otras funcionalidades potencialmente útiles para un atacante, son las candidatas más probables para encontrar código con el que ensamblar un ataque.

En un ataque de retorno a la biblioteca, un atacante secuestra el flujo de control del programa explotando una vulnerabilidad de desbordamiento de búfer, tal como se describió 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 de retorno con su ubicación de entrada. Posteriormente, se sobrescriben otras ubicaciones de la pila, respetando las convenciones de llamada aplicables , para pasar cuidadosamente los parámetros adecuados a la función y que esta realice una funcionalidad útil para el atacante. Esta técnica fue presentada por primera vez por Solar Designer en 1997 [ 6 ] y posteriormente se extendió 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 a 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 una vulnerabilidad de desbordamiento de búfer. Los desarrolladores de bibliotecas compartidas también comenzaron a eliminar o restringir las funciones de biblioteca que realizaban acciones particularmente útiles para un atacante, como los envoltorios de llamadas al sistema . Como resultado, los ataques de retorno a la biblioteca se volvieron mucho más difíciles de ejecutar con éxito.

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

Ataques

La programación orientada a retornos se basa en el enfoque de fragmentos de código prestados y lo extiende para proporcionar funcionalidad Turing-completa al atacante, incluyendo bucles y bifurcaciones condicionales . [ 9 ] [ 10 ] Dicho de otro modo, la programación orientada a retornos proporciona un "lenguaje" completamente funcional que un atacante puede usar 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 pueden simularse usando programación orientada a retornos contra una aplicación objetivo vinculada con la biblioteca estándar de C y que contiene una vulnerabilidad de desbordamiento de búfer explotable.

Un ataque de programación orientada a retornos es superior a los demás tipos de ataque analizados, tanto por su capacidad expresiva como por su resistencia a las medidas defensivas. Ninguna de las técnicas de contraataque mencionadas anteriormente, incluida la eliminación total de funciones potencialmente peligrosas de las bibliotecas compartidas, resulta eficaz contra un ataque de programación orientada a retornos.

En la arquitectura x86

Aunque los ataques de programación orientada a retorno pueden realizarse en diversas arquitecturas, [ 11 ] el artículo de Shacham y la mayoría de los trabajos posteriores se centran en la arquitectura Intel x86 . La arquitectura x86 es un conjunto de instrucciones CISC de longitud variable . La programación orientada a retorno en x86 aprovecha el hecho de que el conjunto de instrucciones es muy "denso", es decir, cualquier secuencia aleatoria de bytes puede interpretarse como un conjunto válido de instrucciones x86.

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

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

Aleatorización del diseño del espacio de direcciones

La aleatorización del espacio de direcciones también presenta vulnerabilidades. Según el artículo de Shacham et al., [ 13 ] el ASLR en arquitecturas de 32 bits está limitado por la cantidad de bits disponibles para la aleatorización de direcciones. Solo 16 de los 32 bits de dirección están disponibles para la aleatorización, y estos 16 bits pueden ser vulnerados 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 la aleatorización. Un ataque de fuerza bruta contra la aleatorización de 40 bits es posible, pero es improbable que pase desapercibido. Además de los ataques de fuerza bruta, existen técnicas para eliminar la aleatorización .

Incluso con una aleatorización perfecta, cualquier fuga de información del contenido de la memoria ayudaría a calcular la dirección base de, por ejemplo, una biblioteca compartida en tiempo de ejecución. [ 14 ]

Sin utilizar la instrucción de retorno

Según el artículo de Checkoway et al., [ 15 ] es posible realizar programación orientada a retorno en arquitecturas x86 y ARM sin usar una instrucción de retorno (0xC3 en x86). En su lugar, utilizaron secuencias de instrucciones cuidadosamente diseñadas 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: primero, lee el valor de cuatro bytes en la parte superior de la pila y establece el puntero de instrucción a ese valor; y segundo, incrementa el valor del puntero de pila en cuatro (equivalente a una operación pop). En la arquitectura x86, las secuencias de instrucciones jmp y pop pueden actuar como una instrucción de retorno. En ARM, las secuencias de instrucciones load y branch pueden actuar como una instrucción de retorno.

Dado que este nuevo enfoque no utiliza una instrucción de retorno, tiene implicaciones negativas para la defensa. Cuando un programa de defensa comprueba no solo varias instrucciones de retorno, sino también varias instrucciones de salto, este ataque puede ser detectado.

Defensas

Sin gluten

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 a retorno. La solución elimina todas las instrucciones de salto 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 dichas instrucciones para que no sean utilizadas por un atacante. La forma en que G-Free protege la dirección de retorno 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. [ 16 ]

Aleatorización del diseño del espacio de direcciones

Se han propuesto varias técnicas para contrarrestar los ataques basados ​​en la programación orientada a retornos. [ 17 ] La mayoría se basa en aleatorizar 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 gadgets y, por lo tanto, no pueda llevar a cabo una cadena de ataque de programación orientada a retornos exitosa. Una implementación bastante común de esta técnica, la aleatorización del espacio de direcciones (ASLR), carga las bibliotecas compartidas en una ubicación de memoria diferente en cada carga del programa. Aunque está ampliamente implementada 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, puede inferir la posición de todas las demás y construir un ataque de programación orientada a retornos.

Este enfoque de aleatorización puede ampliarse reubicando todas las instrucciones y/o demás estado 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 aleatorizadas durante la ejecución. Esta técnica logra que los gadgets sean difíciles de encontrar y utilizar, pero conlleva una sobrecarga significativa.

Otro enfoque, adoptado por kBouncer, modifica el sistema operativo para verificar que las instrucciones de retorno realmente desvíen el flujo de control a una ubicación inmediatamente posterior a una instrucción de llamada. Esto evita el encadenamiento de gadgets, pero no es efectivo contra ataques de programación orientados a saltos que alteran los saltos y otras instrucciones que modifican el flujo de control en lugar de los retornos. [ 21 ]

Aleatorización de código binario

Algunos sistemas modernos, como Cloud Lambda (FaaS) y las actualizaciones remotas de IoT, utilizan infraestructura en la nube para realizar compilaciones sobre la marcha antes de la implementación del software . Una técnica que introduce variaciones en cada instancia de un programa de software en ejecución puede aumentar drásticamente la inmunidad del software a los ataques ROP. El ataque de fuerza bruta a Cloud Lambda puede resultar en el ataque a varias instancias del software aleatorizado, lo que reduce la efectividad del ataque. Asaf Shelly publicó la técnica en 2017 [ 22 ] y demostró el uso de la 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, realizó la compilación en línea y distribuyó el binario. Esta técnica es muy efectiva porque los ataques ROP se basan en el conocimiento de la estructura interna del software. La desventaja de la técnica es que el software nunca se prueba completamente antes de su implementación, ya que no es factible probar todas las variaciones del software aleatorizado. Esto significa que muchas técnicas de aleatorización binaria son aplicables a interfaces de red y programación de sistemas, y se recomiendan menos para algoritmos complejos.

SEHOP

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

Contra ataques de flujo de control

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

Contra los rootkits orientados al retorno

En 2010, Jinku Li et al. propusieron [ 24 ] que un compilador adecuadamente modificado podría eliminar los "gadgets" 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 un índice específico en esa tabla. [ 24 ] : 5–6 Esto evita la creación de un gadget orientado al retorno que regresa directamente del final de una función a una dirección arbitraria en medio de otra función; en cambio, los gadgets solo pueden regresar a direcciones de retorno "legítimas", lo que aumenta drásticamente la dificultad de crear gadgets útiles. Li et al. afirmaron que "nuestra técnica de indirección de retorno esencialmente desgeneraliza la programación orientada al retorno al estilo antiguo 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 .callfpushl$index; jmpfretpopl%reg; jmptable(%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 de puntero para firmar criptográficamente las direcciones de puntero utilizando un cifrado de bloques ajustable especialmente diseñado [ 25 ] [ 26 ] que firma el valor deseado (típicamente, una dirección de retorno) combinado con un valor de "contexto local" (por ejemplo, el puntero de pila).

Antes de realizar una operación delicada (es decir, volver al puntero guardado), se puede comprobar la firma para detectar manipulaciones o usos en un contexto incorrecto (por ejemplo, aprovechar una dirección de retorno guardada desde un contexto de trampolín de explotación).

Los procesadores Apple Silicon desde el A12 se han actualizado a ARMv8.3 y utilizan PAC. Linux obtuvo soporte para la autenticación de punteros dentro del kernel en la versión 5.7 lanzada en 2020; el soporte para aplicaciones de espacio de usuario se agregó en 2018. [ 27 ]

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

Identificación de objetivos de sucursal (BTI)

ARMv8.5-A introdujo características a nivel de hardware para identificar explícitamente los destinos válidos de las instrucciones de salto. El compilador inserta una instrucción especial, con el código de operación "BTI", en cada punto de destino previsto de las instrucciones de salto indirecto . Estos destinos de salto identificados suelen incluir puntos de entrada de funciones y bloques de código switch/case.

Las instrucciones BTI se utilizan en páginas de memoria de código que el compilador y el enlazador marcan como "protegidas". Cualquier instrucción de salto indirecto que aterrice en una página protegida, en cualquier instrucción que no sea una BTI, genera un fallo.

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

Los gadgets utilizados 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 gadgets comienzan con una instrucción que no es una BTI. En consecuencia, saltar a estos gadgets provoca un fallo. Dado que un ataque ROP se compone de una cadena de múltiples gadgets, la probabilidad de que todos los gadgets de una cadena formen parte del 1 % que comienza con una BTI es muy baja.

PAC y BTI son mecanismos complementarios para prevenir inyecciones de código malicioso mediante ataques de programación orientados a retornos y saltos. Mientras que PAC se centra en el origen de una operación de salto (un puntero con signo), BTI se centra en el destino del salto. [ 30 ]

Véase también

Notas

  1. 1 2 Algunos autores utilizan el término gadget de una manera algo diferente y se refieren a él como simples 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 (01-10-2007). "Check Point Secure Platform Hack" (PDF) . Pentest . Barcelona, ​​España: Pentest Consultores. p.  219.
  2. "Hilo: Desbordamientos de búfer múltiples en CheckPoint Secure Platform" . Grupo de usuarios de Check Point . Archivado del original el 30 de septiembre de 2019.
  3. Shacham, Hovav; Buchanan, Erik; Roemer, Ryan; Savage, Stefan. "Programación orientada a retorno: Exploits sin inyección de código" . Recuperado el 12 de agosto de 2009 .
  4. Buchanan, E.; Roemer, R.; Shacham, H.; Savage, S. (octubre de 2008). «Cuando las buenas instrucciones fallan: generalizando la programación orientada a retornos a RISC» (PDF) . Actas de la 15.ª conferencia ACM sobre seguridad informática y de 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 Return-into-lib(c) , Bugtraq
  7. Nergal, Phrack 58 Artículo 4, exploits de retorno a lib(c)
  8. Sebastian Krahmer, Exploit de desbordamiento de búfer x86-64 y la técnica de explotación de fragmentos de código prestados , 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 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 la integridad del flujo de control". ACM Transactions on Information and System Security . 13 : 1–40 . doi : 10.1145/1609956.1609960 . S2CID 207175177 . 
  11. 1 2 3 Shacham, H. (octubre de 2007). "La geometría de la carne inocente sobre el hueso: retorno a libc sin llamadas a funciones (en x86)". Actas de la 14.ª conferencia ACM sobre seguridad informática y de 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 gadgets y sistema de cuerda automática
  13. [Shacham et al., 2004] Hovav Shacham, Matthew Page, Ben Pfaff, Eu-Jin Goh, Nagendra Modadugu y Dan Boneh. Sobre la efectividad de la aleatorización del espacio de direcciones. En Actas de la 11.ª conferencia ACM sobre seguridad informática y de 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 Archivado el 22 de febrero de 2017 en Wayback Machine
  15. Checkoway, S., Davi, L., Dmitrienko, A., Sadeghi, A.-R., Shacham, H., Winandy, M. 2010. Programación orientada a retornos sin retornos. En Actas de CCS 2010, A. Keromytis y V. Shmatikov, Eds. ACM Press , 559–572
  16. Onarlioglu, K., Bilge, L., Lanzi, A., Balzarotti, D., Kirda, E. 2010. G-Free: Derrotando la programación orientada a retornos mediante binarios sin gadgets. En Actas de ACSAC 2010, M. Franz y J. McDermott, Eds. ACM Press , 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 a retornos» (PDF) . Investigación en ataques, intrusiones y defensas . Lecture Notes in Computer Science. Vol. 8145. pp. 82–102 . doi : 10.1007/978-3-642-41284-4_5 . ISBN   978-3-642-41283-7Archivado del original (PDF) el 22 de febrero de 2014.
  18. Venkat, Ashish; Shamasunder, Sriskanda; Shacham, Hovav; Tullsen, Dean M. (1 de enero de 2016). «HIPStR». Actas de la Vigésimo Primera Conferencia Internacional sobre Soporte Arquitectónico para Lenguajes de Programación y Sistemas Operativos . ASPLOS '16. Nueva York, NY, EE. UU.: ACM. págs. 727–741 . doi : 10.1145/2872362.2872408 . ISBN  9781450340915. S2CID 7853786 . 
  19. Hiser, J.; Nguyen-Tuong, A.; Co, M.; Hall, M.; Davidson, JW (mayo de 2012). "ILR: ¿Dónde están mis dispositivos?". Simposio IEEE de 2012 sobre seguridad y privacidad . págs. 571–585 . doi : 10.1109/SP.2012.39 . ISBN  978-1-4673-1244-8. S2CID 15696223 . 
  20. US 9135435 , Venkat, Ashish; Krishnaswamy, Arvind y Yamada, Koichi et al., "Reubicación del estado del programa impulsada por un traductor binario", publicado el 15 de septiembre de 2015, asignado a Intel Corp. 
  21. Vasilis Pappas. kBouncer: Mitigación ROP eficiente y transparente . Abril de 2012.
  22. Solicitud estadounidense 2019347385 , Shelly, Asaf, "Métodos y sistemas de seguridad mediante mutación de código", publicada el 14 de noviembre de 2019 , posteriormente abandonada. 
  23. Francillon, A., Perito, D., Castelluccia, C. 2009. Defensa de sistemas embebidos contra ataques de flujo de control. En Actas de SecuCode 2009, S. Lachmund y C. Schaefer, Eds. ACM Press , 19–26.
  24. 1 2 3 4 Li, Jinku; Wang, Zhi; Jiang, Xuxian; Grace, Mike; Bahram, Sina. Derrotando rootkits orientados a retorno con kernels "sin retorno". En Actas de EuroSys 2010 , editado por G. Muller. ACM Press , 195–208.
  25. Avanzi, Roberto (2016). La familia de cifrados por bloques QARMA (PDF) . IACR Transactions on Symmetric Cryptology (ToSC) . Vol. 17 (publicado el 8 de marzo de 2017). pp. 4–44 . doi : 10.13154/tosc.v2017.i1.4-44 . Archivado del original (PDF) el 13 de mayo de 2020.  
  26. Seguridad de productos Qualcomm. "Autenticación de punteros en ARMv8.3" (PDF) . Qualcomm Technologies Inc. Archivado (PDF) del original el 6 de junio de 2020. Recuperado el 16 de junio de 2020. Por lo tanto, diseñamos QARMA, una nueva familia de cifradores de bloques ligeros y configurables.
  27. "Linux 5.7 para ARM de 64 bits incorpora autenticación de punteros en el kernel y monitores de actividad - Phoronix" . www.phoronix.com . Consultado el 31 de marzo de 2020 .
  28. Ravichandran, Joseph; Na, Weon Taek; Lang, Jay; Yan, Mengjia (junio de 2022). "PACMAN: atacando la autenticación de punteros ARM con ejecución especulativa". Actas del 49.º Simposio Internacional Anual sobre Arquitectura de Computadoras . Association for Computing Machinery. doi : 10.1145/3470496.3527429 . hdl : 1721.1/146470 .
  29. "Aplicación de las técnicas PAC y BTI a código real" . developer.arm.com . Consultado el 4 de febrero de 2024 .
  30. "Integridad del flujo de control, 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 (08/10/2010) [04/10/2010]. Programas independientes de la plataforma (PDF) . Actas de la 17.ª conferencia ACM sobre seguridad informática y de comunicaciones (CCS'10). Chicago, Illinois, EE. UU.: Universidad Carnegie Mellon , Pittsburgh, Pensilvania, EE. UU. / Instituto Tecnológico de Georgia , Atlanta, Georgia, EE. UU. pp. 547–558 . doi : 10.1145/1866307.1866369 . ISBN  978-1-4503-0244-9. Archivado (PDF) del original el 26-05-2022 . Recuperado el 26-05-2022 .(12 páginas) (Véase también:(Nota: Se utiliza el término gadget para referirse a fragmentos de lógica de programa, en este caso divididos en encabezado del gadget y cuerpo del gadget ).
  • "Científicos informáticos toman el control de una máquina de votación electrónica con una nueva técnica de programación" . Science Daily. 11 de agosto de 2009.
  • Vídeo de demostración de un ataque de programación orientado a retorno . YouTube .
  • AntiJOP: un programa que elimina las vulnerabilidades JOP/ROP del código en lenguaje ensamblador.