In the Linux kernel, the following vulnerability has been resolved:
vmxnet3: Fix packet corruption in vmxnet3xdpxmit_frame
Andrew and Nikolay reported connectivity issues with Cilium's service load-balancing in case of vmxnet3.
If a BPF program for native XDP adds an encapsulation header such as IPIP and transmits the packet out the same interface, then in case of vmxnet3 a corrupted packet is being sent and subsequently dropped on the path.
vmxnet3xdpxmitframe() which is called e.g. via vmxnet3runxdp() through vmxnet3xdpxmitback() calculates an incorrect DMA address:
page = virttopage(xdpf->data); tbi->dmaaddr = pagepoolgetdmaaddr(page) + VMXNET3XDPHEADROOM; dmasyncsinglefordevice(&adapter->pdev->dev, tbi->dmaaddr, bufsize, DMATO_DEVICE);
The above assumes a fixed offset (VMXNET3XDPHEADROOM), but the XDP BPF program could have moved xdp->data. While the passed bufsize is correct (xdpf->len), the dmaaddr needs to have a dynamic offset which can be calculated as xdpf->data - (void *)xdpf, that is, xdp->data - xdp->datahardstart.
[
{
"signature_type": "Function",
"id": "CVE-2024-58099-0ef72282",
"target": {
"file": "drivers/net/vmxnet3/vmxnet3_xdp.c",
"function": "vmxnet3_xdp_xmit_frame"
},
"digest": {
"function_hash": "189103514053881328176295447121801742054",
"length": 1928.0
},
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@59ba6cdadb9c26b606a365eb9c9b25eb2052622d",
"deprecated": false
},
{
"signature_type": "Line",
"id": "CVE-2024-58099-1d486e87",
"target": {
"file": "drivers/net/vmxnet3/vmxnet3_xdp.c"
},
"digest": {
"line_hashes": [
"154023746051445038782189032457183483897",
"108790156452847514671703074574513512780",
"135550734491142269327298463611528500827",
"100142000425946100751689489520399371498"
],
"threshold": 0.9
},
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@4678adf94da4a9e9683817b246b58ce15fb81782",
"deprecated": false
},
{
"signature_type": "Function",
"id": "CVE-2024-58099-31542202",
"target": {
"file": "drivers/net/vmxnet3/vmxnet3_xdp.c",
"function": "vmxnet3_xdp_xmit_frame"
},
"digest": {
"function_hash": "189103514053881328176295447121801742054",
"length": 1928.0
},
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@f82eb34fb59a8fb96c19f4f492c20eb774140bb5",
"deprecated": false
},
{
"signature_type": "Function",
"id": "CVE-2024-58099-7665c438",
"target": {
"file": "drivers/net/vmxnet3/vmxnet3_xdp.c",
"function": "vmxnet3_xdp_xmit_frame"
},
"digest": {
"function_hash": "189103514053881328176295447121801742054",
"length": 1928.0
},
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@4678adf94da4a9e9683817b246b58ce15fb81782",
"deprecated": false
},
{
"signature_type": "Line",
"id": "CVE-2024-58099-8c11e412",
"target": {
"file": "drivers/net/vmxnet3/vmxnet3_xdp.c"
},
"digest": {
"line_hashes": [
"154023746051445038782189032457183483897",
"108790156452847514671703074574513512780",
"135550734491142269327298463611528500827",
"100142000425946100751689489520399371498"
],
"threshold": 0.9
},
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@f82eb34fb59a8fb96c19f4f492c20eb774140bb5",
"deprecated": false
},
{
"signature_type": "Line",
"id": "CVE-2024-58099-9105d070",
"target": {
"file": "drivers/net/vmxnet3/vmxnet3_xdp.c"
},
"digest": {
"line_hashes": [
"154023746051445038782189032457183483897",
"108790156452847514671703074574513512780",
"135550734491142269327298463611528500827",
"100142000425946100751689489520399371498"
],
"threshold": 0.9
},
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@59ba6cdadb9c26b606a365eb9c9b25eb2052622d",
"deprecated": false
}
]