Descargar Documento
Transcripción
Descargar Documento
Compilador ROP Christian Heitman Fundación Dr. Manuel Sadosky Septiembre de 2013 1 / 26 Return Oriented Programming I Los mecanismos de protección actual previenen la ejecución de código en páginas de datos. I La técnica ROP permite evadir estos mecanismos. I Consiste en utilizar fragmentos de código dentro de un binario, llamados gadgets, para computar ciertas operaciones. I Encadenando varios gadgets se puede armar funciones arbitrarias. 2 / 26 Return Oriented Programming 3 / 26 ROPC I Es un PoC de un compilador ROP “Turing Complete”. I I GitHub del autor: http://github.com/pakt Posee un lenguaje de programación “similar” a C + ASM, llamado ROPL. I Saltos condicionales I Funciones (soporta recursión) I Variables locales I Etiquetas I Punteros, dereferenciación de memoria, etc. Hola Mundo (ROPL) 4 / 26 ROPC I Está basado en el paper “Q: Exploit Hardening Made Easy”. I Está escrito en ‘OCaml’. Hola Mundo Sumar una lista de enteros 5 / 26 Q / BAP I Q es similar a ROPC pero no está disponible. I BAP es una plataforma de análisis de binarios, con enfásis en la verificación formal. I ROPC utiliza BAP para varias cosas: I Pasar código x86 a un lenguaje intermedio I Ejecución simbólica I Interacción con SMT solvers 6 / 26 SMT (Satisfiability Modulo Theories) I Extensión de SAT solver para trabajar con otros tipos de teorı́as, por ejemplo, teorı́a aritmética. I Con SAT podemos responder cosas del estilo: I I Con SMT podemos responder cosas del estilo: I I Existen r , p, q tales que (r ∧ ¬p) ∨ (q ∧ p) Existen x, y tales que 2x + 5y = 12 ∧ x > 2 ∧ y > −1 SMT permite modelar fácilmente código binario y podemos preguntar sobre propiedades del mismo I Por ejemplo, el gadget g es semánticamente equivalente a una suma? I Lo logramos expresando el gadget mediante fórmulas y añadiendo las restricciones que queremos que cumpla. 7 / 26 ROPC - Estructura/Etapas I Gadgets: I Descubrimiento : procedimiento estandar I Clasificación : mediante ejecución simbólica I I Cargar una constante : reg ← valor I Copiar un registro : reg dst ← reg src I Operación aritmética : reg ← reg 1 OP reg 2 I Escribir a memoria : mem[addr + offset] ← reg I Leer de memoria : reg ← mem[addr + offset] I Leer y operar : reg ← reg OP mem[addr + offset] I Operar y escribir : mem[addr + offset] ← reg OP mem[addr + offset] Verificación : mediante SMT solvers 8 / 26 ROPC - Estructura/Etapas I Parsing: I I Transformación: I I Parsea un programa en “ROPL” y genera un AST (Abstract Syntax Tree) Transforma el AST a una lista de pseudo instrucciones y en forma SSA (Static Single Assigment) Compilación: I Matching casi directo entre instrucciones simplificadas y gadgets I Busca una asignación de registros y gadgets que eviten conflictos entre los mismos. 9 / 26 ROPC - Workflow 10 / 26 LLVM I Conjunto de herramientas para el desarrollo de compiladores. I Tiene un lenguaje intermedio llamado “LLVM IR” I Existen front-ends para C/C++/Objective-C, etc que generan “LLVM IR” I Ejemplo del IR: Código C 11 / 26 LLVM IR LLVM 12 / 26 ROPC - Soporte Básico para LLVM I La idea es poder usar cualquier lenguaje que tenga un front-end de LLVM para desarrollar un exploit I Se trató de modificar lo menos posible el código de ROPC. I La opción eligida fue traducción de ASTs: LLVM → ROPL I Hay ventajas y desventajas: I I I Modificaciones mı́nimas al código actual I Hay que lidiar con algunas limı́taciones de ROPL Por lo tanto, I Se implementó un parser/lexer de LLVM I Se implementó un traductor entre el AST de LLVM y el AST de “ROPL”. I Antes, se hizo refactoring del código y se crearon módulos bien definidos. Una vez conseguido eso se pudo compilar ROP partiendo de un .c (bueno, maso. . . ) 13 / 26 ROPC - Workflow con LLVM 14 / 26 Parseando LLVM I LLVM incluye mucha información que, a fines prácticos de lo que estamos haciendo, no es necesaria: I Atributos de funciones I Información de tipado I Metadata I Etc. I Durante el parseo y la generación del AST, se descarta esta información. I El IR de LLVM es bastante extenso I I Escribimos programas básicos en C I Los compilamos al IR (con clang) I Implementamos las instrucciones necesarias para poder compilarlos a ROP. El AST generado está pensado para que sea lo más parecido al de ROPL I Esto facilita la implementación del traductor de ASTs 15 / 26 Traducción entre ASTs (LLVM → ROPL) I Hay instrucciones que no tiene un matching inmediato I Hay funcionalidades que no están soportadas en ROPL I Para estos casos, se hace la traducción en 2 etapas, I I Simplificación / Reescritura del AST de LLVM I Resolución Por ejemplo, I Branches: I I GetElementPtr: I I Consta de 2 instrucciones diferentes, comparación y salto, la condición de salto está en una y las etiquetas en otra. Es una instrucción “compleja” para calcular el offset dentro de un arreglo / estructura. Return: I La instrucción “return” de ROPL no retorna valores. 16 / 26 ROPC - Ejemplo fib.ropl fib.ropl (parseado) 17 / 26 ROPC con Soporte para LLVM - Ejemplo fib.c función “fib” (LLVM) función “main” (LLVM) 18 / 26 ROPC con Soporte para LLVM - Ejemplo función “fib” (parseado) función “main” (parseado) 19 / 26 ROPC con Soporte para LLVM - Ejemplo 20 / 26 Problemas Encontrados I Limitaciones de ROPL. . . I Variables globales I I En ROPC, todas las variables son globales I Hay una tabla donde están definidas I Las variables globales (de LLVM), se inicializan al comienzo del “main” en la traducción. Intrinsics de LLVM I I Funciones conocidas, muy difundidas y con semántica definida: I ‘memcpy’→ ‘llvm.memcpy’ I ‘memmove’→ ‘llvm.memmove’ I ‘memset’→ ‘llvm.memset’ I Etc. Pueden aparecer en código LLVM sin, necesariamente, haberlas usado en el código C. 21 / 26 Limitaciones I Por el momento, es solo un PoC. . . I El código ROP generado es muy grande para ser usado en un ambiente de ‘producción’. I Escrito en OCaml, lenguaje no muy difundido. . . 22 / 26 Trabajo Futuro I Optimizar código generado I Soportar un subconjunto más grande de LLVM 23 / 26 Referencias I ROPC - Soporte para LLVM I I ROPC I I http://seclists.org/bugtraq/2000/May/90 Future of buffer overflows ? I I http://github.com/pakt/ropc Non-exec stack I I http://github.com/programa-stic/ropc-llvm http://seclists.org/bugtraq/2000/Nov/32 “Advanced return-into-lib(c) exploits (PaX case study)” I http://www.phrack.com/issues.html?issue=58&id= 4&mode=txt 24 / 26 Referencias I “The Geometry of Innocent Flesh on the Bone: Return-into-libc without Function Calls (on the x86)” I I “Q: Exploit Hardening Made Easy” I I http://users.ece.cmu.edu/˜ejschwar/papers/usenix11.pdf BAP : The Next-Generation Binary Analysis Platform I I http://cseweb.ucsd.edu/˜hovav/dist/geometry.pdf http://bap.ece.cmu.edu/ SMT Solvers for Software Security I http://www.usenix.org/system/files/conference/ woot12/woot12-final26.pdf 25 / 26 ¡Gracias! Me contactan en: 26 / 26