linux/drivers/net/ethernet/intel/ixgbevf
Michael Bommarito 5d49b568c1 ixgbevf: fix use-after-free in VEPA multicast source pruning
ixgbevf_clean_rx_irq() prunes frames whose source MAC matches the VF's
own address (VEPA multicast workaround) by freeing the skb and
continuing to the next descriptor:

    dev_kfree_skb_irq(skb);
    continue;

The skb pointer is declared outside the while loop and persists across
iterations.  Because the continue skips the "skb = NULL" reset at the
bottom of the loop, the next iteration enters the "else if (skb)" path
and calls ixgbevf_add_rx_frag() on the freed skb, dereferencing
skb_shinfo(skb)->nr_frags - a use-after-free in NAPI softirq context.

The sibling driver iavf already handles this correctly by nulling the
pointer before continuing.  Apply the same pattern here.

I do not have ixgbevf hardware; the bug was found by static analysis
(scan_drop_continue_loops.py + semgrep drop_continue_in_loop, multi-tool
corroboration with the highest score in the scan).  The UAF was confirmed
under KASAN by loading a test module that reproduces the exact code
pattern (alloc skb, kfree_skb, then read skb_shinfo(skb)->nr_frags):

  BUG: KASAN: slab-use-after-free in ixgbevf_uaf_test_init+0x100/0x1000
  Read of size 8 at addr 000000006163ae78 by task insmod/30
  freed 208-byte region [000000006163adc0, 000000006163ae90)

QEMU emulates igb (82576) but not ixgbe (82599), and the igbvf VF
driver does not include the VEPA source pruning path, so a full
end-to-end reproduction with emulated hardware was not possible.

Fixes: bad17234ba ("ixgbevf: Change receive model to use double buffered page based receives")
Cc: stable@vger.kernel.org
Signed-off-by: Michael Bommarito <michael.bommarito@gmail.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Link: https://patch.msgid.link/20260515182419.1597859-8-anthony.l.nguyen@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2026-05-18 19:00:44 -07:00
..
defines.h ixgbevf: fix getting link speed data for E610 devices 2025-10-13 17:44:48 -07:00
ethtool.c ixgbevf: extract GRXRINGS from .get_rxnfc 2025-11-26 17:09:10 -08:00
ipsec.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
ipsec.h ixgbe: propagate XFRM offload state direction instead of flags 2022-05-06 08:32:52 +02:00
ixgbevf_main.c ixgbevf: fix use-after-free in VEPA multicast source pruning 2026-05-18 19:00:44 -07:00
ixgbevf.h ixgbevf: ixgbevf_q_vector clean up 2025-11-27 18:34:21 -08:00
Makefile net: intel: Use *-y instead of *-objs in Makefile 2024-06-10 19:52:44 -07:00
mbx.c ixgbevf: Remove unused ixgbevf_hv_mbx_ops 2025-01-07 17:43:47 -08:00
mbx.h ixgbevf: fix mailbox API compatibility by negotiating supported features 2025-10-13 17:44:48 -07:00
regs.h
vf.c ixgbevf: add missing negotiate_features op to Hyper-V ops table 2026-04-06 13:39:23 -07:00
vf.h ixgbevf: fix mailbox API compatibility by negotiating supported features 2025-10-13 17:44:48 -07:00