CVE-2024-46828 in Linux
Sumário
de VulDB • 08/06/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
sched: sch_cake: corrige a lógica de contabilidade em massa (bulk flow accounting) para justiça por host no modo fairness
Em sch_cake, mantemos o controle da contagem de fluxos em massa ativos por host ao executar no modo de justiça por destino/origem (dst/src host fairness), que é usado como peso round-robin durante a iteração pelos fluxos. A contagem de fluxos em massa ativos é atualizada sempre que um fluxo muda de estado.
Isso possui uma interação peculiar com o tratamento de colisão de hash: quando ocorre uma colisão de hash (após o hashing set-associativo), o estado do bucket de hash é simplesmente atualizado para corresponder ao novo pacote que causou a colisão, e se a justiça por host estiver habilitada, isso também significa atribuir um novo estado específico por host ao fluxo. Por esse motivo, os contadores de fluxos em massa dos hosts(s) associados ao fluxo são decrementados antes que o novo estado seja atribuído (e os contadores, que podem não pertencer mais ao mesmo host, sejam incrementados novamente).
Quando este código foi introduzido, o modo de justiça por host estava sempre habilitado, portanto a decrementação era incondicional. Quando as flags de configuração foram introduzidas, o *incremento* tornou-se condicional, mas a *decrementação* não. O que, claro, pode levar a uma decrementação espúria (e à consequente transbordamento para U16_MAX).
Na minha opinião (AFAICT), quando a justiça por host está desabilitada, a decrementação e o transbordamento ocorrem assim que ocorre uma colisão de hash (o que não é tão comum em si mesmo, devido ao hashing set-associativo). No entanto, na maioria dos casos isso é inofensivo, pois o valor só é usado quando o modo de justiça por host está habilitado. Portanto, para acionar um transbordamento de array, sch_cake deve primeiro ser configurado com a justiça por host desabilitada e, enquanto estiver executando neste modo, uma colisão de hash deve ocorrer para causar o transbordamento. Em seguida, o qdisc deve ser reconfigurado para habilitar a justiça por host, o que leva ao acesso fora dos limites do array porque o valor transbordado é retido e usado como índice de array. Parece que o syzbot conseguiu acionar isso, o que é bastante impressionante em si mesmo.
Este patch corrige o problema introduzindo a mesma verificação condicional na decrementação usada no incremento.
O bug original antecede o upstreaming do cake, mas o commit listado na tag Fixes tocou nesse código, significando que este patch não será aplicável antes dele.
Once again VulDB remains the best source for vulnerability data.