CVE-2024-27415CWE-362

CVE-2024-27415

High · published May 17, 2024

CVSS v3.1
8.8
EPSS
0%
Percentile
15.9
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

netfilter: bridge: confirm multicast packets before passing them up the stack

conntrack nf_confirm logic cannot handle cloned skbs referencing

the same nf_conn entry, which will happen for multicast (broadcast)

frames on bridges.

Example:

macvlan0

|

br0

/ \

ethX ethY

ethX (or Y) receives a L2 multicast or broadcast packet containing

an IP packet, flow is not yet in conntrack table.

1. skb passes through bridge and fake-ip (br_netfilter)Prerouting.

-> skb->_nfct now references a unconfirmed entry

2. skb is broad/mcast packet. bridge now passes clones out on each bridge

interface.

3. skb gets passed up the stack.

4. In macvlan case, macvlan driver retains clone(s) of the mcast skb

and schedules a work queue to send them out on the lower devices.

The clone skb->_nfct is not a copy, it is the same entry as the

original skb. The macvlan rx handler then returns RX_HANDLER_PASS.

5. Normal conntrack hooks (in NF_INET_LOCAL_IN) confirm the orig skb.

The Macvlan broadcast worker and normal confirm path will race.

This race will not happen if step 2 already confirmed a clone. In that

case later steps perform skb_clone() with skb->_nfct already confirmed (in

hash table). This works fine.

But such confirmation won't happen when eb/ip/nftables rules dropped the

packets before they reached the nf_confirm step in postrouting.

Pablo points out that nf_conntrack_bridge doesn't allow use of stateful

nat, so we can safely discard the nf_conn entry and let inet call

conntrack again.

This doesn't work for bridge netfilter: skb could have a nat

transformation. Also bridge nf prevents re-invocation of inet prerouting

via 'sabotage_in' hook.

Work around this problem by explicit confirmation of the entry at LOCAL_IN

time, before upper layer has a chance to clone the unconfirmed entry.

The downside is that this disables NAT and conntrack helpers.

Alternative fix would be to add locking to all code parts that deal with

unconfirmed packets, but even if that could be done in a sane way this

opens up other problems, for example:

-m physdev --physdev-out eth0 -j SNAT --snat-to 1.2.3.4

-m physdev --physdev-out eth1 -j SNAT --snat-to 1.2.3.5

For multicast case, only one of such conflicting mappings will be

created, conntrack only handles 1:1 NAT mappings.

Users should set create a setup that explicitly marks such traffic

NOTRACK (conntrack bypass) to avoid this, but we cannot auto-bypass

them, ruleset might have accept rules for untracked traffic already,

so user-visible behaviour would change.

The record
Technical detail
CVSS v3.1
8.8 · HIGH
Vector
CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00252 · 15.9th percentile
Weakness
CWE-362 · Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')
Published
2024-05-17T16:15Z
Affected products (15)
ProductVersionsFixed in
linux/linux_kernel≥ 2.6.13, < 5.15.1515.15.151
linux/linux_kernel≥ 5.16, < 6.1.816.1.81
linux/linux_kernel≥ 6.2, < 6.6.216.6.21
linux/linux_kernel≥ 6.7, < 6.7.96.7.9
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (10)
EPSS history
Timeline
  • 17 MAY 11:51Z
    netfilter: bridge: confirm multicast packets before passing them up the stack
    cvelistv5