
Werkzeuge zum Testen der Linux-Kernel-Entschärfung für CVE-2018-3639 (auch bekannt als Variante 4) unter Verwendung der Speculative Store Bypass Disable (SSBD)-Funktion von x86-Prozessoren
Das ssbd-tools Projekt ist eine Sammlung von Programmen, die die Speculative Store Bypass Disable (SSBD)-Funktionalität von x86-Prozessoren nutzen. SSBD ist eine prozessorbasierte Abwehrmaßnahme gegen den Speculative Store Bypass-Angriff, der als Variant 4 bezeichnet wird und der CVE-2018-3639 zugeordnet ist. Der Linux-Kernel führte prozessbezogene Steuerungen zur Nutzung von SSBD ein, und diese Tools können verwendet werden, um diese Steuerungen zu nutzen und ihre Korrektheit zu überprüfen.
Der Linux-Kernel bietet verschiedene Betriebsmodi für SSBD auf x86-Systemen, die zur Bootzeit mit dem Kernel-Parameter spec_store_bypass_disable ausgewählt werden können. Die Dokumentation der Kernel-Parameter beschreibt diese gut. Hier ein Auszug aus diesem Dokument, der die Optionen beschreibt:
on - Unconditionally disable Speculative Store Bypass
off - Unconditionally enable Speculative Store Bypass
auto - Kernel detects whether the CPU model contains an
implementation of Speculative Store Bypass and
picks the most appropriate mitigation. If the
CPU is not vulnerable, "off" is selected. If the
CPU is vulnerable the default mitigation is
architecture and Kconfig dependent. See below.
prctl - Control Speculative Store Bypass per thread
via prctl. Speculative Store Bypass is enabled
for a process by default. The state of the control
is inherited on fork.
seccomp - Same as "prctl" above, but all seccomp threads
will disable SSB unless they explicitly opt out.
Not specifying this option is equivalent to
spec_store_bypass_disable=auto.
Default mitigations:
X86: If CONFIG_SECCOMP=y "seccomp", otherwise "prctl"
Die SSBD-Funktionalität wird durch Setzen eines einzelnen Bits in einem modellspezifischen Register (MSR) des Prozessors aktiviert/deaktiviert. Das genaue MSR und die Bitposition innerhalb des MSR unterscheiden sich je nach CPU-Hersteller, innerhalb der CPU-Familien eines einzelnen Herstellers und davon, ob der Kernel unter einem Hypervisor läuft. Diese Tools folgen den Richtlinien von Intel und AMD, um zu entscheiden, wo sich das SSBD-Bit für die aktuelle Ausführungsumgebung befindet.
Einige Systeme unterstützen möglicherweise SSBD nicht. Dies kann mehrere Gründe haben:
intel-microcode und amd64-microcode für Debian/Ubuntu). AMD-Prozessoren der Familien 15h, 16h und 17h benötigen keinen aktualisierten Mikrocode.Das Programm ssbd-exec nutzt die prozessbezogenen SSBD-Steuerungen, bevor es ein anderes Programm ausführt. Es kann das PR_SET_SPECULATION_CTRL prctl verwenden, um Spekulation zu erlauben (-p enable für PR_SPEC_ENABLE), Spekulation mittels SSBD zu verbieten (-p disable für PR_SPEC_DISABLE) oder Spekulation dauerhaft in allen zukünftigen Kindprozessen mittels SSBD zu verbieten (-p force-disable für PR_SPEC_FORCE_DISABLE).
Es kann auch einen permissiven Seccomp-Filter laden (-s empty), der standardmäßig auf x86 den Prozess in die SSBD-Abwehr einbindet. Es gibt auch eine Option (-s spec-allow), um einen permissiven Filter zu laden, der den Prozess nicht in SSBD einbindet.
$ ./ssbd-exec -- grep Spec /proc/self/status
Speculation_Store_Bypass: thread vulnerable
$ ./ssbd-exec -p disable -- grep -e Spec -e Seccomp /proc/self/status
Seccomp: 0
Speculation_Store_Bypass: thread mitigated
$ ./ssbd-exec -s empty -- grep -e Spec -e Seccomp /proc/self/status
Seccomp: 2
Speculation_Store_Bypass: thread force mitigated
Das Programm ssbd-verify überprüft, ob das tatsächliche SSBD-Bit im für Ihren Prozessor spezifischen MSR und Bit-Offset den erwarteten Wert hat. 0 bedeutet, dass SSBD nicht verwendet wird, während 1 bedeutet, dass es verwendet wird.
Das Programm kann auch verwendet werden, um zu überprüfen, ob der PR_GET_SPECULATION_CTRL prctl-Wert des Tasks auf Spekulation erlauben (-p enable zur Überprüfung von PR_SPEC_ENABLE), Spekulation mittels SSBD verbieten (-p disable zur Überprüfung von PR_SPEC_DISABLE) oder Spekulation dauerhaft in allen zukünftigen Kindprozessen mittels SSBD verbieten (-p force-disable zur Überprüfung von PR_SPEC_FORCE_DISABLE) gesetzt ist.
Das Programm kann so konfiguriert werden, dass es den Wert des SSBD-Bits wiederholt mit der Option -t SEKUNDEN überprüft. Wenn SEKUNDEN 0 ist, durchläuft das Programm eine Endlosschleife, während es das SSBD-Bit überprüft. Ein von Null verschiedener Wert für SEKUNDEN führt dazu, dass das Programm das SSBD-Bit für die angegebene Zeit überprüft.
Dieses Programm erfordert, dass das msr-Kernelmodul geladen ist und der Benutzer Root-Rechte hat, um das SSBD-Bit aus dem entsprechenden MSR zu lesen.
$ sudo ./ssbd-verify 0
$ sudo ./ssbd-verify 1
FAIL: SSBD bit verification failed (expected 1, got 0)
$ ./ssbd-exec -p disable -- sudo ./ssbd-verify 1
$ sudo ./ssbd-exec -s empty -- ./ssbd-verify 1
Hinweis: Der obige Befehl erfordert, dass sudo auf ssbd-exec verwendet wird, da NO_NEW_PRIVS vor dem Laden des Seccomp-Filters gesetzt wird. sudo könnte die Rechte nicht erhöhen, wenn es nach dem Setzen von NO_NEW_PRIVS verwendet würde.
Das Programm ssbd-toggle schaltet das SSBD-Bit in einer Endlosschleife ein und aus, bis das Programm beendet wird. Es kann zusammen mit ssbd-verify verwendet werden, um sicherzustellen, dass der ssbd-verify-Prozess immer den erwarteten SSBD-Bitwert hat, wenn der Kernel zu seinem Task wechselt.
Dieses Programm erfordert, dass das msr-Kernelmodul geladen ist und der Benutzer Root-Rechte hat, um aus dem entsprechenden MSR zu lesen und in dieses zu schreiben.
$ sudo ./ssbd-toggle
^C
Um die Tools zu bauen, führen Sie make aus:
$ make
Um einige grundlegende automatisierte Tests durchzuführen, um sicherzustellen, dass SSBD auf Ihrem System wie erwartet funktioniert, führen Sie das check-Ziel als root aus:
$ sudo make check
PASS