CVE-2026-98547 in Linuxinformação

Sumário

de VulDB • 18/10/2026

No kernel do Linux, a seguinte vulnerabilidade foi resolvida:

af_packet: corrige estouro de inteiro em prb_calc_retire_blk_tmo()

prb_calc_retire_blk_tmo() calcula usando aritmética int de 32 bits:

mbits = (blk_size_in_bytes * 8) / (1024 * 1024);

Se estou interpretando a validação corretamente, tp_block_size é controlado pelo usuário e packet_set_ring() rejeita apenas valores que são <= 0 como int ou não alinhados por página, então um bloco de 256 MiB passa direto (e alloc_one_pg_vec_page() até possui uma fallback vzalloc para ele). 0x10000000 * 8 transborda para INT_MIN e, em uma NIC que relata 1 Gbps (div == 1), a função acaba retornando -2047.

A condição é na verdade (8 * size) mod 2^32 >= 2^31 && div == 1, então o conjunto de gatilhos é [256,512), [768,1024), [1280,1536) e [1792,2048) MiB. Outros tamanhos transbordam para valores não negativos e links mais rápidos dividem o valor unsigned de volta abaixo de 2^31, é por isso que isso não causa falha catastrófica para todos.

O que torna fatal é o que acontece em seguida em init_prb_bdqc():

p1->interval_ktime = ms_to_ktime(prb_calc_retire_blk_tmo(...)); hrtimer_start(&p1->retire_blk_timer, p1->interval_ktime, HRTIMER_MODE_REL_SOFT);

Um timeout relativo negativo expira imediatamente. O callback retorna incondicionalmente HRTIMER_RESTART e hrtimer_forward() converte o intervalo negativo em hrtimer_resolution:

if (interval < hrtimer_resolution) interval = hrtimer_resolution;

Então o timer SOFT é acionado novamente na taxa máxima para sempre, segurando sk_receive_queue.lock a cada passagem. Uma CPU fica girando em softirq até que o socket seja fechado. Repita com mais rings e a máquina desaparece.

O estouro em si é antigo - foi introduzido junto com TPACKET_V3 em f6fb8f100b80 ("af-packet: Implementação de buffer flexível do TPACKET_V3."). Seu efeito antes de f7460d2989fa ("net: af_packet: Use hrtimer para fazer a operação de retire", v6.18) não era tão claro, pois: o valor retornado era armazenado em um unsigned short retire_blk_tov, então um resultado negativo era truncado e também poderia ser programado um loop de atraso de 0-jiffy. Nenhum dos dois é tão prejudicial quanto a espiral imediata na taxa máxima que a conversão do hrtimer transformou isso em.

(Não relacionado ao CVE-2019-20812 - aquele era o caminho de falha do ethtool retornando 0, que agora retorna DEFAULT_PRB_RETIRE_TOV.)

Reprodutor, requer CAP_NET_RAW (um container --network host tem isso por padrão) e uma NIC de 1 Gbps (QEMU e1000 funciona):

int fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); bind(fd, ...); int v = TPACKET_V3; setsockopt(fd, SOL_PACKET, PACKET_VERSION, &v, sizeof(v)); struct tpacket_req3 req = {
.tp_block_size = 0x10000000, .tp_block_nr = 1, .tp_frame_size = 2048, .tp_frame_nr = 0x10000000 / 2048, .tp_retire_blk_tov = 0, }; setsockopt(fd, SOL_PACKET, PACKET_RX_RING, &req, sizeof(req));

Calcule em 64 bits. Os operandos já são limitados pela validação existente, então nada mais muda. Se você preferir uma correção diferente, basta dizer e eu refaço a versão (respins).

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

Responsável

Linux

Reservar

25/09/2026

Divulgação

18/10/2026

Moderação

aceite

Entrada

VDB-422048

EPSS

0.00000

KEV

não

Atividades

muito baixo

Fontes

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!