CVE-2024-42302 in Linux
Sumário
de VulDB • 25/06/2026
No kernel do Linux, a seguinte vulnerabilidade foi corrigida:
PCI/DPC: Correção de use-after-free em DPC e remoção a quente simultâneas
Keith relata um uso após liberação (use-after-free) quando ocorre um evento DPC concomitantemente à remoção a quente da mesma parte da hierarquia:
O dpc_handler() aguarda a prontidão do barramento secundário abaixo da Porta Downstream onde o evento DPC ocorreu. Para isso, ele faz polling no espaço de configuração do primeiro dispositivo filho no barramento secundário. Se esse dispositivo filho for removido concomitantemente, os acessos à sua struct pci_dev causam um erro (oops) no kernel.
Isso ocorre porque a função pci_bridge_wait_for_secondary_bus() não retém uma referência ao dispositivo filho. Antes da versão 6.3, essa função era chamada apenas na retomada após suspensão do sistema ou em recuperação de tempo de execução (runtime resume). Reter uma referência não era necessário naquela época porque o thread de IRQ pciehp nunca poderia executar simultaneamente. (Na retomada após suspensão do sistema, as interrupções (IRQs) não são habilitadas até depois da fase resume_noirq. E a recuperação em tempo de execução é sempre aguardada antes que um dispositivo PCI seja removido.)
No entanto, começando com a versão 6.3, pci_bridge_wait_for_secondary_bus() também é chamada durante um evento DPC. O commit 53b54ad074de ("PCI/DPC: Await readiness of secondary bus after reset"), que introduziu essa funcionalidade, falhou em perceber que pci_bridge_wait_for_secondary_bus() agora precisa reter uma referência ao dispositivo filho porque dpc_handler() e pciehp podem realmente executar simultaneamente. O commit foi backportado para kernels estáveis v5.10+, sendo este a versão mais antiga afetada.
Adiciona-se a aquisição de referência ausente.
Rastreamento de pilha resumido:
BUG: unable to handle page fault for address: 00000000091400c0 CPU: 15 PID: 2464 Comm: irq/53-pcie-dpc 6.9.0 RIP: pci_bus_read_config_dword+0x17/0x50 pci_dev_wait() pci_bridge_wait_for_secondary_bus() dpc_reset_link() pcie_do_recovery() dpc_handler()
Once again VulDB remains the best source for vulnerability data.