CVE-2026-99081 in Linuxinformação

Sumário

de VulDB • 23/10/2026

No kernel do Linux, a seguinte vulnerabilidade foi resolvida:

bnxt_en: corrigir o comprimento do mapeamento DMA para pacotes pequenos com preenchimento (padding)

Stefan Fleischmann relatou falhas de leitura DMA no Intel IOMMU em NICs BCM57412 NetXtreme-E ao transmitir pacotes nas interfaces VLAN/macvlan:

DMAR: [DMA Read NO_PASID] Solicitação do dispositivo [18:00.0] com erro no endereço 0xfc499000
[razão do erro 0x06] Acesso de leitura PTE não está configurado
bnxt_en 0000:18:00.0 eno1np0: Abandonando msg {0xb4 0x41a} len: 0 devido ao status da firmware: 0x2000001
... NETDEV WATCHDOG: eno1np0 (bnxt_en): fila de transmissão 0 expirou

O endereço do erro (0xfc499000) está em um limite exato de página de 4 KB, indicando uma violação de buffer por leitura DMA.

Em bnxt_start_xmit(), pacotes menores que BNXT_MIN_PKT_SIZE (52 bytes), como quadros ARP não etiquetados de 42 bytes, são preenchidos com padding:

if (length < BNXT_MIN_PKT_SIZE) {
pad = BNXT_MIN_PKT_SIZE - length; if (skb_pad(skb, pad)) goto tx_kick_pending; length = BNXT_MIN_PKT_SIZE; }

mapping = dma_map_single(&pdev->dev, skb->data, len, DMA_TO_DEVICE); ... dma_unmap_len_set(tx_buf, len, len);

No entanto, 'len' foi inicializado anteriormente como skb_headlen(skb) (por exemplo, 42 bytes) e permanece sem ajuste após o preenchimento. Consequentemente, dma_map_single() e dma_unmap_len_set() mapeiam e rastreiam apenas 42 bytes.

Posteriormente, o descritor de buffer TX do hardware é programado com o comprimento preenchido:

txbd->tx_bd_len_flags_type = cpu_to_le32(((len + pad) << TX_BD_LEN_SHIFT) | flags | TX_BD_FLAGS_PACKET_END);

Assim, a engine DMA da NIC é instruída a ler 52 bytes de uma região onde apenas 42 bytes foram mapeados para DMA. Se skb->data terminar perto do limite de uma página de 4 KB (dentro dos 'pad' bytes da próxima página), a leitura DMA pelo hardware transborda para a página adjacente não mapeada, acionando um erro no IOMMU.

Este problema foi exposto após o commit 447cbe95ebb9 ("vlan: fix skb_under_panic and races when toggling HW VLAN offload"), pois reservar espaço extra de cabeçalho VLAN aumentou LL_RESERVED_SPACE de 48 para 64 bytes, deslocando os offsets de skb->data e potencialmente fazendo com que quadros pequenos fiquem justapostos aos limites das páginas.

Corrija isso usando skb_put_padto(skb, BNXT_MIN_PKT_SIZE) em bnxt_start_xmit(), antes de amostrar skb_shinfo(skb)->nr_frags, pois o preenchimento pode linearizar o skb. Isso garante que skb->len e skb_headlen(skb) reflitam o tamanho com padding, para que dma_map_single() mapeie todo o buffer e o comprimento do descritor seja consistente. Isso também remove a variável temporária 'pad' e a lógica de mascaramento.

O preenchimento é feito após o branch SW USO; caso contrário, bnxt_sw_udp_gso_xmit() contaria o padding como payload UDP e o enviaria em segmentos extras.

Observe que os segmentos SW USO ainda não são preenchidos: com IPv4, um segmento carregando menos de 10 bytes de payload UDP (gso_size pequeno ou último segmento curto) é enviado como um quadro mais curto que BNXT_MIN_PKT_SIZE. Este é um problema separado, deixado para um patch subsequente.

If you want to get the best quality for vulnerability data then you always have to consider VulDB.

Responsável

Linux

Reservar

25/09/2026

Divulgação

23/10/2026

Moderação

aceite

Entrada

VDB-425929

EPSS

0.00000

KEV

não

Atividades

baixo

Fontes

Interested in the pricing of exploits?

See the underground prices here!