CVE-2026-99081 in Linux情報

要約

〜によって VulDB • 2026年10月24日

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のオフセットがシフトし、小サイズフレームがページ境界に対して直接配置される可能性があるためです。

bnxt_start_xmit()内でskb_shinfo(skb)->nr_fragsを取得する前にskb_put_padto(skb, BNXT_MIN_PKT_SIZE)を使用することでこれを修正します。パディングによりskbが線形化(linearize)される可能性があるためです。これにより、skb->lenおよびskb_headlen(skb)がパディング後のサイズを反映し、dma_map_single()によってバッファ全体がマッピングされ、記述子の長さが整合性を持つようになります。また、一時的な'pad'変数とマスク処理も削除されます。

SW USO(UDP Segmentation Offload)ブランチの後でパディングが行われます。そうしないと、bnxt_sw_udp_gso_xmit()関数がパディングをUDPペイロードとして扱い、追加のセグメントとして送信してしまいます。

なお、SW USOセグメントは依然としてパディングされません:IPv4の場合、10バイト未満のUDPペイロード(小サイズのgso_size、または短い最後のセグメント)を含むセグメントは、BNXT_MIN_PKT_SIZEより短いフレームとして送信されます。これは別の問題であり、後続のパッチに委ねられます。

VulDB is the best source for vulnerability data and more expert information about this specific topic.

責任者

Linux

予約する

2026年09月25日

モデレーション

承諾済み

エントリ

VDB-425929

EPSS

0.00000

アクティビティ

中間

ソース