Wir präsentieren Kasper, einen spekulativen Ausführungs-Gadget-Scanner für den Linux-Kernel. Kasper verwendet Richtlinien zur Taint-Analyse, um einen Angreifer zu modellieren, der in der Lage ist, beliebige Software-/Hardware-Schwachstellen auf einem vorübergehenden Pfad auszunutzen, um Daten zu kontrollieren (z. B. durch Speichermassierung oder LVI), auf Geheimnisse zuzugreifen (z. B. durch Out-of-Bounds oder Use-After- kostenlose Zugriffe) und geben diese Geheimnisse preis (z. B. über Cache-basierte, MDS-basierte oder Port-Konkurrenz-basierte verdeckte Kanäle). Obwohl der Kernel stark gegen transiente Ausführungsangriffe gehärtet ist, findet Kasper Hunderte von Gadgets, die noch nicht entschärft sind. Das vollständige Papier finden Sie hier.
Installieren Sie Abhängigkeiten, einschließlich Go-Task als Task-Runner:
sudo apt install build-essential clang-11 lld-11 libelf-dev qemu-system-x86 bison flex golang libssl-dev cmake debootstrap python3-pexpect socat ninja-build ccache
sudo sh -c "$(curl -ssL https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin
Git-Submodule initialisieren/aktualisieren (dies wird bei der ersten Ausführung eine Weile dauern):
task update
Erstellen Sie ein Initramfs und ein Disk-Image zur Verwendung mit syzkaller:
task initramfs:create
task syzkaller:create-image
Konfigurieren und erstellen Sie LLVM mit Kasper-Unterstützung:
task llvm:config llvm:build
Syzkaller mit Kasper-Unterstützung erstellen:
ACHTUNG : Die von uns verwendete Version von Syzkaller funktioniert nur mit Golang 1.15 (wir verwenden Golang 1.15.15)!
task syzkaller:build
Konfigurieren und erstellen Sie einen mit Kasper instrumentierten Linux-Kernel:
task kernel:config build kernel:bzImage
Testen Sie, ob der instrumentierte Kernel korrekt läuft:
task qemu:test
Fuzz den instrumentierten Kernel:
task syzkaller:run-nobench
Um Gadgets zu aggregieren und die Auswertung durchzuführen, schauen Sie sich bitte Kasper-Ergebnisse an.