
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 secretas de procesador de todos los fabricantes importantes; errores de software ubicuos en desensambladores, ensambladores y emuladores; fallos en hipervisores empresariales; y tanto errores de hardware 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

El ordenador 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 algunas horas hasta algunos días, dependiendo de la velocidad y complejidad de su procesador. Cuando termine, resuma los resultados:
./summarize.py data/log

Normalmente, se encontrarán varios millones de instrucciones no documentadas en su procesador, pero 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 por 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]. En este registro no se incluye información personal, aparte de la marca, modelo y revisión del procesador (de /proc/cpuinfo).
El escaneo con 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 críticos de hardware que abren vulnerabilidades de seguridad en el propio procesador.
Los detalles de los resultados se pueden encontrar en el whitepaper del proyecto.
(TODO: enumeración detallada de resultados aquí)
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 construir 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 inyector 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 esperado por 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 esperado por el desensamblador)
--unk
buscar instrucciones desconocidas (instrucciones que el desensamblador no
conoce pero que se ejecutan exitosamente)
--ill
el inverso de --unk, buscar desensamblados no válidos (instrucciones que no
se ejecutan exitosamente pero que el desensamblador reconoce)
--tick
escribir periódicamente la instrucción actual en 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 disco a medida que se encuentran
--low-mem
no almacenar resultados en memoria
Banderas del inyector:
-b
modo: fuerza bruta
-r
modo: fuzzing aleatorio
-t
modo: fuzzing por túneles
-d
modo: fuzzing dirigido externamente
-R
modo de salida sin procesar
-T
modo de salida de texto
-x
escribir progreso periódico en stderr
-0
permitir desreferencia nula (requiere sudo)
-D
permitir prefijos duplicados
-N
soporte de bit NX desactivado
-s semilla
en búsqueda aleatoria, valor de semilla
-B profundidad_bruta
en búsqueda de fuerza bruta, profundidad máxima de búsqueda
-P prefijo_max
número máximo de prefijos a buscar
-i instrucción
instrucción por la que comenzar la búsqueda (inclusive)
-e instrucción
instrucción por la que terminar la búsqueda (exclusiva)
-c núcleo
núcleo en el que realizar la búsqueda
-X lista_negra
poner en lista negra la instrucción especificada
-j trabajos
número de trabajos simultáneos a ejecutar
-l bytes_rango
número de bytes base de instrucción 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 establecer en la línea de comandos o cambiar 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 fallen con seg-fault en 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 la cantidad de bytes de prefijo a explorar; cada byte de prefijo adicional aumenta el espacio de búsqueda en aproximadamente un factor de 10. Limite los bytes de prefijo con la bandera -P.
Colores
La interfaz del sifter está diseñada para un terminal de 256 colores. Aunque los detalles varían mucho según su terminal, esto se puede lograr aproximadamente con:
export TERM='xterm-256color'
GUI