Hi,

Replying to the bot's two questions:

1. How the issue was discovered

Manual code inspection, combined with a static-analysis scan of net/
that flagged the unchecked skb_mac_header() dereference in
ebt_802_3_mt(). After the scan report I read the surrounding code by
hand (ebtables.c ebt_do_table()/ebt_basic_match(), the bridge RX path,
and eth_type_trans()) to confirm that nothing between the RX entry and
this match guarantees more than ETH_HLEN (14) linear bytes past the mac
header is available, and that no pskb_may_pull() runs in between.

2. Whether the issue was actually triggered

Not triggered. This is theoretical, found by code inspection only.
There is no runtime report, stack trace, or crash log on my side. The
reasoning chain is:

 - ebt_802_3_mt() casts skb_mac_header(skb) directly to
   struct ebt_802_3_hdr * and dereferences fields up to machdr + 22
   (the ni branch of the LLC union).

 - The ebtables core never calls pskb_may_pull() before running the
   per-rule matches.

 - So an 802.3 frame (length field below 1536) whose skb carries
   nothing past the 14-byte Ethernet header reaches the match with
   machdr + 22 pointing into tailroom.

The fix in the patch deliberately chooses a conservative predicate:
it drops the packet whenever fewer than (ETH_HLEN + ebt 802.3 header
size) bytes are linear, which can also drop frames whose LLC union is
technically still inside the linear area but shorter than that. In
practice the minimum Ethernet frame is 60 bytes, so skb_headlen under
37 only occurs on truncated or malformed frames, where dropping is
the reasonable response. Fixing a potential OOB read is not worth
adding a second rule for.

If a runtime reproducer is needed, I can build one with a raw socket
and a veth pair, but I think the code-level analysis is conclusive.

Guo Zihao

Reply via email to