mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 12:53:14 +01:00
macsec: don't read an unset MAC header in macsec_encrypt()
macsec_encrypt() reads the Ethernet header via eth_hdr(skb) (skb->head + skb->mac_header) to memmove() the 12 source/destination MAC bytes forward and make room for the SecTAG. On the AF_PACKET SOCK_RAW + PACKET_QDISC_BYPASS transmit path the skb reaches the macsec ndo_start_xmit() with the MAC header unset, so eth_hdr(skb) resolves to skb->head + (u16)~0 and the read is out of bounds: a 12-byte heap over-read that is also emitted on the wire as the frame's outer source/destination MAC. KASAN reports a slab-out-of-bounds read in macsec_start_xmit() on 6.0; on current mainline a CONFIG_DEBUG_NET build flags it as an unset mac header in skb_mac_header(). On the TX path the L2 header is at skb->data, so use skb_eth_hdr(), added by commit96cc4b6958("macvlan: do not assume mac_header is set in macvlan_broadcast()") for exactly this purpose. Fixes:c09440f7dc("macsec: introduce IEEE 802.1AE driver") Cc: [email protected] Signed-off-by: Daehyeon Ko <[email protected]> Reviewed-by: Sabrina Dubroca <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Paolo Abeni <[email protected]>
This commit is contained in:
1 parent
78237e3c07
commit
f5089008f9
1 file changed
+1
-1
@@ -646,7 +646,7 @@ static struct sk_buff *macsec_encrypt(struct sk_buff *skb,
|
||||
}
|
||||
|
||||
unprotected_len = skb->len;
|
||||
eth = eth_hdr(skb);
|
||||
eth = skb_eth_hdr(skb);
|
||||
sci_present = macsec_send_sci(secy);
|
||||
hh = skb_push(skb, macsec_extra_len(sci_present));
|
||||
memmove(hh, eth, 2 * ETH_ALEN);
|
||||
|
||||
Reference in new issue
Block a user