CVE-2026-23209

Source
https://cve.org/CVERecord?id=CVE-2026-23209
Import Source
https://storage.googleapis.com/osv-test-cve-osv-conversion/osv-output/CVE-2026-23209.json
JSON Data
https://api.test.osv.dev/v1/vulns/CVE-2026-23209
Downstream
Related
Published
2026-02-14T16:27:31.175Z
Modified
2026-03-25T08:44:12.871961Z
Summary
macvlan: fix error recovery in macvlan_common_newlink()
Details

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

macvlan: fix error recovery in macvlancommonnewlink()

valis provided a nice repro to crash the kernel:

ip link add p1 type veth peer p2 ip link set address 00:00:00:00:00:20 dev p1 ip link set up dev p1 ip link set up dev p2

ip link add mv0 link p2 type macvlan mode source ip link add invalid% link p2 type macvlan mode source macaddr add 00:00:00:00:00:20

ping -c1 -I p1 1.2.3.4

He also gave a very detailed analysis:

<quote valis>

The issue is triggered when a new macvlan link is created with MACVLANMODESOURCE mode and MACVLANMACADDRADD (or MACVLANMACADDRSET) parameter, lower device already has a macvlan port and registernetdevice() called from macvlancommon_newlink() fails (e.g. because of the invalid link name).

In this case macvlanhashaddsource is called from macvlanchangesources() / macvlancommon_newlink():

This adds a reference to vlan to the port's vlansourcehash using macvlansourceentry.

vlan is a pointer to the priv data of the link that is being created.

When registernetdevice() fails, the error is returned from macvlannewlink() to rtnlnewlinkcreate():

    if (ops->newlink)
            err = ops->newlink(dev, &params, extack);
    else
            err = register_netdevice(dev);
    if (err < 0) {
            free_netdev(dev);
            goto out;
    }

and freenetdev() is called, causing a kvfree() on the struct netdevice that is still referenced in the source entry attached to the lower device's macvlan port.

Now all packets sent on the macvlan port with a matching source mac address will trigger a use-after-free in macvlanforwardsource().

</quote valis>

With all that, my fix is to make sure we call macvlanflushsources() regardless of @create value whenever "goto destroymacvlanport;" path is taken.

Many thanks to valis for following up on this issue.

Database specific
{
    "cna_assigner": "Linux",
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/23xxx/CVE-2026-23209.json"
}
References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
aa5fd0fb77486b8a6764ead8627baa14790e4280
Fixed
da5c6b8ae47e414be47e5e04def15b25d5c962dc
Fixed
5dae6b36a7cb7a4fcf4121b95e9ca7f96f816c8a
Fixed
c43d0e787cbba569ec9d11579ed370b50fab6c9c
Fixed
11ba9f0dc865136174cb98834280fb21bbc950c7
Fixed
986967a162142710076782d5b93daab93a892980
Fixed
cdedcd5aa3f3cb8b7ae0f87ab3a936d0bd583d66
Fixed
f8db6475a83649689c087a8f52486fcc53e627e9

Database specific

source
"https://storage.googleapis.com/osv-test-cve-osv-conversion/osv-output/CVE-2026-23209.json"