
Herramientas para ejercitar la mitigación del kernel de Linux para CVE-2018-3639 (también conocido como Variant 4) utilizando la función Speculative Store Bypass Disable (SSBD) de los procesadores x86
El proyecto ssbd-tools es una colección de programas que hace uso de la funcionalidad Speculative Store Bypass Disable (SSBD) proporcionada en los procesadores x86. SSBD es una mitigación basada en el procesador para el ataque Speculative Store Bypass, conocido como Variant 4 y asignado como CVE-2018-3639. El kernel de Linux introdujo controles por proceso para hacer uso de SSBD y estas herramientas pueden utilizarse para aprovechar esos controles y ayudar a verificar su correcto funcionamiento.
El kernel de Linux proporciona varios modos de operación diferentes, que pueden seleccionarse en el arranque con el parámetro de kernel spec_store_bypass_disable, para SSBD en sistemas x86. La documentación de parámetros del kernel los describe bien. Aquí hay un fragmento de ese documento que describe las opciones:
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"
La funcionalidad SSBD se habilita/deshabilita estableciendo un único bit en un registro específico del modelo (MSR) del procesador. El MSR exacto y la ubicación del bit dentro del MSR difieren entre los fabricantes de CPU, entre las familias de CPU de un mismo fabricante, y dependiendo de si el kernel se está ejecutando o no bajo un hipervisor. Estas herramientas siguen las directrices publicadas por Intel y AMD para decidir dónde se encuentra el bit de SSBD para el entorno de ejecución actual.
Algunos sistemas pueden no tener soporte SSBD disponible. Esto puede deberse a varias razones:
intel-microcode y amd64-microcode para Debian/Ubuntu). Los procesadores AMD de las familias 15h, 16h y 17h no requieren microcódigo actualizado.El programa ssbd-exec hace uso de los controles SSBD por proceso antes de ejecutar otro programa. Puede usar el prctl PR_SET_SPECULATION_CTRL para permitir la especulación (-p enable para usar PR_SPEC_ENABLE), impedir la especulación mediante SSBD (-p disable para usar PR_SPEC_DISABLE), o impedir permanentemente la especulación en todos los procesos hijos futuros mediante SSBD (-p force-disable para usar PR_SPEC_FORCE_DISABLE).
También puede cargar un filtro seccomp permisivo (-s empty) que, por defecto en x86, incorpora el proceso a la mitigación SSBD. También existe una opción (-s spec-allow) para cargar un filtro permisivo que no incorpora el proceso a SSBD.
$ ./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
El programa ssbd-verify valida que el bit SSBD real, en el MSR y el desplazamiento de bit específicos de su procesador, tenga el valor esperado. 0 significa que SSBD no está en uso, mientras que 1 significa que está en uso.
El programa también puede usarse para validar que el valor del prctl PR_GET_SPECULATION_CTRL de la tarea esté configurado para permitir la especulación (-p enable para verificar PR_SPEC_ENABLE), impedir la especulación mediante SSBD (-p disable para verificar PR_SPEC_DISABLE), o impedir permanentemente la especulación en todos los procesos hijos futuros mediante SSBD (-p force-disable para verificar PR_SPEC_FORCE_DISABLE).
El programa puede configurarse para verificar repetidamente el valor del bit SSBD usando la opción -t SECONDS. Si SECONDS es 0, el programa hace un bucle infinito mientras verifica el bit SSBD. Un valor distinto de cero para SECONDS hace que el programa verifique el bit SSBD durante el tiempo especificado.
Este programa requiere que el módulo del kernel msr esté cargado y que el usuario tenga privilegios de root para leer el bit SSBD del MSR correspondiente.
$ 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
Nota: El comando anterior requiere que se use sudo en ssbd-exec porque NO_NEW_PRIVS se usa antes de cargar el filtro seccomp. sudo no podría elevar privilegios si se usara después de que NO_NEW_PRIVS esté establecido.
El programa ssbd-toggle simplemente alterna el bit SSBD entre encendido y apagado en un bucle infinito hasta que el programa se termina. Puede usarse junto con ssbd-verify para asegurar que el proceso ssbd-verify siempre tenga el valor esperado del bit SSBD cuando el kernel cambie a su tarea.
Este programa requiere que el módulo del kernel msr esté cargado y que el usuario tenga privilegios de root para leer y escribir en el MSR correspondiente.
$ sudo ./ssbd-toggle
^C
Para compilar las herramientas, ejecute make:
$ make
Para ejecutar algunas pruebas automatizadas básicas y asegurarse de que SSBD funciona como se espera en su sistema, ejecute el objetivo check como root:
$ sudo make check
PASS