CVE-2026-23209

In the Linux kernel, the following vulnerability has been resolved: macvlan: fix error recovery in macvlan_common_newlink() 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 MACVLAN_MODE_SOURCE mode and MACVLAN_MACADDR_ADD (or MACVLAN_MACADDR_SET) parameter, lower device already has a macvlan port and register_netdevice() called from macvlan_common_newlink() fails (e.g. because of the invalid link name). In this case macvlan_hash_add_source is called from macvlan_change_sources() / macvlan_common_newlink(): This adds a reference to vlan to the port's vlan_source_hash using macvlan_source_entry. vlan is a pointer to the priv data of the link that is being created. When register_netdevice() fails, the error is returned from macvlan_newlink() to rtnl_newlink_create(): if (ops->newlink) err = ops->newlink(dev, &params, extack); else err = register_netdevice(dev); if (err < 0) { free_netdev(dev); goto out; } and free_netdev() is called, causing a kvfree() on the struct net_device 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 macvlan_forward_source(). </quote valis> With all that, my fix is to make sure we call macvlan_flush_sources() regardless of @create value whenever "goto destroy_macvlan_port;" path is taken. Many thanks to valis for following up on this issue.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:4.9:-:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:4.9:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:4.9:rc7:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:4.9:rc8:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc7:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc8:*:*:*:*:*:*

History

18 Mar 2026, 20:46

Type Values Removed Values Added
CPE cpe:2.3:o:linux:linux_kernel:4.9:-:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:4.9:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:4.9:rc7:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:4.9:rc8:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc8:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:rc7:*:*:*:*:*:*
First Time Linux
Linux linux Kernel
CWE CWE-416
CVSS v2 : unknown
v3 : unknown
v2 : unknown
v3 : 7.8
References () https://git.kernel.org/stable/c/11ba9f0dc865136174cb98834280fb21bbc950c7 - () https://git.kernel.org/stable/c/11ba9f0dc865136174cb98834280fb21bbc950c7 - Patch
References () https://git.kernel.org/stable/c/5dae6b36a7cb7a4fcf4121b95e9ca7f96f816c8a - () https://git.kernel.org/stable/c/5dae6b36a7cb7a4fcf4121b95e9ca7f96f816c8a - Patch
References () https://git.kernel.org/stable/c/986967a162142710076782d5b93daab93a892980 - () https://git.kernel.org/stable/c/986967a162142710076782d5b93daab93a892980 - Patch
References () https://git.kernel.org/stable/c/c43d0e787cbba569ec9d11579ed370b50fab6c9c - () https://git.kernel.org/stable/c/c43d0e787cbba569ec9d11579ed370b50fab6c9c - Patch
References () https://git.kernel.org/stable/c/cdedcd5aa3f3cb8b7ae0f87ab3a936d0bd583d66 - () https://git.kernel.org/stable/c/cdedcd5aa3f3cb8b7ae0f87ab3a936d0bd583d66 - Patch
References () https://git.kernel.org/stable/c/da5c6b8ae47e414be47e5e04def15b25d5c962dc - () https://git.kernel.org/stable/c/da5c6b8ae47e414be47e5e04def15b25d5c962dc - Patch
References () https://git.kernel.org/stable/c/f8db6475a83649689c087a8f52486fcc53e627e9 - () https://git.kernel.org/stable/c/f8db6475a83649689c087a8f52486fcc53e627e9 - Patch

18 Feb 2026, 17:52

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta: macvlan: arreglar la recuperación de errores en macvlan_common_newlink() valis proporcionó una buena reproducción para colapsar el 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 También proporcionó un análisis muy detallado: 'El problema se activa cuando se crea un nuevo enlace macvlan con el modo MACVLAN_MODE_SOURCE y el parámetro MACVLAN_MACADDR_ADD (o MACVLAN_MACADDR_SET), el dispositivo inferior ya tiene un puerto macvlan y register_netdevice() llamado desde macvlan_common_newlink() falla (por ejemplo, debido al nombre de enlace no válido). En este caso, macvlan_hash_add_source es llamado desde macvlan_change_sources() / macvlan_common_newlink(): Esto añade una referencia a vlan al vlan_source_hash del puerto usando macvlan_source_entry. vlan es un puntero a los datos privados del enlace que se está creando. Cuando register_netdevice() falla, el error es devuelto desde macvlan_newlink() a rtnl_newlink_create(): if (ops-&gt;newlink) err = ops-&gt;newlink(dev, &amp;params, extack); else err = register_netdevice(dev); if (err &lt; 0) { free_netdev(dev); goto out; } y se llama a free_netdev(), causando un kvfree() en la estructura net_device que todavía está referenciada en la entrada de origen adjunta al puerto macvlan del dispositivo inferior. Ahora, todos los paquetes enviados en el puerto macvlan con una dirección MAC de origen coincidente activarán un uso después de liberación en macvlan_forward_source().' Con todo eso, mi solución es asegurarme de que llamamos a macvlan_flush_sources() independientemente del valor de @create cada vez que se toma la ruta "goto destroy_macvlan_port;". Muchas gracias a valis por hacer seguimiento de este problema.

14 Feb 2026, 17:15

Type Values Removed Values Added
New CVE

Information

Published : 2026-02-14 17:15

Updated : 2026-04-03 14:16


NVD link : CVE-2026-23209

Mitre link : CVE-2026-23209

CVE.ORG link : CVE-2026-23209


JSON object : View

Products Affected

linux

  • linux_kernel
CWE
CWE-416

Use After Free