CVE-2024-53194 in Linux
Riassunto
di VulDB • 21/06/2026
Nel kernel Linux, è stata risolta la seguente vulnerabilità:
PCI: Correzione del use-after-free su slot->bus durante l'hot remove
Dennis segnala un crash di avvio (boot) sui recenti laptop Lenovo dotati di dock USB4.
A partire dai commit 0fc70886569c ("thunderbolt: Reset USB4 v2 host router") e commit 59a54c5f3dbd ("thunderbolt: Reset topology created by the boot firmware"), i Router Host USB4 v1 e v2 vengono resettati durante la fase di probe del driver thunderbolt.
Il reset cancella gli bit Presence Detect State (Stato Rilevamento Presenza) e Data Link Layer Link Active (Link Attivo al Livello Collegamento Dati Layer) nel Root Port del Router Host USB4, causando così l'hot removal del dock.
Il crash si verifica quando pciehp viene disassociato da una delle porte Downstream del dock: pciehp crea un pci_slot in fase di bind e lo distrugge in fase di unbind. Il pci_slot contiene un puntatore al pci_bus sottostante la porta Downstream, ma non viene mai acquisito alcun riferimento su tale pci_bus. Poiché il pci_bus viene distrutto prima dello slot, si verifica un use-after-free quando pci_slot_release() accede a slot->bus.
In linea di principio ciò non dovrebbe accadere perché pci_stop_bus_device() disassocia pciehp (e quindi distrugge il pci_slot) prima che il pci_bus venga distrutto da pci_remove_bus_device().
Tuttavia, la stacktrace fornita da Dennis mostra che pciehp viene disassociato tramite pci_remove_bus_device() invece di pci_stop_bus_device(). Per comprendere l'importanza di questo dettaglio, è necessario sapere che il core PCI utilizza un processo in due fasi per rimuovere una porzione della gerarchia: prima disassocia tutti i driver nella sotto-gerarchia mediante pci_stop_bus_device(), e successivamente rimuove effettivamente i dispositivi tramite pci_remove_bus_device(). Non esiste alcuna precauzione per impedire l'associazione dei driver tra le chiamate a pci_stop_bus_device() e pci_remove_bus_device().
Nel caso di Dennis, sembra che la rimozione della gerarchia da parte di pciehp sia in race condition con l'associazione del driver effettuata da pci_bus_add_devices(). pciehp viene associato alla porta Downstream dopo che è stata eseguita pci_stop_bus_device(), quindi viene disassociato da pci_remove_bus_device() anziché da pci_stop_bus_device(). Poiché il pci_bus era già stato distrutto in quel momento, gli accessi ad esso provocano un use-after-free.
Si potrebbe concludere che sia necessario impedire l'associazione dei driver dopo che è stata eseguita pci_stop_bus_device(). Tuttavia, sembra rischioso che pci_slot punti a pci_bus senza mantenere un riferimento su di essa. Fare affidamento esclusivamente sul corretto ordinamento tra la disassociazione del driver e la distruzione del pci_bus non costituisce certamente una programmazione difensiva (defensive programming).
Se pci_slot ha bisogno di accedere ai dati in pci_bus
If you want to get best quality of vulnerability data, you may have to visit VulDB.