Este documento presenta una introducción a los solvers SMT (Satisfiability Modulo Theories). Explica que los solvers SMT resuelven problemas de satisfacción sobre lógicas con teorías, como igualdades, bitvectors, arreglos y números enteros. Describe que un solver SMT consta de un solver SAT, un solver de teoría y un instanciador de cuantificadores. Además, muestra ejemplos de cómo modelar problemas aritméticos y de desbordamiento de enteros usando solvers SMT.
2. SMT Solvers en una línea
Satisfiability Modulo Theory Solver
¿Existe una asignación de variables para
una fórmula dada que la evalúe como
verdadera?
x : x 5 x 10
Genera un modelo que pruebe la existencia.
2
4. SMT Solvers
Construcción por encima del problema de
satisfactibilidad booleana (SAT).
SMT Solver:
T-Solver
SAT Solver
Instanciador de cuantificadores (undecidable)
4
5. SMT Solvers
Construcción por encima del problema de
satisfactibilidad booleana (SAT).
SMT Solver:
T-Solver (Theory Solver)
• Igualdades
• BitVector
• Arreglos
• Reales
• Enteros
• Funciones no interpretadas
5
6. SMT Solvers
SMT Solver:
T-Solver (Theory Solver)
• Igualdades
• Define los simbolos: =, !=
• BitVector
• Arreglos de bits de un ancho determinado.
• Sistema de numeración de complemento a 2.
• Equivalente a un registro del procesador o un entero de C.
• Arreglos
• Define las operaciones de almacenamiento y carga.
• Equivalente a un array en C o el I/O a un archivo.
• Reales
• Enteros
• Funciones no interpretadas
• Define la lógica general de funciones más allá del cuerpo de la función.
6
7. SMT Solvers
SMT Solver:
SAT Solver (Satisfactibilidad sobre lógica proposicional)
• Lógica proposicional
• ,, ,
T-Solver generalmente codifica la teoría como un
problema SAT.
7
8. Sumando BitVectors
Un número entero en el rango [0…24) puede
expresarse como una sucesión de 4 bits.
x ( x3 x2 x1 x0 )
y ( y3 y2 y1 y0 )
La suma de estos dos números puede expresarse
utilizando únicamente símbolos de lógica
proposicional.
8
10. Sumando BitVectors
Le preguntamos a un SAT solver el valor de cada
bit de X.
x5 8
( x3 x2 x1 x0 ) x
0101 5
x3 FALSE
x2 FALSE
x1 TRUE
x0 TRUE
10
11. Características del problema
Un SMT/SAT Solver es un procedimiento de toma
de decisiones (decision procedure):
Completo
• Para toda fórmula está garantizada su finalización.
Sound
• Para toda fórmula está garantizado que el resultado sea correcto.
NP-Completo
• No puede resolverse en tiempo polinómico.
• Peor caso: exponencial.
Una teoría es decidible (decidable) si existe por lo
menos un decision procedure para dicha teoría.
11
12. Relaciones de satisfactibilidad
F es SAT si:
Existe por lo menos una solución al sistema.
F es VALID si:
Toda asignación verifica el sistema (tautología).
F es UNSAT si:
¬F = VALID (no existe una asignación posible)
F es INVALID
¬F = SAT (existe un contraejemplo)
12
16. ¿Qué está mal?
Problemas Soluciones
Uso de enteros con signo Usar unsigned int.
para conceptos que no lo
requieren.
Resultado de la Verificar que el resultado
multiplicación sin checkear. de la multiplicación no
exceda el tipo de la
variable.
Resultado de malloc sin Verificar que malloc
checkear. devuelva un puntero
válido.
16
17. Integer Overflows
Un Integer Overflow sucede cuando el resultado
de una operación entre enteros sobrepasa
(overflow) el valor máximo que puede tomar una
variable de ese tipo.
unsigned int a = 4294967294;
(0xfffffffe)
unsigned int b = 2;
if (a + b == 0)
FAIL();
17
18. Integer Overflows
Las operaciones en C (al igual que en el
procesador) se realizan utilizando aritmética de
complemento a 2.
(0xfffffffe + 0x2) mod 0x100000000
Si lo analizamos como “enteros con signo”:
0xfffffffe = -2
-2 + 2 = 0
18
19. Integer Overflows
int totalSize = numElements * elementSize;
Para contener una multiplicación de 2 enteros de
32 bits se necesitan 64 bits.
El resultado de una multiplicación en C siempre es
del tamaño del mayor de los operandos.
long long totalSize = numElements * elementSize;
ESTO ESTA MAL
19
20. Integer Overflows
long long totalSize = (long long) numElements *
(long long) elementSize;
ESTO ESTA (CASI) BIEN
20
30. Ejecución Simbólica
Emula una sucesión de instrucciones utilizando
variables simbólicas (BitVectors, Bools y Arrays
generalmente).
Permite razonar sobre el funcionamiento de un
programa.
Ejemplos:
KLEE para C.
BitBlaze/S2E para binarios.
30
32. Problemas
Inferencia o descripción de invariantes de bucles.
Decisión frente a saltos o llamadas indirectas.
Calculo de funciones duras (hashes, etc).
¿Cómo evitar concretizar las variables?
32
33. Otras Vulnerabilidades
Heap Overflow
Reemplazar alloc/free por versiones que devuelvan un
Array simbólico como puntero a buffer.
Agregar los limites de cada buffer al sistema de
ecuaciones.
Simbolizar todas las operaciones de lecto-escritura a
memoria utilizando la teoría de Arrays.
33
36. Un ejemplo más complejo
CRC32: Código de redundancia cíclica
(ampliamente utilizado).
Genera un resumen de 32 bits de una cantidad
arbitraria de información.
Sirve para verificar la correcta recepción de la
información a la que se lo aplica.
No es un algoritmo de hashing criptográficamente
seguro.
No contiene ninguna defensa frente a un ataque
activo.
36
37. Un ejemplo más complejo
Supongamos que quiero modificar un archivo con
un formato que aplica CRC32 sobre alguno de sus
miembros.
El checksum no puede ser modificado.
El texto modificado solo puede contener
números, letras y espacios.
37
38. Un ejemplo más complejo
CRC32(“PREFIJO<4 bytes>SUFIJO”)=CRC predef.
Ataque estándar:
<4 bytes> son irrestrictos.
Ataque con un SMT Solver:
<4 bytes> pertenecen al charset [a-zA-Z0-9 ].
38
39. Un ejemplo más complejo
Demo en Z3Py
crc32(“CRC32(YleRqi) == 0xCAFECAFE”) =
0xcafecafe
39
40. Bibliografía
Decision Procedures. An algorithmic Point of View
(http://www.decision-procedures.org/)
SMTLIB (documentación general y lista de solvers)
(http://www.smtlib.org)
Papers de Patrice Godefroid
(http://research.microsoft.com/en-
us/um/people/pg/pubs-by-theme.html)
Google “formal verification of software”
40