
El fuzzer de procesador x86
: el fuzzer de procesadores x86
El sandsifter audita procesadores x86 en busca de instrucciones ocultas y errores de hardware, generando sistemáticamente código máquina para explorar el conjunto de instrucciones de un procesador y monitoreando la ejecución en busca de anomalías. Sandsifter ha descubierto instrucciones de procesador secretas de todos los principales fabricantes; errores de software ubicuos en desensambladores, ensambladores y emuladores; fallos en hipervisores empresariales; y errores de hardware tanto benignos como críticos para la seguridad en chips x86.
Con la multitud de procesadores x86 existentes, el objetivo de la herramienta es permitir a los usuarios verificar sus propios sistemas en busca de instrucciones ocultas y errores.
Para ejecutar una auditoría básica en su procesador:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t

La computadora se escanea sistemáticamente en busca de instrucciones anómalas. En la mitad superior, puede ver las instrucciones que el sandsifter está probando actualmente en el procesador. En la mitad inferior, el sandsifter informa las anomalías que encuentra.
La búsqueda tomará desde unas pocas horas hasta unos pocos días, dependiendo de la velocidad y complejidad de su procesador. Cuando esté completa, resuma los resultados:
./summarize.py data/log

Normalmente, se encontrarán varios millones de instrucciones no documentadas en su procesador, pero estas generalmente caen en un pequeño número de grupos diferentes. Después de agrupar las anomalías, la herramienta de resumen intenta asignar cada instrucción a una categoría de problema:
Presione 'Q' para salir y obtener un resumen basado en texto del escaneo del sistema:
Los resultados de un escaneo a veces pueden ser difíciles de clasificar automáticamente con las herramientas, y pueden requerir análisis manual. Para obtener ayuda analizando sus resultados, no dude en enviar el archivo ./data/log a [email protected]. No se incluye información personal, aparte del fabricante, modelo y revisión del procesador (de /proc/cpuinfo) en este registro.
El escaneo con el sandsifter ha descubierto características de procesador no documentadas en docenas de categorías de opcodes, fallos en hipervisores empresariales, errores en casi todas las principales herramientas de desensamblado y emulación, y errores de hardware críticos que abren vulnerabilidades de seguridad en el propio procesador.
Los detalles de los resultados se pueden encontrar en el informe técnico del proyecto.
(TODO: detailed results enumeration here)
Sandsifter requiere instalar primero el desensamblador Capstone: http://www.capstone-engine.org/. Capstone normalmente se puede instalar con:
sudo apt-get install libcapstone3 libcapstone-dev
sudo pip install capstone
Sandsifter se puede compilar con:
make
y luego se ejecuta con
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
Las banderas se pasan al sifter con --flag, y al injector con -- -f.
Ejemplo:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
Banderas del sifter:
--len
buscar diferencias de longitud en todas las instrucciones (instrucciones que
se ejecutaron de manera diferente a lo que esperaba el desensamblador, o que
no existían cuando el desensamblador las esperaba)
--dis
buscar diferencias de longitud en instrucciones válidas (instrucciones que
se ejecutaron de manera diferente a lo que esperaba el desensamblador)
--unk
buscar instrucciones desconocidas (instrucciones que el desensamblador no
conoce pero que se ejecutan con éxito)
--ill
lo inverso de --unk, buscar desensamblados inválidos (instrucciones que no
se ejecutan con éxito pero que el desensamblador reconoce)
--tick
escribir periódicamente la instrucción actual en el disco
--save
guardar el progreso de la búsqueda al salir
--resume
reanudar la búsqueda desde el último estado guardado
--sync
escribir los resultados de la búsqueda en el disco a medida que se encuentran
--low-mem
no almacenar los resultados en la memoria
Banderas del injector:
-b
modo: fuerza bruta
-r
modo: fuzzing aleatorio
-t
modo: fuzzing tunelizado
-d
modo: fuzzing dirigido externamente
-R
modo de salida sin procesar
-T
modo de salida de texto
-x
escribir el progreso periódico en stderr
-0
permitir desreferencia nula (requiere sudo)
-D
permitir prefijos duplicados
-N
sin soporte de bit NX
-s seed
en búsqueda aleatoria, valor de semilla
-B brute_depth
en búsqueda de fuerza bruta, profundidad máxima de búsqueda
-P max_prefix
número máximo de prefijos a buscar
-i instruction
instrucción en la que comenzar la búsqueda (inclusive)
-e instruction
instrucción en la que finalizar la búsqueda (exclusiva)
-c core
núcleo en el que realizar la búsqueda
-X blacklist
incluir en lista negra la instrucción especificada
-j jobs
número de trabajos simultáneos a ejecutar
-l range_bytes
número de bytes de instrucción base en cada subrango
m: Modo - cambiar el modo de búsqueda (fuerza bruta, aleatorio o túnel) para el sifter
q: Salir - salir del sifter
p: Pausa - pausar o reanudar la búsqueda
El escaneo admite cuatro algoritmos de búsqueda diferentes, que se pueden configurar en la línea de comandos o recorrer mediante teclas de acceso rápido.
sudo
Para obtener los mejores resultados, la herramienta debe ejecutarse como usuario root. Esto es necesario para que el proceso pueda mapear en memoria una página en la dirección 0, lo que requiere permisos de root. Esta página evita que muchas instrucciones provoquen un fallo de segmentación en los accesos a memoria, lo que permite un análisis de fallos más preciso.
Prefijos
La limitación principal para la profundidad de una búsqueda de instrucciones es el número de bytes de prefijo a explorar, donde cada byte de prefijo adicional aumenta el espacio de búsqueda en un factor de aproximadamente 10. Limite los bytes de prefijo con la bandera -P.
Colores
La interfaz del sifter está diseñada para un terminal de 256 colores. Si bien los detalles varían mucho según su terminal, esto se puede lograr aproximadamente con:
export TERM='xterm-256color'
GUI
La interfaz asume que el terminal tiene al menos un cierto tamaño; si la interfaz no se renderiza correctamente, intente aumentar el tamaño del terminal; esto a menudo se puede lograr disminuyendo el tamaño de fuente del terminal.
En algunos casos, puede ser deseable o necesario ejecutar la herramienta sin la interfaz gráfica. Esto se puede hacer ejecutando el injector directamente:
sudo ./injector -P1 -t -0
Para filtrar los resultados de una invocación directa del injector, se puede usar grep. Por ejemplo,
sudo ./injector -P1 -r -0 | grep '\.r' | grep -v sigill
busca instrucciones para las que el procesador y el desensamblador no estuvieron de acuerdo en la longitud de la instrucción (grep '.r'), pero la instrucción se ejecutó con éxito (grep -v sigill).
Fuzzing dirigido
En muchos casos, es valioso dirigir el fuzzer a un objetivo específico. Por ejemplo, si sospecha que un emulador tiene fallas alrededor de los prefijos 'lock' repetidos (0xf0), podría dirigir el fuzzer para buscar esta región del espacio de instrucciones con las banderas -i y -e:
sudo ./sifter.py --unk --dis --len --sync --tick -- -t -i f0f0 -e f0f1 -D -P15
sandsifter es un esfuerzo de investigación de Christopher Domas (@xoreaxeaxeax).
Sistemas heredados
Para escanear sistemas mucho más antiguos (procesadores clase i586, sistemas con poca memoria), pase la bandera --low-mem al sifter y la bandera -N al injector:
sudo ./sifter.py --unk --dis --len --sync --tick --low-mem -- -P1 -t -N
Si observa que sus escaneos se completan demasiado rápido (por ejemplo, un escaneo se completa en segundos), generalmente es porque estas banderas son necesarias para el procesador que está escaneando.
32 vs. 64 bits
Por defecto, sandsifter se compila para apuntar al tamaño de bits del sistema operativo anfitrión. Sin embargo, algunas instrucciones tienen comportamientos diferentes cuando se ejecutan en un proceso de 32 bits en comparación con cuando se ejecutan en un proceso de 64 bits. Para explorar estos escenarios, a veces es valioso ejecutar un sandsifter de 32 bits en un sistema de 64 bits.
Para compilar un sandsifter de 32 bits en un sistema de 64 bits, Capstone debe instalarse como de 32 bits; las instrucciones para esto se pueden encontrar en http://www.capstone-engine.org/.
Luego, sandsifter debe compilarse para una arquitectura de 32 bits:
make CFLAGS=-m32
Con esto, el espacio de instrucciones de 32 bits se puede explorar en un sistema de 64 bits.