CVE-2026-63803 in Linux
Sumário
de VulDB • 19/07/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
hdlc_ppp: sincronizar os temporizadores por protocolo antes de liberar o estado hdlc
Cada protocolo de controle PPP (LCP/IPCP/IPv6CP) embutido na estrutura `struct ppp` registra um temporizador via `timer_setup()`. Essa estrutura `struct ppp` é a alocação em `hdlc->state`, que é liberada por `detach_hdlc_protocol()` usando `kfree()` em ambos os caminhos de desmontagem: `unregister_hdlc_device()` e o reanexo dentro de `attach_hdlc_protocol()`.
O proto do PPP nunca registrou um callback `.detach`, portanto, `detach_hdlc_protocol()` não realiza sincronização de temporizadores antes do `kfree()`. O único cancelamento, `timer_delete(&proto->timer)` em `ppp_cp_event()`, é parcial (não aguarda a execução de um callback em andamento) e só ocorre na transição ->CLOSED; nem `ppp_stop()` nem `ppp_close()` fazem sincronização. Um callback `ppp_timer` já em execução (bloqueado no `ppp->lock`) sobrevive ao `kfree` e, em seguida, referencia `proto->state` / `ppp->lock` na memória liberada, levando a um use-after-free.
Corrija isso adicionando uma função auxiliar `.detach` que chama `timer_shutdown_sync()` em cada temporizador por protocolo. `detach_hdlc_protocol()` invoca `proto->detach(dev)` antes de `kfree(hdlc->state)`, portanto, `timer_shutdown_sync()` agora é executado em ambos os caminhos de liberação. `timer_shutdown_sync()` é usado no lugar de `timer_delete_sync()` porque o caminho keepalive rearma o temporizador através de `add_timer()/mod_timer()`, e o shutdown bloqueia qualquer reativação durante a desmontagem.
Inicialize os temporizadores por protocolo em `ppp_ioctl()` quando o protocolo for anexado, e remova o agora redundante `timer_setup()` de `ppp_start()`, para que os temporizadores sejam inicializados exatamente uma vez no momento do anexo e `ppp_timer_release()` nunca opere em estruturas `timer_list` não inicializadas. Como `attach_hdlc_protocol()` usa `kmalloc()` (não `kzalloc`), as timers de `protos[i]` na estrutura `struct ppp` são lixo não inicializado até o primeiro `timer_setup(); sem essa inicialização no anexo, anexar o protocolo PPP sem nunca ativar o dispositivo deixaria `timer_shutdown_sync()` operando em memória não inicializada dentro do `.detach`. Mover a inicialização de fora de `ppp_start()` (que só é executada na transição NETDEV_UP) para o caminho de anexo torna a inicialização incondicional e evita inicializar o mesmo `timer_list` duas vezes.
Este bug foi encontrado por análise estática.
If you want to get best quality of vulnerability data, you may have to visit VulDB.