Nel kernel Linux sono state identificate due vulnerabilità che consentono di utilizzare il sottosistema eBPF per eludere la protezione contro l'attacco Spectre v4 (SSB, Speculative Store Bypass). Utilizzando un programma BPF non privilegiato, un attaccante può creare condizioni per l'esecuzione speculativa di determinate operazioni e determinare il contenuto di aree arbitrarie della memoria del kernel. I sottosistemi eBPF accompagnatori nel kernel hanno avuto accesso a un prototipo di exploit che dimostra la possibilità di effettuare attacchi nella pratica. I problemi sono stati risolti tramite patch (1, 2), che entreranno a far parte del prossimo aggiornamento del kernel Linux. Gli aggiornamenti nei vari distributori non sono ancora stati formulati (Debian, RHEL, SUSE, Arch, Fedora, Ubuntu).
Il metodo di attacco Spectre 4 si basa sul recupero dei dati memorizzati nella cache del processore dopo l'annullamento del risultato delle operazioni di esecuzione speculativa durante l'elaborazione di operazioni di scrittura e lettura alternate utilizzando l'indirizzamento indiretto. Quando un'operazione di lettura segue a un'operazione di scrittura (ad esempio, mov [rbx + rcx], 0x0; mov rax, [rdx + rsi]), l'offset dell'indirizzo per la lettura può già essere noto a causa dell'esecuzione di operazioni simili (le operazioni di lettura vengono eseguite molto più spesso e la lettura può avvenire dalla cache) e il processore può eseguire speculativamente la lettura prima della scrittura, senza aspettare che venga calcolato l'offset per l'indirizzamento indiretto della scrittura.
Se dopo il calcolo dello spostamento viene rilevata un'intersezione tra aree di memoria per la scrittura e la lettura, il processore semplicemente scarterà il risultato di lettura già ottenuto in modo speculativo e ripeterà l'operazione. Questa caratteristica consente all'istruzione di lettura di accedere al vecchio valore a un determinato indirizzo mentre l'operazione di salvataggio non è ancora completata. Dopo aver scartato l'operazione speculativa non riuscita, nel cache rimangono tracce della sua esecuzione, dopo di che può essere applicato uno dei metodi per determinare il contenuto della cache basato sull'analisi delle variazioni nei tempi di accesso ai dati memorizzati e a quelli non memorizzati.
La prima vulnerabilità (CVE-2021-35477) è causata da un difetto nel meccanismo di verifica dei programmi BPF. Per proteggere contro l'attacco Spectre 4, il verificatore aggiunge, dopo le operazioni potenzialmente problematiche di salvataggio in memoria, un'ulteriore istruzione che salva un valore nullo per eliminare le tracce della precedente operazione. Si presumeva che l'operazione di scrittura dello zero si sarebbe completata molto rapidamente e bloccasse l'esecuzione speculativa, poiché dipende solo dal puntatore al frame dello stack BPF. Tuttavia, si è rivelato possibile creare condizioni in cui l'istruzione che porta all'esecuzione speculativa riesce a essere eseguita prima dell'operazione di salvataggio che la esclude.
La seconda vulnerabilità (CVE-2021-3455) è collegata al fatto che, quando il verificatore BPF rileva operazioni di memorizzazione potenzialmente pericolose, non tiene conto delle aree di stack BPF non inizializzate, la prima operazione di scrittura della quale non è protetta. Questa caratteristica consente di eseguire un’operazione di lettura speculativa che dipende da un’area di memoria non inizializzata, prima che venga eseguita l'istruzione di memorizzazione. La nuova memoria per lo stack BPF viene allocata senza controllare il contenuto già presente nella memoria allocata, e prima dell'esecuzione del programma BPF esiste un modo per controllare il contenuto dell'area di memoria che sarà allocata per lo stack BPF.
Fonte: opennet.ru
