KernelScan.io

HIGH

ipvlan Address Lock Race

CVE-2026-23103

CVSS 7.8 / 10.0 NVD

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

KernelScan AI7.8HIGH

01

In the Linux kernel, the following vulnerability has been resolved: ipvlan: Make the addrs_lock be per port Make the addrs_lock be per port, not per ipvlan dev. Initial code seems to be written in the assumption, that any address change must occur under RTNL. But it is not so for the case of IPv6. So 1) Introduce per-port addrs_lock. 2) It was needed to fix places where it was forgotten to take lock (ipvlan_open/ipvlan_close) This appears to be a very minor problem though. Since it's highly unlikely that ipvlan_add_addr() will be called on 2 CPU simultaneously. But nevertheless, this could cause: 1) False-negative of ipvlan_addr_busy(): one interface iterated through all port->ipvlans + ipvlan->addrs under some ipvlan spinlock, and another added IP under its own lock. Though this is only possible for IPv6, since looks like only ipvlan_addr6_event() can be called without rtnl_lock. 2) Race since ipvlan_ht_addr_add(port) is called under different ipvlan->addrs_lock locks This should not affect performance, since add/remove IP is a rare situation and spinlock is not taken on fast paths.

02

Engine v0.2.0

Risk summary

A race condition in the ipvlan driver's address management could allow duplicate IP addresses to be assigned to different ipvlan interfaces on the same port, potentially causing network routing issues, packet misdirection, or denial of service. While the window for exploitation is narrow, it could lead to network connectivity problems in containerized or virtualized environments using ipvlan.

Affecteddrivers/net/ipvlan

Vulnerability analysis

Root Cause: The ipvlan driver had per-device address locks (addrs_lock) instead of per-port locks, creating a race condition where multiple ipvlan devices on the same port could simultaneously modify the shared address hash table. The original code assumed all address changes would occur under RTNL lock, but IPv6 address events (ipvlan_addr6_event) can occur without RTNL protection. This led to two specific race scenarios: (1) False-negative results from ipvlan_addr_busy() when one thread iterates the address list under one device's lock while another adds an IP under a different device's lock, and (2) Race conditions in ipvlan_ht_addr_add() calls since they were protected by different per-device locks rather than a unified per-port lock.

Attack Surface: This vulnerability affects systems using ipvlan network interfaces, particularly in scenarios with IPv6 autoconfiguration or rapid address changes. The race condition is most likely to manifest on multi-CPU systems under high network activity or when multiple ipvlan devices share the same physical port. Local access is required to create ipvlan interfaces and trigger address events.

Fix Mechanism: The patch moves the addrs_lock from per-device (struct ipvl_dev) to per-port (struct ipvl_port) scope, ensuring all address operations on a port are serialized under a single lock. It also adds missing lock acquisition in ipvlan_open/ipvlan_close functions and updates ipvlan_find_addr() to use direct list traversal under the lock instead of RCU read-side protection. The validator functions now properly acquire the port lock before checking address conflicts.

03

BranchFixed inPatch commit
5.105.10.2493c149b662cbb
5.155.15.19970feb16e3fbf
6.16.1.16288f83e6c9cdb
6.126.12.681f300c10d92c
6.186.18.86a81e2db0969
6.66.6.12204ba6de6eff6
mainline6.19d3ba32162488