
CFOP: secuestro de corutinas C ++. Crédito: CISPA
Un ataque de reutilización de código llamado Programación orientada al marco de Coroutine (CFOP) es capaz de explotar las corutinas de C ++ en tres compiladores principales, a saber, Clang/LLVM, GCC y MSVC. CFOP incluso tiene éxito en entornos que están protegidos por la integridad del flujo de control (CFI), lo que expone brechas relevantes en 15 de estos esquemas de defensa.
En lugar de inyectar un nuevo código, las cadenas CFOP juntas las funciones existentes, logrando la ejecución de código arbitraria después de corromper las estructuras de memoria interna de coroutina. Esta nueva técnica de explotación ha sido descubierta por investigadores del Centro CISPA Helmholtz para la Seguridad de la Información, quienes han sido los primeros en estudiar Cores Cores desde una perspectiva de seguridad.
Al idear un nuevo ataque de reutilización de código, los investigadores de CISPA Marcos Sánchez Bajo y el profesor Dr. Christian Rossow han demostrado que todas las implementaciones existentes de las corutinas C ++ pueden explotarse para evitar las protecciones de CFI de última generación en Linux y Windows. Llamada programación orientada al marco de Coroutine (CFOP), el ataque da como resultado una corrupción de la memoria del montón, lo que permite a los atacantes manipular datos y asumir un control completo sobre las aplicaciones.
Una adición relativamente reciente a C ++, las coroutinas ya están presentes en más de 130 repositorios de GitHub populares únicos. «Se están utilizando para detener y reanudar funciones», explica Bajo, «que es muy útil para la programación asincrónica, por ejemplo en servidores, bases de datos y navegadores web».
Conectar funciones de Coroutine de C ++ a la memoria de montón corrupto
En términos más concretos, las coroutinas pueden, por ejemplo, usarse para crear generadores que producen una secuencia de elementos. Imagine una serie Fibonacci, donde cada nuevo número de la serie es la suma de los dos números que han ido antes. Después de cada nuevo número de la serie, la coroutina se detiene hasta que se llama para generar el siguiente.
En CFOP, las coroutinas C ++ completas y otras funciones existentes se utilizan para crear un ataque de reutilización de código, como explica Bajo: «Con los ataques de reutilización de código en general, los atacantes toman los fragmentos de código que pertenecen a la aplicación de todos modos, por lo que no se inyectan ningún nuevo código. Luego forman los encadenos de estos disipadores de código para manipular el flujo de la función del programa. Pero el flujo de CFI es un poco más difícil de recibir un código más difícil de recibir el código de código más difícil. Creando cadenas, debe tomar funciones completas de Coroutine y conectarlas de manera inteligente «.
Una vez que las protecciones de CFI se eluden al secuestrar una función de Coroutina de esta manera, cualquier otra función existente puede enviarse a un ataque de reutilización de código.
Los esquemas de CFI no pueden proteger las corutinas de C ++
Introducido para proteger contra los ataques de reutilización de código, los esquemas CFI aseguran que se observe el flujo de ejecución del programa correcto. Sin embargo, los lenguajes de programación evolucionan dinámicamente, mientras que los esquemas CFI solo protegen los paradigmas de programación que estaban presentes en el momento de su creación, como señala Bajo. «El principal problema con CFI es que esta defensa es estática en el tiempo, lo que significa que solo cubre las posibilidades de un lenguaje de programación como está. Si se introducen nuevas características en el lenguaje de programación más adelante, CFI no las reconoce y no puede tratarlas porque se creó en base a una versión anterior del lenguaje de programación».
En su estudiarBajo y Rossow encontraron que solo 7 de los 15 esquemas CFI que consideraban inicialmente eran compatibles con las coroutinas. De estos siete, solo dos (IBT y Control Flow Guard) proporcionaron protección parcial contra la explotación de las coroutinas, mientras que los cinco restantes no proporcionaron ninguno. «Al final», dice Bajo, «pudimos evitarlos a todos. Con CFOP, aún puedes hacer todas las cosas que eran posibles antes de CFI».
Parchear CFOP es un problema estructural
El hecho de que las coroutinas de C ++ disfruten de una popularidad cada vez mayor exacerban el alcance potencial de CFOP. Bajo dice: «Las coroutinas se introdujeron en C ++ en 2020 y, desde entonces, los desarrolladores los han estado utilizando cada vez más. Desafortunadamente, descubrimos que las coroutinas tienen ciertas estructuras en la memoria que pueden ser atacadas por los atacantes. Hasta donde sabemos, esto aún no ha sido explotado en la vida real».
Esencialmente, CFOP es posible porque los tres compiladores principales implementan las coroutinas de C ++ de una manera que las hace estructuralmente vulnerables. Bajo dice: «Mitigando esta técnica de explotación no es tan fácil como parchear el código; este es un problema estructural y debe repensar cómo funciona la aplicación internamente».
Bajo y Rossow han desarrollado alternativas de implementación exitosas para las corutinas de C ++ e informaron estas mitigaciones a Clang/LLVM, GCC y MSVC en noviembre de 2024. La investigación de CISPA sobre CFOP se presentará en Black Hat USA 2025 en Las Vegas el 7 de agosto.
Más información:
Marcos Sánchez Bajo et al, espera () un segundo: evadir la integridad del flujo de control secuestrando las corutinas C ++, CISPA (2025). Doi: 10.60882/cispa.28718642.v1
Proporcionado por CISPA Helmholtz Center for Information Security
Citación: Cores coroutinas C ++ propensas a un ataque de reutilización de código a pesar de la integridad del flujo de control (2025, 4 de agosto) Consultado el 4 de agosto de 2025 de https://techxplore.com/news/2025-08-coroutines-Prone-Code-Reuse.html
Este documento está sujeto a derechos de autor. Además de cualquier trato justo con el propósito de estudio o investigación privada, no se puede reproducir ninguna parte sin el permiso por escrito. El contenido se proporciona solo para fines de información.