CVE-2026-99081 in Linux
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.