
El día viernes pasado tuve la oportunidad de dar una charla virtual en la Facultad de Ingeniería de la UdeC, en esta charla se trató el tema de los ataques de reutilización de código y las defensas propuestas hasta ahora. En 2016 Díez-Franco e Igor Santos señalaban que el código C / C ++ va de la mano con los errores de corrupción de memoria, que permiten a un adversario lanzar ataques que explotan esos errores. Los ataques de inyección de código stack-based o heap-based overflows, dangling pointers/use-after free, y format string vulnerabilities son comunes y se pueden prevenir utilizando defensas como write-xor-execute (W⊕E) / Data Execution Prevention (DEP) y stack canaries que se incluyen en los compiladores y sistemas operativos actuales. Sin embargo, los ataques de reutilización de código, como return-into-libc, return-oriented programming (ROP), y jump-oriented programming (JOP) todavía no se pueden prevenir por completo. Los sistemas operativos en sí mismos no están exentos de ataques de reutilización de código, como return-to-user (ret2usr), una variante a nivel de kernel de return-into-libc, y sigreturn-oriented programing (SROP), que explota las capacidades de manejo de señales de sistemas similares a UNIX para implementar gadgets de la misma manera que ROP y JOP lo hacen con las instrucciones ret y jmp respectivamente.
Para los ataques de reutilización de código a la fecha ya se han propuesto contramedidas, una de las principales es el uso de Control-Flow Integrity (CFI) que tiene varias implementaciones, como: MoCFI, CCFIR, Bin-CFI, kBouncer, ROPecker, O-CFI, Virtual-Table Verification (VTV) y Indirect Function-Call Checks (IFCC), SafeDispatch, VfGuard, VTint, PathArmor, TypeArmor, SafeDispatch, VTV, VTrust y VTI, sin embargo, todas ellas tienen una alta exigencia en cuanto a las necesidades de computo, por lo que se han propuestos otras soluciones alternativas, que ya hemos revisado en otras ocasiones: HIPStR, No-Execute-After-Read, JITSafe, Xede, JOP-Alarm, y otras propuestas basadas en hardware. Sin embargo, los code-reuse attacks aún no han sido derrotados y se han propuesto varías técnicas novedosas para la explotación de sistemas.
La presentación de ese día la pueden descargar en este enlace.
