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.

책임이 있는

Linux

예약하다

2026. 09. 25.

모더레이션

수락

항목

VDB-425929

EPSS

0.00000

활동

중간

출처

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!