La generación automática de exploits es un concepto que se ha estudiado durante los últimos años, enfocándose sobre todo en buffer overflows localizados en la pila. El objetivo principal de estos trabajos consiste generalmente en desarrollar algoritmos que producen control-flow hijacking exploits en base a valores de entrada específicos (que también se han podido descubrir de forma automática) que provocan la corrupción de un puntero a instrucción almacenado en la pila. Sin embargo, llevar a cabo el mismo concepto en el heap presenta distintos desafíos.
Investigadores de la universidad de Oxford han presentado este año en USENIX Security Symposium un estudio en el que describen un método para automatizar las manipulaciones necesarias del heap layout para explotar buffer overflows (o underflows) en el heap. El enfoque propuesto trata de buscar los valores de entrada necesarios para colocar el origen de un buffer overflow/underflow en el heap junto a objetos que a un desarrollador de exploits o un sistema de generación automática de exploits le interesa leer o corromper. En el artículo se presentan dos sistemas:
- SIEVE: Un framework para construir benchmarks que permite una evaluación flexible y escalable de nuevos algoritmos de búsqueda o algoritmos existentes en distintos allocators, secuencias de interacción (series de llamadas a funciones de allocation o deallocation), o nuevos estados iniciales del heap.
- SHRIKE: Un sistema de manipulación automática del heap layout en el intérprete de PHP para construir control-flow hijacking exploits. Principalmente se divide en tres fases: (1) un componente que identifica fragmentos de código PHP que proporcionen distintas secuencias de interacción; (2) un componente que identifica estructuras que pueden ser interesantes para leer o corromper como parte de un exploit y un medio para desencadenar su allocation; (3) un procedimiento de búsqueda que junta los fragmentos que desencadenan las interacciones para producir programas candidatos.
La evaluación la dividen en dos grupos de experimentos: primero con una serie de benchmarks sintéticos (construidos con su propio framework de evaluación) compuestos por distintas combinaciones de estados iniciales del heap, secuencias de interacción, tamaño de los buffers de origen y destino, y allocators (tcmalloc v2.6.1, dlmalloc v2.8.6, avrlibc v2.0); y en segundo lugar, con tres vulnerabilidades reales conocidas en el intérprete de PHP (CVE-2015-8865, CVE-2016-5093, CVE-2016-7126).