Nel layer Shim, utilizzato nella maggior parte delle distribuzioni Linux per l'avvio verificato in modalità Secure Boot UEFI, è stata identificata una vulnerabilità (CVE-2023-40547) che può portare all'esecuzione remota di codice e all'elusione del meccanismo di avvio verificato UEFI Secure Boot. Un attaccante che controlla il server HTTP a cui si rivolge Shim può restituire una risposta appositamente formattata che provoca una scrittura controllata oltre il limite del buffer per organizzare l'esecuzione del codice nelle fasi iniziali di avvio.
La vulnerabilità è causata da un errore nel codice di caricamento dei file via 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 effettuare il boot in rete utilizzando il protocollo HTTP per recuperare il file del bootloader, che viene chiamato nella fase successiva. Shim, quando carica file tramite HTTP, assegna un buffer per i dati ricevuti, considerando non la dimensione effettiva dei dati, ma la dimensione indicata nell'intestazione HTTP
Shim è certificato con firma digitale da Microsoft e verifica GRUB2 con il proprio certificato, consentendo agli sviluppatori di distribuzioni di non dover certificare ogni aggiornamento del kernel e di GRUB presso Microsoft. La vulnerabilità in Shim consente di infiltrarsi nella catena di fiducia in modalità Secure Boot attiva, ottenendo il pieno controllo sul processo di avvio successivo, ad esempio per caricare un altro sistema operativo, modificare componenti del sistema operativo e eludere la protezione Lockdown.
La vulnerabilità è stata corretta nella versione Shim 15.8, ma per bloccare completamente l'attacco tramite Shim è necessaria la certificazione della nuova versione da parte di Microsoft e la sua implementazione nelle distribuzioni. Lo stato di correzione della vulnerabilità nelle distribuzioni può essere valutato su queste pagine: Debian, Ubuntu, SUSE, RHEL, Fedora. Il problema è che senza la revoca della firma della vecchia versione, la correzione è inutile, poiché un attaccante può compromettere il Secure Boot UEFI usando un supporto di avvio con una versione vulnerabile di Shim. Tuttavia, la revoca della firma comporterebbe l'impossibilità dell'avvio verificato delle distribuzioni che continuano a utilizzare la vecchia versione di Shim.
Per bloccare la vulnerabilità senza revocare la firma digitale, i distributori possono utilizzare il meccanismo SBAT (UEFI Secure Boot Advanced Targeting), il cui supporto è stato implementato per GRUB2, shim e fwupd nella maggior parte dei distribuiti Linux. SBAT è stato sviluppato congiuntamente a Microsoft e implica l'aggiunta di metadati ai file eseguibili dei componenti UEFI, che includono informazioni sul produttore, prodotto, componente e versione. I metadati indicati sono firmati digitalmente e possono essere inclusi separatamente nelle liste di componenti consentiti o vietati per UEFI Secure Boot.
SBAT consente di bloccare l'uso della firma digitale per singoli numeri di versione dei componenti senza necessità di revocare le chiavi per Secure Boot. Il blocco delle vulnerabilità tramite SBAT non richiede l'uso dell'elenco dei certificati revocati UEFI (dbx), ma viene effettuato a livello di sostituzione della chiave interna per la generazione delle firme e l'aggiornamento di GRUB2, shim e altri artefatti di avvio forniti dalle distribuzioni.
Oltre alla vulnerabilità considerata, in Shim 15.8 sono stati corretti anche diversi problemi meno gravi, sfruttabili localmente:
- CVE-2023-40548 — overflow intero nella funzione verify_sbat_section, che porta a un overflow del buffer nei sistemi a 32 bit.
- CVE-2023-40546 — lettura da area di memoria al di fuori del buffer durante l'emissione di messaggi di errore tramite la funzione LogError().
- CVE-2023-40549 — lettura da area di memoria al di fuori del buffer durante la gestione della funzione verify_buffer_authenticode() per file appositamente formattati in PE.
- CVE-2023-40550 — lettura da area di memoria al di fuori del buffer nella funzione verify_buffer_sbat().
- CVE-2023-40551 — lettura da area di memoria al di fuori del buffer durante l'analisi di file in formato MZ.
Fonte: opennet.ru
