
Ferramentas para exercitar a mitigação do kernel Linux para CVE-2018-3639 (também conhecida como Variant 4) usando o recurso Speculative Store Bypass Disable (SSBD) dos processadores x86
O projeto ssbd-tools é uma coleção de programas que fazem uso da funcionalidade Speculative Store Bypass Disable (SSBD) fornecida em processadores x86. SSBD é uma mitigação baseada no processador para o ataque Speculative Store Bypass, que é referido como Variant 4 e recebeu a CVE-2018-3639. O kernel Linux introduziu controles por processo para fazer uso do SSBD, e essas ferramentas podem ser usadas para utilizar esses controles e ajudar a verificar sua corretude.
O kernel Linux fornece vários modos diferentes de operação, que podem ser
selecionados no momento da inicialização com o parâmetro de kernel
spec_store_bypass_disable, para SSBD em sistemas x86. A documentação de parâmetros do kernel
os descreve bem. Aqui está um trecho desse documento descrevendo as opções:
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"
A funcionalidade SSBD é ativada/desativada pela definição de um único bit em um registrador específico do modelo (MSR) do processador. O MSR exato e a localização do bit dentro do MSR diferem entre os fabricantes de CPU, entre as famílias de CPU de um único fabricante e conforme o kernel esteja ou não sendo executado sob um hipervisor. Essas ferramentas seguem as diretrizes publicadas pela Intel e pela AMD para decidir onde o bit SSBD está localizado para o ambiente de execução atual.
Alguns sistemas podem não ter suporte SSBD disponível. Isso pode ser devido a vários motivos:
intel-microcode e amd64-microcode para Debian/Ubuntu). Processadores AMD
das famílias 15h, 16h e 17h não exigem microcódigo atualizado.O programa ssbd-exec utiliza os controles SSBD por processo antes de executar
outro programa. Ele pode usar o prctl PR_SET_SPECULATION_CTRL para permitir
especulação (-p enable para usar PR_SPEC_ENABLE), proibir especulação via
SSBD (-p disable para usar PR_SPEC_DISABLE), ou proibir permanentemente
a especulação em todos os futuros processos filhos via SSBD (-p force-disable para usar PR_SPEC_FORCE_DISABLE).
Ele também pode carregar um filtro seccomp permissivo (-s empty) que, por
padrão em x86, opta o processo pela mitigação SSBD. Há também uma opção (-s spec-allow) para carregar um filtro permissivo que não opta o processo pelo
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
O programa ssbd-verify valida que o bit SSBD real, no MSR e no deslocamento de bit específicos do seu processador, tem o valor esperado. 0 significa que o SSBD não está em uso, enquanto 1 significa que está em uso.
O programa também pode ser usado para validar que o valor do prctl
PR_GET_SPECULATION_CTRL da tarefa está definido para permitir especulação
(-p enable para verificar PR_SPEC_ENABLE), proibir especulação via SSBD
(-p disable para verificar PR_SPEC_DISABLE), ou proibir permanentemente
a especulação em todos os futuros processos filhos via SSBD (-p force-disable
para verificar PR_SPEC_FORCE_DISABLE).
O programa pode ser configurado para verificar repetidamente o valor do bit
SSBD usando a opção -t SECONDS. Se SECONDS for 0, o programa faz um loop
infinito enquanto verifica o bit SSBD. Um valor diferente de zero para
SECONDS faz o programa verificar o bit SSBD pelo período de tempo
especificado.
Este programa exige que o módulo do kernel msr esteja carregado e que o usuário tenha privilégios de root para ler o bit SSBD do MSR apropriado.
$ 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: O comando acima exige o uso de sudo no ssbd-exec porque
NO_NEW_PRIVS é usado antes de carregar o filtro seccomp. O sudo não
conseguiria elevar privilégios se usado depois que NO_NEW_PRIVS for definido.
O programa ssbd-toggle simplesmente alterna o bit SSBD entre ligado e desligado em um loop infinito até que o programa seja encerrado. Ele pode ser usado em conjunto com o ssbd-verify para garantir que o processo ssbd-verify sempre tenha o valor esperado do bit SSBD quando o kernel alternar para sua tarefa.
Este programa exige que o módulo do kernel msr esteja carregado e que o usuário tenha privilégios de root para ler e escrever no MSR apropriado.
$ sudo ./ssbd-toggle
^C
Para compilar as ferramentas, execute make:
$ make
Para executar alguns testes automatizados básicos para garantir que o SSBD esteja funcionando como esperado em seu sistema, execute o alvo check como root:
$ sudo make check
PASS