Goal Reached Thanks to every supporter — we hit 100%!

Goal: 1000 CNY · Raised: 1359 CNY

100%

CVE-2026-99170— namespace: a mount that copy_tree() leaves out can't take over a lock

Quick assessment

Affected
Linux Linux
Exploitation
No confirmed in-the-wild exploitation; assess based on exposure
Recommended action
Check the vendor advisory and references for a fixed version. If immediate upgrade is impossible, restrict exposure and increase monitoring.

在 Linux 内核中,以下漏洞已被修复: 命名空间(namespace): 所遗漏的挂载点无法接管锁(lock) 自提交 ("move_mount: transfer MNT_LOCKED")以来,允许将一个挂载点移动到已被锁定的挂载点之下。此时,锁会从旧的“覆盖层”(cover)转移到新的挂载点上,由新挂载点承担隐藏其下方内容的职责,而旧的覆盖层随后可以被卸载。只要新挂载点保持存在,该机制就能正常工作。 然而,调用者负责选择新的挂载点,而 在复制时,若未指定 标志,则会遗漏掉挂载命名空间文件(mount nam

CVSS 8.8 · High EPSS 0.13% · P3

Affected Version Matrix 6

VendorProduct Version RangeStatus
Linux Linux c62a4766937edec2962d52e583276b459b739f2d< bd71d33923b9d6216bcee44331dd37142b0a8441 affected
c62a4766937edec2962d52e583276b459b739f2d< 69fbe94f80bc423613fa18dae6656757423732a2 affected
7.1 affected
< 7.1 unaffected
7.2.13≤ 7.2.* unaffected
7.3≤ * unaffected
Get alerts for future matching vulnerabilities Log in to subscribe

I. Basic Information for CVE-2026-99170

Vulnerability Information

Have questions about the vulnerability? See if Shenlong's analysis helps!
View Shenlong Deep Dive ↗

Although we use advanced large model technology, its output may still contain inaccurate or outdated information.Shenlong tries to ensure data accuracy, but please verify and judge based on the actual situation.

Vulnerability Title
namespace: a mount that copy_tree() leaves out can't take over a lock
Source: CVE Program / CVE List V5
Vulnerability Description
In the Linux kernel, the following vulnerability has been resolved: namespace: a mount that copy_tree() leaves out can't take over a lock Since commit c62a4766937e ("move_mount: transfer MNT_LOCKED") a mount can be moved beneath a locked mount. The lock moves from the old cover to the new mount which takes over the job of hiding what's under it and the old cover can be unmounted. That works as long as the new mount stays. But the caller picks the new mount and copy_tree() leaves a mount of a mount namespace file out of every copy made without CL_COPY_MNT_NS_FILE, together with everything mounted on it, and never looks at MNT_LOCKED. unshare(CLONE_NEWNS) and mount propagation make such copies. So a task that is root in its own user namespace gets rid of a locked cover on a file without a race and without touching the filesystem below it. It makes a child with a mount namespace of its own, binds the child's /proc/<pid>/ns/mnt beneath the cover with MOVE_MOUNT_BENEATH, which hands the lock to that bind, and calls unshare(CLONE_NEWNS). The new mount namespace has nothing on the file. That's the usual way to mask a single file, a bind of /dev/null or of an empty file. With a bind of an ordinary file the file stays covered. copy_tree() already refuses to leave out a locked unbindable mount with -EPERM since commit df7342b24018 ("mount: Don't allow copying MNT_UNBINDABLE|MNT_LOCKED mounts"). Do the same for a locked mount of a mount namespace file. That also covers a tree copied with CL_COPY_MNT_NS_FILE and attached into a mount namespace of another user namespace where lock_mnt_tree() locks it. Note that unshare(CLONE_NEWNS) and clone(CLONE_NEWNS) fail with EPERM from such a mount namespace from then on. The mount can't be left out and it can't be unmounted. And refuse to move a mount of a mount namespace file beneath a locked mount in the first place. Otherwise the task ends up with a mount it can't unmount and an unshare() that fails for good. Chris also found a second mount that goes away by itself, a clone of an automounted mount that shrink_submounts() took along with its parent. Commit f78ddcc87224 ("namespace: never expire a locked mount") took care of that one. Chris's reproducer is appended. Mode nsfile reads SECRET after the unshare() on 7.3-rc7, with this patch the move_mount() fails with EINVAL and the file stays covered. nsfile-control uses an ordinary file and reads MASK both ways. // SPDX-License-Identifier: GPL-2.0 /* * Get rid of a locked cover with MOVE_MOUNT_BENEATH. * * The "admin" (root) makes a tmpfs W: * W/D file, holds SECRET, covered by a bind of a file with MASK * W/Dd/inner file, holds SECRET, Dd is covered by a bind of a directory * whose "inner" holds MASK * W/own directory of uid 1000 with the file "mine" and the * directory "minedir", whose "inner" holds MINE * W/dbg debugfs, mode 755. dbg/tracing is an automount point * The "attacker" is uid 1000. It enters a new user namespace with a new mount * namespace, so W and both covers are locked there. * * usage: prog MODE * plain put a bind of own/mine beneath the cover of D, unmount the cover * nsfile put a bind of the mount namespace file of a child beneath the * cover of D, then unshare(CLONE_NEWNS) * nsfile-control the same with a bind of own/mine * shrink put a bind of the automounted tracefs beneath the cover of Dd, * unmount the cover, put a tmpfs beneath W, call umount(W), which fails * shrink-control the same with a bind of own/minedir * The environment variable AUTOMOUNT_DIR names another automount point for "shrink". */ #define _GNU_SOURCE #include <errno.h> #include <fcntl.h> #include <grp.h> #include <sched.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> ---truncated---
Source: CVE Program / CVE List V5
CVSS Information
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Source: CVE Program / CVE List V5
Vulnerability Type
N/A
Source: CVE Program / CVE List V5

Affected Products

Vendor Product Affected Versions CPE Subscribe
Linux Linux c62a4766937edec2962d52e583276b459b739f2d ~ bd71d33923b9d6216bcee44331dd37142b0a8441 -
Linux Linux 7.1 -

II. Public POCs for CVE-2026-99170

# POC Description Source Link Shenlong Link
AI-Generated POC Premium

No public POC found.

Login to generate AI POC

III. Intelligence Information for CVE-2026-99170

请登录查看更多情报信息。

Patches & Fixes for CVE-2026-99170 (2)

Same Patch Batch · Linux · 2026-10-28 · 117 CVEs total

CVE-2026-99153 9.8 CRITICAL scsi: libiscsi: Validate the ITT reflected in a Reject PDU
CVE-2026-99154 9.8 CRITICAL scsi: libiscsi: Reject a negative task index from parse_pdu_itt
CVE-2026-99185 8.8 HIGH firewire: core: fix race condition in split transaction handling
CVE-2026-99216 8.4 HIGH Drivers: hv: Don't reset VMBus connection state on error/exit paths
CVE-2026-99131 8.2 HIGH xfs: fix capability check in xfs
CVE-2026-99117 7.8 HIGH net: bridge: mcast: don't truncate the port group walk on teardown
CVE-2026-99116 7.8 HIGH net: psp: do not inherit the Rx association on clone
CVE-2026-99163 7.8 HIGH tracing/histograms: Reject non-stacktrace fields for synthetic stacktrace fields
CVE-2026-99143 7.8 HIGH tracing: Keep the predicate limit separate from program capacity
CVE-2026-99164 7.8 HIGH spi: imx: fix slab corruption from undersized DMA bounce buffers
CVE-2026-99109 7.8 HIGH smb: client: reject SetEA requests that do not fit the request buffer
CVE-2026-99167 7.8 HIGH net/sched: fix use-after-free in __tcf_action_put()
CVE-2026-99177 7.8 HIGH KVM: SEV: Fix page dirtying in sev_gmem_post_populate()
CVE-2026-99213 7.8 HIGH vsock: treat TCP_CLOSING as once-established
CVE-2026-99173 7.8 HIGH eventfs: Free the eventfs_inode after an rcu grace period too
CVE-2026-99203 7.8 HIGH pipe: preserve existing fasync readers on writer setup failure
CVE-2026-99156 7.8 HIGH scsi: st: Fix use-after-free race between st_remove() and st_open()
CVE-2026-99107 7.8 HIGH ntfs: fix incorrect MFT record pointer passed to ntfs_attr_record_resize
CVE-2026-99180 7.8 HIGH unicode: free the map after a grace period
CVE-2026-99152 7.5 HIGH scsi: libiscsi: Validate the task named by a management response

Showing top 20 of 117 CVEs. View all on vendor page &rarr; →

IV. Related Vulnerabilities