Nella layer Shim, utilizzata nella maggior parte delle distribuzioni Linux per l'avvio verificato in modalità UEFI Secure Boot, è stata identificata una vulnerabilità (CVE-2023-40547) che può consentire l'esecuzione remota di codice e la bypassing del meccanismo di avvio verificato UEFI Secure Boot. Un attaccante che controlla un server HTTP a cui si rivolge Shim può restituire una risposta appositamente formattata che porta a una scrittura controllata oltre il limite del buffer per avviare l'esecuzione del codice nelle fasi iniziali di avvio.
La vulnerabilità è causata da un errore nel codice di caricamento file tramite HTTP, che si manifesta durante l'elaborazione di risposte non valide restituite dal server HTTP a cui si rivolge shim. La modalità HTTPBoot in Shim è supportata dal 2016 e consente di avviare il caricamento tramite rete utilizzando il protocollo HTTP per recuperare il file del bootloader, chiamato nella fase successiva. Shim, durante il caricamento dei file tramite HTTP, alloca un buffer per i dati ricevuti, considerando non la dimensione effettiva dei dati, ma la dimensione specificata nell'intestazione HTTP “Content-Length”. Di conseguenza, restituendo un valore minore nell'intestazione Content-Length, è possibile scrivere il tail della richiesta in memoria oltre il limite del buffer.
Shim è firmato digitalmente da Microsoft e verifica GRUB2 con il proprio certificato, permettendo così agli sviluppatori delle distribuzioni di non dover firmare ogni aggiornamento del kernel e di GRUB da Microsoft. La vulnerabilità in Shim consente di infiltrarsi nella catena di fiducia durante la modalità Secure Boot attiva e ottenere il pieno controllo del processo di avvio successivo, ad esempio, per caricare un altro sistema operativo, modificare componenti del sistema operativo e bypassare la protezione Lockdown.
La vulnerabilità è stata corretta nella versione Shim 15.8, ma per bloccare completamente l'attacco tramite Shim è necessario firmare la nuova versione con Microsoft e integrarla nelle distribuzioni. Lo stato di risoluzione della vulnerabilità nelle distribuzioni può essere valutato sulle seguenti pagine: Debian, Ubuntu, SUSE, RHEL, Fedora. Il problema è che senza il ritiro della firma dalla vecchia versione, la correzione è inutile, poiché un attaccante potrebbe utilizzare un supporto di avvio con la versione vulnerabile di Shim per compromettere UEFI Secure Boot. Tuttavia, il ritiro della firma porterebbe all'impossibilità di effettuare l'avvio verificato delle distribuzioni che continuano a utilizzare la vecchia versione di Shim.
Per bloccare la vulnerabilità senza revocare la firma digitale, le distribuzioni possono utilizzare il meccanismo SBAT (UEFI Secure Boot Advanced Targeting), il cui supporto è implementato per GRUB2, shim e fwupd nella maggior parte delle distribuzioni Linux popolari. SBAT è stato sviluppato congiuntamente con Microsoft e prevede l'aggiunta, nei file eseguibili dei componenti UEFI, di metadati aggiuntivi, che includono informazioni sul produttore, prodotto, componente e versione. I metadati indicati vengono firmati digitalmente e possono essere inclusi separatamente nelle liste di componenti autorizzati o vietati per UEFI Secure Boot.
SBAT consente di bloccare l'uso della firma digitale per singoli numeri di versione dei componenti senza dover revocare le chiavi per Secure Boot. Il blocco delle vulnerabilità tramite SBAT non richiede l'uso di un elenco di certificati revocati UEFI (dbx), ma avviene a livello di sostituzione della chiave interna per la generazione di firme e aggiornamento di GRUB2, shim e altri artefatti di avvio forniti dalle distribuzioni.
Oltre alla vulnerabilità discussa, Shim 15.8 ha anche corretto diversi problemi meno gravi sfruttabili localmente:
- CVE-2023-40548 - overflow intero nella funzione verify_sbat_section, che porta a un overflow del buffer su sistemi a 32 bit.
- CVE-2023-40546 - lettura da un'area di memoria al di fuori del buffer durante l’emissione di messaggi di errore tramite la funzione LogError().
- CVE-2023-40549 - lettura da un'area di memoria al di fuori del buffer durante l'elaborazione di un file formattato PE nella funzione verify_buffer_authenticode().
- CVE-2023-40550 - lettura da un'area di memoria al di fuori del buffer nella funzione verify_buffer_sbat().
- CVE-2023-40551 - lettura da un'area di memoria al di fuori del buffer durante l'analisi di file in formato MZ.
Fonte: opennet.ru
