
Strumenti per testare la mitigazione del kernel Linux per CVE-2018-3639 (noto anche come Variant 4) utilizzando la funzionalità Speculative Store Bypass Disable (SSBD) dei processori x86
Il progetto ssbd-tools è una raccolta di programmi che sfruttano la funzionalità Speculative Store Bypass Disable (SSBD) fornita nei processori x86. SSBD è una mitigazione basata sul processore per l'attacco Speculative Store Bypass, indicato come Variant 4 e assegnato CVE-2018-3639. Il kernel Linux ha introdotto controlli per-processo per utilizzare SSBD e questi strumenti possono essere usati per impiegare tali controlli e aiutare a verificarne la correttezza.
Il kernel Linux fornisce diverse modalità operative, che possono essere selezionate all'avvio con il parametro del kernel spec_store_bypass_disable, per SSBD su sistemi x86. La documentazione dei parametri del kernel li descrive bene. Ecco un estratto da quel documento che descrive le opzioni:
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 funzionalità SSBD viene abilitata/disabilitata impostando un singolo bit in un registro specifico del modello (MSR) del processore. L'esatto MSR e la posizione del bit all'interno dell'MSR differiscono tra i vari vendor di CPU, tra le famiglie di CPU di un singolo vendor e se il kernel è in esecuzione sotto un hypervisor. Questi strumenti seguono le linee guida pubblicate da Intel e AMD per decidere dove si trova il bit SSBD per l'ambiente di esecuzione corrente.
Alcuni sistemi potrebbero non avere il supporto SSBD disponibile. Ciò potrebbe essere dovuto a diversi motivi:
intel-microcode e amd64-microcode per Debian/Ubuntu). I processori AMD famiglia 15h, 16h e 17h non richiedono microcodice aggiornato.Il programma ssbd-exec utilizza i controlli SSBD per-processo prima di eseguire un altro programma. Può usare il prctl PR_SET_SPECULATION_CTRL per permettere la speculazione (-p enable per usare PR_SPEC_ENABLE), impedire la speculazione tramite SSBD (-p disable per usare PR_SPEC_DISABLE), o impedire permanentemente la speculazione in tutti i futuri processi figli tramite SSBD (-p force-disable per usare PR_SPEC_FORCE_DISABLE).
Può anche caricare un filtro seccomp permissivo (-s empty) che, per impostazione predefinita su x86, opta il processo nella mitigazione SSBD. C'è anche un'opzione (-s spec-allow) per caricare un filtro permissivo che non opta il processo in 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
Il programma ssbd-verify convalida che l'effettivo bit SSBD, nell'MSR e nell'offset del bit specifici del tuo processore, sia il valore atteso. 0 significa che SSBD non è in uso, mentre 1 significa che è in uso.
Il programma può anche essere utilizzato per convalidare che il valore prctl PR_GET_SPECULATION_CTRL del task sia impostato per permettere la speculazione (-p enable per verificare PR_SPEC_ENABLE), impedire la speculazione tramite SSBD (-p disable per verificare PR_SPEC_DISABLE), o impedire permanentemente la speculazione in tutti i futuri processi figli tramite SSBD (-p force-disable per verificare PR_SPEC_FORCE_DISABLE).
Il programma può essere configurato per verificare ripetutamente il valore del bit SSBD utilizzando l'opzione -t SECONDS. Se SECONDS è 0, il programma esegue un ciclo infinito verificando il bit SSBD. Un valore diverso da zero per SECONDS fa sì che il programma verifichi il bit SSBD per la quantità di tempo specificata.
Questo programma richiede che il modulo del kernel msr sia caricato e che l'utente abbia privilegi di root per leggere il bit SSBD dall'MSR appropriato.
$ 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: Il comando sopra richiede sudo su ssbd-exec perché NO_NEW_PRIVS viene utilizzato prima di caricare il filtro seccomp. sudo non sarebbe in grado di elevare i privilegi se usato dopo che NO_NEW_PRIVS è impostato.
Il programma ssbd-toggle si limita a commutare il bit SSBD acceso e spento in un ciclo infinito fino a quando il programma non viene terminato. Può essere utilizzato insieme a ssbd-verify per garantire che il processo ssbd-verify abbia sempre il valore del bit SSBD atteso quando il kernel passa al suo task.
Questo programma richiede che il modulo del kernel msr sia caricato e che l'utente abbia privilegi di root per leggere e scrivere sull'MSR appropriato.
$ sudo ./ssbd-toggle
^C
Per compilare gli strumenti, esegui make:
$ make
Per eseguire alcuni test automatici di base per assicurarti che SSBD funzioni come previsto sul tuo sistema, esegui il target check come root:
$ sudo make check
PASS