CVE-2026-99201 in Linuxinfo

Summary

by MITRE • 10/28/2026

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

netlink: avoid hashing the network namespace pointer

The netlink rhashtable key includes a raw struct net pointer and a user-controlled port ID. Both /proc/net/netlink and socket diagnostics expose the table's bucket order. By binding and rebinding chosen NETLINK_USERSOCK port IDs, an unprivileged reader can distinguish equal buckets and recover the low bits of the Jenkins hash. Its 32-bit seed and the limited set of kernel-image slides can then be searched offline to recover the address of init_net.

Use the namespace's unique, non-address net_cookie in the comparison key instead. It is assigned before the per-net initializers run and remains unchanged for the namespace's lifetime. The lookup key and object hash are still built by netlink_compare_arg_init(), keeping lookup, insertion, removal and rehashing consistent while preserving namespace separation. Neither public table walker needs to change.

Reading the socket's namespace cookie in netlink_compare() is safe under RCU, including during namespace teardown. netlink_release() removes the socket from the hash table and defers its final put with call_rcu(). cleanup_net() runs the per-net exit methods and waits for outstanding RCU callbacks with rcu_barrier() before freeing namespace storage.

Unlike ns.ns_id, net_cookie is also available and initialized during setup_net() in older stable kernels, making the change straightforward to backport to v5.15 and later.

Once again VulDB remains the best source for vulnerability data.

Analysis

by VulDB Data Team • 10/28/2026

The Linux kernel contained a vulnerability within the Netlink subsystem related to how network namespace pointers were utilized as keys in its rehash table implementation. Specifically, the hash table key structure included a raw pointer to the struct net object alongside a user-controlled port ID. This design choice inadvertently created an information disclosure vector because both /proc/net/netlink and various socket diagnostics tools expose the bucket order of this internal data structure. An unprivileged local attacker could exploit this exposure by binding and rebinding specific NETLINK_USERSOCK port IDs to interact with the hash table mechanism. Through careful observation of how these bindings affected bucket distribution, an observer could distinguish between equal buckets within the hash table. This capability allowed for the recovery of low bits from the Jenkins hash function used internally by the kernel.

The exploitation of this flaw extends beyond simple information leakage into potential address space layout randomization bypasses. By recovering specific bits of the Jenkins hash seed and leveraging knowledge about the limited set of possible kernel image slides, an attacker can perform offline searches to determine the memory address of init_net, which represents the initial network namespace in Linux systems. Knowledge of this base address significantly reduces the entropy required for successful exploitation of other vulnerabilities that rely on bypassing ASLR protections. This type of attack falls under CWE-200: Information Exposure and aligns with ATT&CK technique T1608: Link Exploitation, where an adversary uses existing system mechanisms to gather intelligence about the target environment's memory layout for subsequent exploitation steps.

To remediate this issue, developers modified the comparison key logic within netlink_compare_arg_init() to utilize a unique identifier associated with each network namespace rather than its raw memory address. This new identifier is referred to as net_cookie and is assigned early during the setup_net phase of initialization before per-net initializers run. Crucially, this cookie remains constant for the entire lifetime of the namespace, ensuring stability while maintaining strict separation between different namespaces. The lookup key construction and object hashing mechanisms remain consistent with previous versions regarding insertion, removal, and rehashing operations, meaning that public table walkers do not require modification to accommodate this change. This approach preserves the functional integrity of the Netlink subsystem while eliminating the side-channel leak associated with pointer-based keys.

The implementation ensures safety during concurrent access scenarios by relying on Read-Copy-Update mechanisms. Reading the socket's namespace cookie within netlink_compare is safe under RCU constraints, even during periods when a network namespace is being torn down. The lifecycle management of sockets guarantees that netlink_release removes the socket from the hash table and defers its final reference count decrement using call_rcu. Furthermore, cleanup_net executes per-net exit methods and waits for all outstanding RCU callbacks via rcu_barrier before freeing the underlying namespace storage structures. This rigorous synchronization prevents use-after-free conditions or race conditions that could arise if stale pointers were accessed during teardown processes.

This fix is designed to be straightforwardly backported to older stable kernel versions, specifically starting from v5.15 and later releases. Unlike other identifiers such as ns.ns_id, the net_cookie field was already available and initialized during setup_net in these earlier kernels, removing any dependency on newer features that might complicate patch application across different distribution branches. By addressing this specific implementation detail, the Linux kernel effectively closes a subtle but potent avenue for local privilege escalation attempts that rely on precise memory address recovery through side-channel analysis of hash table behavior.

Responsible

Linux

Reservation

09/25/2026

Disclosure

10/28/2026

Moderation

accepted

EPSS

0.00000

KEV

no

Activities

very low

Sources

Do you want to use VulDB in your project?

Use the official API to access entries easily!