Red Hat ha reso disponibile uno strumento di analisi in grado di identificare potenziali attacchi volti a sfruttare la arcinota vulnerabilità Spectre (precisamente la variante 1 di Spectre) all’interno di file binari.
La modalità con cui l’eseguibile può essere invocato è semplice:
x86_64-scanner vmlinux --start-address=0xffffffff81700001
ed il risultato potrà essere un rassicurante:
X86 Scanner: No sequences found.
O un ben più preoccupante esito positivo:
X86 Scanner: Possible sequence found, based on a starting address of 0:.
X86 Scanner: 000000: nop.
X86 Scanner: COND: 000001: jne &0xe .
X86 Scanner: 00000e: jne &0x24 .
X86 Scanner: LOAD: 000010: mov 0xb0(%rdi),%rcx.
X86 Scanner: 000017: mov 0xb0(%rsp),%rax.
X86 Scanner: 00001f: nop.
X86 Scanner: LOAD: 000020: mov 0x30(%rcx),%rbx.
Inutile dire come il livello di competenze necessario per concepire anche solo lo scan del file stesso (in questo esempio è stato analizzato proprio il kernel stesso, vmlinux, l’eseguibile che diventerà pid 0 all’interno del sistema) sia decisamente elevato, ma nulla vieta di poter replicare gli esempi forniti.
Più importante di tutto il resto: il tool in questione è stato rilasciato in forma open-source, perciò chiunque può analizzarne il codice e, con molta pazienza e competenza, carpire un po’ di più in merito a questa fastidiosa vulnerabilità.
Curiosi su come fare? Ecco un piccolo how-to basato su Fedora 28:
Per prima è necessario scaricare e decomprimere il file scanner:
$ wget https://people.redhat.com/~nickc/Spectre_Scanner/scanner.tar.xz
$ tar -xJf scanner.tar.xz
$ cd scanner
A questo punto, nel sistema andrà installato il pacchetto binutils-devel, necessario alla compilazione del sorgente:
$ sudo dnf install binutils-devel
E scaricati i sorgenti dello stesso pacchetto, poiché alcune librerie necessarie non sono presenti nel pacchetto devel:
$ wget https://ftp.gnu.org/gnu/binutils/binutils-2.29.1.tar.xz
$ tar -xJf binutils-2.29.1.tar.xz
Quindi, prima di lanciare il fantomatico comando make, all’interno del file makefile andranno impostate le seguenti variabili:
all: x86_64-scanner
...
...
...
# If you are building the tool in a separate directory
# to the sources, then you will need to add a path to
# the scanner.h header file.
#CFLAGS += -I /path/to/scanner/sources
CFLAGS += -I /home/rasca/scanner
# The scanner uses some header files that are part of
# the binutils sources, but which are not normally
# distributed with binary packages. (eg elf/internal.h)
# You can get the binutils sources from:
# https://ftp.gnu.org/gnu/binutils/
#CFLAGS += -I /path/to/binutils/sources/include
CFLAGS += -I /home/rasca/scanner/binutils-2.29.1/include
Dove chiaramente /home/rasca andrà sostituito con la vostra home directory. A questo punto tutto è pronto per la compilazione:
$ make
gcc -c scanner.c -Wall -I. -O3 -I /home/rasca/scanner -I /home/rasca/scanner/binutils-2.29.1/include
gcc -c x86_64-scanner.c -Wall -I. -O3 -I /home/rasca/scanner -I /home/rasca/scanner/binutils-2.29.1/include
gcc scanner.o x86_64-scanner.o -o x86_64-scanner -lopcodes -lbfd -liberty -lm -lz -ldl
L’esempio riportato all’inizio si preoccupava di analizzare un file denominato vmlinux, ossia il kernel del sistema, per fare lo stesso sarà necessario copiare il proprio kernel nella directory locale e decomprimerlo in modo da ottenere il file vmlinux (se siete curiosi sul perché di questi comandi a questo link si trova un’esauriente spiegazione):
$ wget -O extract-vmlinux https://raw.githubusercontent.com/torvalds/linux/master/scripts/extract-vmlinux
$ chmod +x extract-vmlinux
$ ./extract-vmlinux vmlinuz-4.17.6-200.fc28.x86_64 > vmlinux
Sarà possibile eseguire infine lo scanner:
$ ./x86_64-scanner vmlinux --start-address=0xffffffff81700001
X86 Scanner: No sequences found.
In questo caso il kernel non presenta vulnerabilità. Per fortuna, aggiungerei
È tutto, buona verifica!
Leggi il contenuto originale su Mia mamma usa Linux!