Sandsifter applica tale tecnica nella verifica dei processori x86 generando sistematicamente codice macchina attingendo dal set di istruzioni del processore e monitorando l'esecuzione di tale codice alla ricerca di istruzioni nascoste e bug hardware. Grazie a Sandsifter sono state scoperte istruzioni segrete sui processori dei principali produttori inoltre è stato possibile scoprire bug software negli assemblatori/disassemblatori, emulatori, negli hypervisor e persino bug hardware in alcuni modelli di processori x86.
In questo articolo verranno illustrati i passaggi per installare ed eseguire Sandsifter sul proprio sistema utilizzando Kali Linux. Prima di proseguire con l'installazione ed esecuzione di Sandsifter è opportuno aggiornare i pacchetti installati e la propria distribuzione di Kali Linux eseguendo da terminale il seguente comando
apt-get update && apt-get upgrade
FIG 1 - Aggiornamento Kali Linux |
Installazione Sandsifter
Per poter installare e utilizzare Sandsifter è necessario prima installare Capstone, un Framework necessario per disassemblare. Da terminale digitare i seguenti comandiapt-get install libcapstone3 libcapstone-dev
pip install capstone
Eseguire il download di Sandsifter con il comando
git clone https://github.com/xoreaxeaxeax/sandsifter.git
FIG 2 - Download di sandsifter |
Accedere alla cartella di sandsifter
cd sandsifter
Prima di poter compilare è necessario andare a modificare il file Makefile. Digitare il comando
leafpad Makefile
Bisogna aggiungere la stringa -no-pie in modo che il contenuto del file diventi
all: injector injector: injector.o $(CC) $(CFLAGS) $< -O3 -Wall -no-pie -l:libcapstone.a -o $@ -pthread %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ -Wall clean: rm *.o injector
FIG 3 - Sandsifter makefile |
Salvare il file quindi compilare il codice eseguendo il comando
make
Esecuzione di Sandsifter
Per eseguire una verifica di base del proprio processore lanciare il comando./sifter.py --unk --dis --len --sync --tick -- -P1 -t
FIG 4 - Sandsifter |
La schermata della verifica presenta 2 sezioni: in quella superiore viene mostrata l'istruzione che Sandsifter sta verificando mentre in quella inferiore vengono riportati gli errori/bug trovati. La scansione può richiedere da poche ore a più giorni per essere portata a termine a seconda della velocità e della complessità del processore che si sta analizzando è può trovare milioni di istruzioni non documentate.
Quando la scansione è completa sarà possibile riassumere i risultati tramite il comando
./summarize.py data/log
il comando provvede anche ad assegnare una categoria e un livello di importanza al problema trovato. Le categorie principali sono 3:
- Bug Software
- Bug Hardware
- Istruzioni non documentate
Premendo 'Q' si esce dall'applicazione e viene prodotto un resoconto in formato testo della scansione del sistema.
Premendo 'M' durante l'esecuzione di Sandsifter viene modificata la modalità di ricerca (brute force, randomized fuzzing e tunneled fuzzing) mentre premendo il tasto 'P' è possibile mettere in pausa (o riprendere dalla pausa) il processo di ricerca.
Flag utilizzabili in Sandsifter
--len
Cerca le differenze di lunghezza in tutte le istruzioni. Ricerca istruzioni che si comportano in maniera diversa da quanto si aspetta il disassembler o che non esistono.
--dis
Come per il flag --len ma la ricerca viene eseguita solo per le istruzioni valide.
--unk
Ricerca le istruzioni sconosciute, istruzioni che anche se non riconosciute dal disassembler vengono eseguite con successo.
--ill
E' l'opposto del flag --unk. Ricerca istruzioni che non vengono eseguite correttamente ma riconosciute dal disassembler
--tick
Scrive periodicamente l'istruzione corrente sul disco.
--save
Salva i progressi della ricerca in uscita.
--resume
Riprende la ricerca dall'ultimo stato salvato.
--sync
Scrive i risultati della ricerca sul disco man mano che vengono trovati.
--low-mem
Non memorizza i risultati in memoria.
Injector utilizzabili in Sandsifter
-b
Mode: brute force. In tale modalità la ricerca prova le istruzioni in modo incrementale, fino a una lunghezza specificata dall'utente. Generalmente è più lenta ricerca casuale.
-r
Mode: randomized fuzzing.
-t
Mode: tunneled fuzzing.
-d
Mode: externally directed fuzzing.
-R
Raw output mode.
-T
Text output mode.
-x
Scrive periodicamente i progressi su stderr.
-0
Consente dereferenza nulla.
-D
Consente prefissi duplicati.
-N
Non consente nx bit.
-s seed
Nella ricerca random, il valore del seed.
-B brute_depth
Nella modalità brute force specifica la massima profondità della ricerca.
-P max_prefix
Numero massimo di prefissi da ricercare.
-i instruction
Istruzione da cui partire per la ricerca (inclusiva).
-e instruction
Istruzione a cui terminare la ricerca.
-c core
Core su cui eseguire la ricerca.
-X blacklist
Mette in blacklist l'istruzione specificata.
-j jobs
Numero simultaneo di job eseguiti contemporaneamente.
-l range_bytes
Numero di byte di istruzione di base in ogni sottogruppo.