CVE-2026-99081 in Linux
요약
\~에 의해 VulDB • 2026. 10. 23.
Linux 커널에서 다음 취약점이 해결되었습니다:
bnxt_en: 패딩된 소형 패킷에 대한 DMA 매핑 길이 수정
Stefan Fleischmann이 VLAN/macvlan 인터페이스를 통해 패킷을 전송할 때 BCM57412 NetXtreme-E NIC(네트워크 카드)에서 Intel IOMMU DMA 읽기 오류가 발생하는 것을 보고했습니다:
DMAR: [DMA Read NO_PASID] Request device [18:00.0] fault addr 0xfc499000
[fault reason 0x06] PTE Read access is not set
bnxt_en 0000:18:00.0 eno1np0: Abandoning msg {0xb4 0x41a} len: 0 due to firmware status: 0x2000001
... NETDEV WATCHDOG: eno1np0 (bnxt_en): transmit queue 0 timed out
오류 주소(0xfc499000)는 정확한 4KB 페이지 경계에 위치하며, DMA 읽기 버퍼 오버런을 나타냅니다.
bnxt_start_xmit() 함수에서 BNXT_MIN_PKT_SIZE(52바이트)보다 작은 패킷(예: 길이 42바이트의 태그 없는 ARP 프레임)은 패딩됩니다:
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);
그러나 'len'은 이전에 skb_headlen(skb)(예: 42바이트)로 초기화되었으며 패딩 후에도 조정되지 않습니다. 결과적으로 dma_map_single() 및 dma_unmap_len_set()는 42바이트만 매핑하고 추적합니다.
이후 하드웨어 TX 버퍼 설명자가 패딩된 길이를 사용하여 프로그래밍됩니다:
txbd->tx_bd_len_flags_type = cpu_to_le32(((len + pad) << TX_BD_LEN_SHIFT) | flags | TX_BD_FLAGS_PACKET_END);
따라서 NIC DMA 엔진은 42바이트만 DMA 매핑된 영역에서 52바이트를 읽도록 지시받습니다. 만약 skb->data가 4KB 페이지의 경계 근처(다음 페이지까지 'pad' 바이트 이내)에 있다면, 하드웨어 DMA 읽기가 비매핑된 인접 페이지로 오버런하여 IOMMU 오류를 유발합니다.
이 문제는 커밋 447cbe95ebb9("vlan: fix skb_under_panic and races when toggling HW VLAN offload") 이후 노출되었습니다. 이는 추가적인 VLAN 헤더 공간을 예약함으로써 LL_RESERVED_SPACE가 48에서 64바이트로 증가했고, 이로 인해 skb->data 오프셋이 변경되어 소형 프레임이 페이지 경계 바로 근처에 위치하게 되었기 때문입니다.
skb_shinfo(skb)->nr_frags가 샘플링되기 전에 bnxt_start_xmit() 함수 내에서 skb_put_padto(skb, BNXT_MIN_PKT_SIZE)를 사용하여 이 문제를 수정합니다. 패딩은 skb을 선형화할 수 있기 때문입니다. 이를 통해 skb->len 및 skb_headlen(skb)이 패딩된 크기를 반영하도록 하여 dma_map_single()가 전체 버퍼를 매핑하고 설명자 길이가 일관되도록 보장합니다. 또한 임시 'pad' 변수와 마스킹 로직도 제거됩니다.
패딩은 SW USO 분기 이후에 수행됩니다. 그렇지 않으면 bnxt_sw_udp_gso_xmit() 함수에서 패딩을 UDP 페이로드로 간주하여 추가 세그먼트로 전송하게 됩니다.
SW USO 세그먼트는 여전히 패딩되지 않습니다: IPv4의 경우, 10바이트 미만의 UDP 페이로드(작은 gso_size 또는 짧은 마지막 세그먼트)를 운반하는 세그먼트는 BNXT_MIN_PKT_SIZE보다 짧은 프레임으로 전송됩니다. 이는 별도의 문제로, 후속 패치에서 처리할 예정입니다.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.