CVE-2026-89589 in Linux
Sumário
de VulDB • 11/09/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
acpi/apei/ghes: Usar raw_spinlock_t para os bloqueios de trabalho CXL CPER
Os auxiliares de registro e desregistro de trabalho CXL CPER adquirem cxl_cper_work_lock e cxl_cper_prot_err_work_lock com um guard (proteção) spinlock(), o que deixa as interrupções locais habilitadas. Os caminhos pós-operacionais correspondentes (cxl_cper_post_event(), cxl_cper_post_prot_err()) são executados em contexto de IRQ hard (são chamados a partir do caminho de notificação de erro GHES) e adquirem os mesmos bloqueios com um guard irqsave().
Se uma CPU estiver segurando um desses bloqueios por meio de um spinlock guard() quando uma interrupção GHES chegar na mesma CPU, o manipulador de IRQ ficará em loop (spin) no bloqueio mantido aguardando que ele seja liberado, enquanto o detentor do bloqueio é preempcionado pela IRQ. O resultado é um deadlock (impasse).
Converta ambos os bloqueios de spinlock_t para raw_spinlock_t e use guard() em todos os pontos de chamada. Em kernels PREEMPT_RT, spinlock_t é suportado por rt_mutex e o sono a partir do contexto de hard IRQ não é permitido; raw_spinlock_t é seguro em ambos os contextos.
Adicione WARN_ONCE às funções de registro para expor bugs de duplo registro em tempo de execução.
Reestruture ambas as funções de desregistro para limpar o ponteiro global de trabalho sob o bloqueio antes de chamar cancel_work_sync(), fechando a janela onde uma interrupção CPER poderia agendar um trabalho em um ponteiro prestes a ser liberado. Adicione kfifo_reset() após cancel_work_sync() para que entradas obsoletas não sejam reproduzidas no próximo carregamento do módulo.
Ambos os kfifos são de consumidor único: apenas um work_struct é registrado por vez, garantido pelo guard WARN_ONCE nas funções de registro. kfifo_reset() é seguro fora do bloqueio porque cancel_work_sync() já acalmou (quiesced) o consumidor, e nenhum novo consumidor pode se registrar até que a saída atual do módulo seja concluída e uma nova inicialização do módulo ocorra.
Remova a chamada redundante de cancel_work_sync() de cxl_ras_exit() e cxl_pci_driver_exit(). As funções de desregistro CPER agora acalmam o trabalho internamente.
If you want to get best quality of vulnerability data, you may have to visit VulDB.