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

readdir: take no inode lock on an immutable directory

iterate_dir() takes the directory's i_rwsem shared and holds it across
->iterate_shared(). For a directory that never has an entry and is
never removed the lock keeps nothing still, it only orders every reader
and every writer of that inode behind each other.

For the directory of a nullfs instance that matters. The instance of
the initial mount namespace is the root of every empty mount namespace
and the private instance is the root of every kernel thread, so one
inode is shared across users who have nothing else in common. And a
reader can hold the lock for as long as it likes: back the getdents()
buffer with a mapping of a file on a FUSE mount of your own, let the
copy of "." and ".." fault and let the server wait. Queue an exclusive
taker behind it, a mkdir() in that directory goes through start_dirop()
before the read-only mount is reported, and from then on every lookup
that misses the dcache in that directory, every create and every mount
on it waits until the server answers. One user of an empty mount
namespace stalls all the others.

Add FOP_IMMUTABLE for the file operations of a directory that never
changes and is never removed and let iterate_dir() skip the lock for
it. The flag never changes for a file, ->f_pos is protected by
f_pos_lock since directories are FMODE_ATOMIC_POS, IS_DEADDIR can't be
set on such a directory and neither touch_atime() nor fsnotify take
i_rwsem. Set it on the nullfs directory. The placeholder directories of
libfs never have an entry either but their owners remove them, so they
keep the lock.
Published: 2026-10-23
Score: 5.5 Medium
EPSS: < 1% Very Low
KEV: No
Impact: Denial of Service via lock contention
Action: Apply Patch
AI Analysis

Impact

The vulnerability arises in the Linux kernel's readdir implementation for immutable directories without entries. During a getdents operation the code acquires a shared inode lock and holds it for the entire read. Because the directory never changes this lock is never released until the read completes, causing any other reader, writer or lookup on that inode to block. The result is a denial of service where a single user or process holding the lock can stall all other users or kernel threads sharing the same inode. This issue maps to CWE-412, a lock‑misuse weakness that serializes concurrent operations.

Affected Systems

The affected systems include any Linux kernel that implements the early iterate_dir logic for immutable directories, notably the Nullfs and Libfs placeholder directories. The CVE does not specify an exact version range, but the issue applies to kernel releases prior to the commit that introduces the FOP_IMMUTABLE guard for empty directories. Administrators should verify that their running kernel contains that commit and, if not, upgrade to a kernel version where the fix is deployed. The vulnerability specifically concerns empty immutable directories that are shared across users or mount namespaces.

Risk and Exploitability

The CVSS score of 5.5 indicates moderate severity, while the EPSS score of less than 1% suggests a low probability of exploitation. The vulnerability is not listed in the CISA KEV catalog. Exploitation requires a local user to perform a read on an empty immutable directory that is reachable from the attacker’s namespace. Once the read begins, the attacker can hold the lock for an arbitrarily long period, blocking other operations such as mkdir, lookup or mount on the same inode. Because the affected directories are uncommon and the lock is held only for read duration, widespread exploitation is unlikely, but in environments that use shared empty immutable directories the denial of service impact can be significant.

Generated by OpenCVE AI on October 27, 2026 at 19:01 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade the Linux kernel to a version containing the FOP_IMMUTABLE guard for empty immutable directories, which ensures that iterate_dir skips the lock in these cases.
  • Avoid creating immutable empty directories that are shared across users or mount namespaces; if such directories are required, add at least one entry to prevent lock retention.
  • If a process appears to hold the inode lock on an empty immutable directory for an extended period, terminate or restart that process so the lock is released.
  • As an interim measure, clear the immutable attribute on any empty directories until the kernel update is applied.

Generated by OpenCVE AI on October 27, 2026 at 19:01 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Tue, 27 Oct 2026 15:15:00 +0000

Type Values Removed Values Added
Weaknesses CWE-399

Tue, 27 Oct 2026 12:30:00 +0000

Type Values Removed Values Added
Weaknesses CWE-412
References
Metrics threat_severity

None

cvssV3_1

{'score': 5.5, 'vector': 'CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H'}

threat_severity

Moderate


Sat, 24 Oct 2026 00:30:00 +0000

Type Values Removed Values Added
First Time appeared Linux linux
Vendors & Products Linux linux

Fri, 23 Oct 2026 17:30:00 +0000

Type Values Removed Values Added
Weaknesses CWE-399

Fri, 23 Oct 2026 13:00:00 +0000

Type Values Removed Values Added
Description In the Linux kernel, the following vulnerability has been resolved: readdir: take no inode lock on an immutable directory iterate_dir() takes the directory's i_rwsem shared and holds it across ->iterate_shared(). For a directory that never has an entry and is never removed the lock keeps nothing still, it only orders every reader and every writer of that inode behind each other. For the directory of a nullfs instance that matters. The instance of the initial mount namespace is the root of every empty mount namespace and the private instance is the root of every kernel thread, so one inode is shared across users who have nothing else in common. And a reader can hold the lock for as long as it likes: back the getdents() buffer with a mapping of a file on a FUSE mount of your own, let the copy of "." and ".." fault and let the server wait. Queue an exclusive taker behind it, a mkdir() in that directory goes through start_dirop() before the read-only mount is reported, and from then on every lookup that misses the dcache in that directory, every create and every mount on it waits until the server answers. One user of an empty mount namespace stalls all the others. Add FOP_IMMUTABLE for the file operations of a directory that never changes and is never removed and let iterate_dir() skip the lock for it. The flag never changes for a file, ->f_pos is protected by f_pos_lock since directories are FMODE_ATOMIC_POS, IS_DEADDIR can't be set on such a directory and neither touch_atime() nor fsnotify take i_rwsem. Set it on the nullfs directory. The placeholder directories of libfs never have an entry either but their owners remove them, so they keep the lock.
Title readdir: take no inode lock on an immutable directory
First Time appeared Linux
Linux linux Kernel
CPEs cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
Vendors & Products Linux
Linux linux Kernel
References

Subscriptions

Linux Linux Linux Kernel
cve-icon MITRE

Status: PUBLISHED

Assigner: Linux

Published:

Updated: 2026-10-23T12:45:02.631Z

Reserved: 2026-09-25T10:25:14.390Z

Link: CVE-2026-99084

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-10-23T13:17:32.693

Modified: 2026-10-23T13:17:32.693

Link: CVE-2026-99084

cve-icon Redhat

Severity : Moderate

Publid Date: 2026-10-23T00:00:00Z

Links: CVE-2026-99084 - Bugzilla

cve-icon OpenCVE Enrichment

Updated: 2026-10-27T19:15:08Z

Weaknesses
  • CWE-412

    Unrestricted Externally Accessible Lock