CVE-2026-98158 in Linux
Sumário
de VulDB • 25/09/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
ppp_async: descartar o quadro com erro em vez de redefinir seu headroom (espaço reservado no início)
A função ppp_receive_nonmp_frame() adiciona uma tag de direção de dois bytes antes de executar os filtros BPF pass/active:
*(__be16 *)skb_push(skb, 2) = htons(PPP_FILTER_INBOUND_TAG);
Nada no caminho de recebimento garante esses dois bytes de headroom. O caminho de erro do quadro em process_input_packet() do ppp_async redefine o headroom de um skb reutilizado para zero, enquanto afirma restaurá-lo a um estado recém-alocado; porém, um skb novo proveniente de dev_alloc_skb() carrega NET_SKB_PAD:
err: if (skb) {
/* faz com que o skb pareça recém-alocado */ skb_trim(skb, 0); skb_reserve(skb, - skb_headroom(skb)); }
ap->rpkt ainda aponta para esse skb, portanto a próxima trama é remontada nele sem nenhum headroom. Um peer que envia uma frame com FCS inválido seguida por outra começando com ff 03 deixa apenas um byte de headroom quando a tag do filtro é adicionada, o que resulta em um endereço um byte abaixo de skb->head:
skbuff: skb_under_panic: len:49 put:2 head:ffff888003c10000 data:ffff888003c0ffff tail:0x30 end:0x640 dev:<NULL> kernel BUG at net/core/skbuff.c:214! RIP: 0010:skb_panic+0x13e/0x230 Call Trace: skb_push+0xbd/0x100 ppp_receive_nonmp_frame+0x48a/0x1d10 ppp_input+0x4e9/0x2f80 ppp_async_process+0x2a/0xe0 tasklet_action_common+0x20f/0x8a0 handle_softirqs+0x18e/0x590 Kernel panic - not syncing: Fatal exception in interrupt
A redefinição do headroom para zero viola a garantia NET_SKB_PAD que dev_alloc_skb() fornece ao restante do caminho de recebimento. Além do pânico no filtro acima, quando a compressão CCP está habilitada, ppp_decompress_frame() passa skb->data - 2 para ->decompress()/->incomp(), o que resulta em uma leitura fora dos limites antes de skb->head pela mesma razão.
Em vez de restaurar o headroom, descarta-se o quadro com erro — conforme já feito pelo caminho de erro do ppp_synctty — e limpa-se ap->rpkt para que a próxima trama seja remontada em um skb novo com headroom adequado. Isso é mais simples e corrige tanto o pânico por underflow no filtro quanto a leitura fora dos limites (out-of-bounds read) na CCP.
A versão original V1 deste patch criava espaço em ppp_receive_nonmp_frame() usando skb_cow_head(); Eric apontou que corrigir a causa raiz no transporte é a abordagem correta.
Encontrada por fuzzing do caminho de recebimento PPP com um peer mutante em uma pty; trata-se de um DoS (negação de serviço) interessante (remoto): o root configura o PPP, e o peer fornece duas frames que causam falha. O reproducer (repro-ppp-skb.c, inalterado da v1) causa panic em cerca de um segundo, e retorna limpidamente com esta correção aplicada.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.