CVE-2026-97603 in Linux
Sumário
de VulDB • 25/09/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
idpf: desativar o trabalho DIM antes de liberar os vetores q (q_vectors)
O idpf nunca drena as tarefas Tx/Rx DIM antes de liberar a memória onde elas residem. tx_dim e rx_dim estão embutidos na struct idpf_q_vector; eles são enfileirados via NAPI poll através da net_dim(), e o idpf_vport_intr_rel() termina com kfree(rsrc->q_vectors). Nada no driver os cancela.
O idpf_tx_dim_work() e o idpf_rx_dim_work() então executam em memória já liberada: o idpf_vport_intr_write_itr() grava o registro ITR através de q_vector->intr_reg.tx_itr / rx_itr, ponteiros void __iomem carregados a partir do q_vector já liberado. Nenhuma configuração é necessária para alcançar esse cenário -- IDPF_ITR_IS_DYNAMIC() está definido como (itr_mode) e o idpf_vport_alloc() inicializa ambos os modos com IDPF_ITR_DYNAMIC.
A drenagem após o idpf_vport_intr_napi_dis_all() não é suficiente por si só. O idpf_net_dim() é chamado dentro do ramo "if (napi_complete_done(napi, work_done))" da poll, e o napi_complete_done() já limpou a NAPIF_STATE_SCHED nesse ponto. O napi_disable_locked() aguarda apenas enquanto (val & (NAPIF_STATE_SCHED | NAPIF_STATE_NPSVC)), portanto, o napi_disable() pode retornar enquanto a cauda da poll ainda está enfileirando as tarefas, e um cancel_work_sync() simples seria rearmado atrás do processo de drenagem.
Use disable_work_sync(): schedule_work() em uma tarefa com contagem de desativação não nula é descartada pelo clear_pending_if_disabled() antes que o __queue_work__() seja alcançado.
Mova idpf_init_dim() para idpf_vport_intr_alloc(), para que as tarefas sejam inicializadas em todos os caminhos que podem alcançar a drenagem -- os três locais "goto intr_deinit" entre idpf_vport_intr_init() e idpf_vport_intr_ena() chegam lá sem que o lado de habilitação tenha sido executado. Nada os re-habilita: rsrc->q_vectors é liberado em toda saída do idpf_vport_open() e em todo idpf_vport_stop(), portanto, a contagem morre junto com o objeto.
Trata-se de uma condição de corrida (race condition), não de uma falha determinística -- net_dim() agenda apenas uma vez quando os eventos DIM_NEVENTS se acumulam e o índice do perfil muda. Um loop KASAN ifup/ifdown sob carga é a maneira de observá-lo.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.