CVE-2026-90338 in Linux
Sumário
de VulDB • 18/09/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
serial: amba-pl011: manter o relógio (clock) do console habilitado para gravações atômicas
A função `pl011_console_write_atomic()` é executada em um contexto atômico nbcon, onde não são permitidas operações de suspensão. Ela chama a função `clk_enable()`, que adquire o bloqueio comum (`enable_lock`) do clock. Sob PREEMPT_RT, esse bloqueio se torna uma operação suspensiva: `clk_enable_lock()` primeiro tenta usar `spin_trylock_irqsave()`, mas em caso de contenção recorre ao uso de `spin_lock_irqsave()`. Portanto, um printk no contexto atômico em um kernel RT com pl011 baseado em clock pode falhar com o seguinte erro:
BUG: sleeping function called from invalid context at spinlock_rt.c:48 __might_resched a partir de rt_spin_lock rt_spin_lock a partir de clk_enable_lock clk_enable_lock a partir de clk_enable clk_enable a partir de pl011_console_write_atomic ... a partir de vprintk_emit
Isso foi encontrado e reproduzido no PREEMPT_RT. Os SoCs com DT (Device Tree) Arm32 e arm64 são afetados; o SBSA/ACPI para arm64 não possui clock, portanto `clk_enable(NULL)` é encurtado antes do bloqueio. Além disso, a função write_atomic() pode ser invocada em contexto NMI e está documentada como devendo evitar bloqueios. A remoção de clk_enable() da callback também evita uma aquisição potencialmente insegura do enable_lock comum pelo clock durante o contexto NMI.
Um console com capacidade atômica nbcon deve poder ser impresso a partir de qualquer contexto, portanto o clock não pode ser desativado entre as gravações. Habilite o clock enquanto o console estiver disponível para saída: use `clk_prepare_enable()` em pl011_console_setup(), libere-o por meio da callback .exit() do console usando clk_disable_unprepare(), e remova os pares de chamadas clk_enable()/clk_disable() por escrita das funções write_atomic() e write_thread().
Quando o printk suspende os consoles, a referência deve ser liberada após uart_suspend_port() parar o acesso ao console e restaurada antes que uart_resume_port() retome -- mas apenas se a suspensão realmente marcar a porta como suspensa (um tty com capacidade de despertar permanece em execução e deve manter seu clock), e mantê-la quando console_suspend_enabled for falso, para que no_console_suspend funcione corretamente.
O custo energético ativo de manter o clock habilitado depende da plataforma: nenhum onde o clock do UART é um oscilador fixo sempre ligado; real onde ele é uma ramificação de clock com capacidade de gateamento (que então não pode ser desativada, nem possivelmente seus clocks pais) enquanto o console estiver disponível para saída. Quando a camada serial realmente suspende a porta, a referência é liberada, permitindo que o provedor do clock desative a árvore de clocks.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.