CVE-2025-37799
Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
03/05/2025
Last modified:
05/05/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
vmxnet3: Fix malformed packet sizing in vmxnet3_process_xdp<br />
<br />
vmxnet3 driver&#39;s XDP handling is buggy for packet sizes using ring0 (that<br />
is, packet sizes between 128 - 3k bytes).<br />
<br />
We noticed MTU-related connectivity issues with Cilium&#39;s service load-<br />
balancing in case of vmxnet3 as NIC underneath. A simple curl to a HTTP<br />
backend service where the XDP LB was doing IPIP encap led to overly large<br />
packet sizes but only for *some* of the packets (e.g. HTTP GET request)<br />
while others (e.g. the prior TCP 3WHS) looked completely fine on the wire.<br />
<br />
In fact, the pcap recording on the backend node actually revealed that the<br />
node with the XDP LB was leaking uninitialized kernel data onto the wire<br />
for the affected packets, for example, while the packets should have been<br />
152 bytes their actual size was 1482 bytes, so the remainder after 152 bytes<br />
was padded with whatever other data was in that page at the time (e.g. we<br />
saw user/payload data from prior processed packets).<br />
<br />
We only noticed this through an MTU issue, e.g. when the XDP LB node and<br />
the backend node both had the same MTU (e.g. 1500) then the curl request<br />
got dropped on the backend node&#39;s NIC given the packet was too large even<br />
though the IPIP-encapped packet normally would never even come close to<br />
the MTU limit. Lowering the MTU on the XDP LB (e.g. 1480) allowed to let<br />
the curl request succeed (which also indicates that the kernel ignored the<br />
padding, and thus the issue wasn&#39;t very user-visible).<br />
<br />
Commit e127ce7699c1 ("vmxnet3: Fix missing reserved tailroom") was too eager<br />
to also switch xdp_prepare_buff() from rcd->len to rbi->len. It really needs<br />
to stick to rcd->len which is the actual packet length from the descriptor.<br />
The latter we also feed into vmxnet3_process_xdp_small(), by the way, and<br />
it indicates the correct length needed to initialize the xdp->{data,data_end}<br />
parts. For e127ce7699c1 ("vmxnet3: Fix missing reserved tailroom") the<br />
relevant part was adapting xdp_init_buff() to address the warning given the<br />
xdp_data_hard_end() depends on xdp->frame_sz. With that fixed, traffic on<br />
the wire looks good again.