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

Documentos relacionados