{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2025-21659", "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "state": "PUBLISHED", "assignerShortName": "Linux", "dateReserved": "2024-12-29T08:45:45.732Z", "datePublished": "2025-01-21T12:18:15.407Z", "dateUpdated": "2026-08-05T11:53:25.796Z" }, "containers": { "cna": { "providerMetadata": { "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "shortName": "Linux", "dateUpdated": "2026-08-05T11:53:25.796Z" }, "descriptions": [ { "lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nnetdev: prevent accessing NAPI instances from another namespace\n\nThe NAPI IDs were not fully exposed to user space prior to the netlink\nAPI, so they were never namespaced. The netlink API must ensure that\nat the very least NAPI instance belongs to the same netns as the owner\nof the genl sock.\n\nnapi_by_id() can become static now, but it needs to move because of\ndev_get_by_napi_id()." } ], "metrics": [ { "cvssV3_1": { "version": "3.1", "vectorString": "CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:L/I:H/A:H", "baseScore": 8.1, "baseSeverity": "HIGH" }, "scenarios": [ { "lang": "en", "value": "AV:L - The vulnerability is reached through a generic-netlink socket (NETDEV family, NAPI_GET/NAPI_SET commands), which requires local execution on the target system. No remote or adjacent network path exists.\nAC:L - NAPI IDs are allocated sequentially from a small base (napi_gen_id starting at NR_CPUS, floor MIN_NAPI_ID), so an attacker can exhaustively enumerate every NAPI instance on the system in a trivial loop; there is no race, no memory-layout dependency, and the result is fully deterministic.\nPR:H - The read/info-leak path (NETDEV_CMD_NAPI_GET) needs no privileges at all, but the highest-impact path (NETDEV_CMD_NAPI_SET) is gated by GENL_ADMIN_PERM, which resolves to netlink_capable() against init_user_ns — i.e. real CAP_NET_ADMIN that cannot be obtained via unshare -Urn. This is routinely held by netns-confined containers and sandboxes (CNI plugins, VPN sidecars, ip netns exec, PrivateNetwork services) that are nonetheless meant to be isolated from the host's devices.\nUI:N - The attacker sends netlink messages entirely on their own; no victim action, mount, or file open is needed.\nS:C - The network namespace is the security authority that decides which net devices a process may observe and configure, and this bug lets a process confined to one netns read and reconfigure NAPI instances belonging to devices in the host or another tenant's netns. The impacted resources lie outside the vulnerable component's security scope, i.e. a sandbox/container boundary escape.\nC:L - netdev_nl_napi_fill_one() discloses a bounded but real set of cross-namespace data — the foreign device's ifindex, its hardware IRQ number, the NAPI kernel thread's PID in the init pid namespace, and all NAPI tunables — which leaks host topology and PID information into an isolated namespace. It is a limited, structured leak rather than an arbitrary memory read.\nI:H - netdev_nl_napi_set_config() lets the attacker write defer_hard_irqs, gro_flush_timeout and irq_suspend_timeout on every NAPI instance in the system, including the host's physical NICs — total control of that configuration surface across the namespace boundary, with direct and serious consequences for the impacted devices.\nA:H - Setting a large defer_hard_irqs together with a huge gro_flush_timeout makes napi_complete_done() return false so the driver never re-arms hardware interrupts, while napi->timer is armed far in the future — the targeted NIC's receive path stops being serviced, producing a complete network outage on the host or a co-tenant namespace from inside an isolated container." } ] } ], "affected": [ { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "net/core/dev.c", "net/core/dev.h", "net/core/netdev-genl.c" ], "versions": [ { "version": "27f91aaf49b3a50e5a02ad5fa27b7c453d029a72", "lessThan": "b683ba0df11ff563cc237eb1b74d6adfa77226bf", "status": "affected", "versionType": "git" }, { "version": "27f91aaf49b3a50e5a02ad5fa27b7c453d029a72", "lessThan": "d1cacd74776895f6435941f86a1130e58f6dd226", "status": "affected", "versionType": "git" } ] }, { "product": "Linux", "vendor": "Linux", "defaultStatus": "affected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "net/core/dev.c", "net/core/dev.h", "net/core/netdev-genl.c" ], "versions": [ { "version": "6.8", "status": "affected" }, { "version": "0", "lessThan": "6.8", "status": "unaffected", "versionType": "semver" }, { "version": "6.12.10", "lessThanOrEqual": "6.12.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.13", "lessThanOrEqual": "*", "status": "unaffected", "versionType": "original_commit_for_fix" } ] } ], "cpeApplicability": [ { "nodes": [ { "operator": "OR", "negate": false, "cpeMatch": [ { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.8", "versionEndExcluding": "6.12.10" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.8", "versionEndExcluding": "6.13" } ] } ] } ], "references": [ { "url": "https://git.kernel.org/stable/c/b683ba0df11ff563cc237eb1b74d6adfa77226bf" }, { "url": "https://git.kernel.org/stable/c/d1cacd74776895f6435941f86a1130e58f6dd226" } ], "title": "netdev: prevent accessing NAPI instances from another namespace", "x_generator": { "engine": "bippy-1.2.0" } } } }