---
id: CVE-2026-98982
title: 'namespace: don''t let a pseudo dentry become the root of a mount'
summary: |-
  In the Linux kernel, the following vulnerability has been resolved:

  namespace: don't let a pseudo dentry become the root of a mount

  d_alloc_pseudo() hands out dentries for pipes, sockets and other files
  that are never anyone's child or…
severity: high
cvss: 7.8
cvssVector: 'CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H'
cvssSource: cna
vendor: Linux
product: Linux
affected:
  - >-
    Linux >= 35f96de04127d332a5c5e8a155d31f452f88c76d <
    a256e31e0c54c4c37d2523aa52faabdcdd2ebc07
  - >-
    Linux >= 35f96de04127d332a5c5e8a155d31f452f88c76d <
    7e1c466011ba9e64d43075396badc03191bcee44
  - >-
    Linux >= 35f96de04127d332a5c5e8a155d31f452f88c76d <
    00287afa7cd989efdbf5822b7efac33cce7d489a
  - >-
    Linux >= 35f96de04127d332a5c5e8a155d31f452f88c76d <
    b138e16fb1e81376cea89f727dda7bfccd140de4
  - Linux 6.9
published: '2026-10-23'
updated: '2026-10-24'
sourceUpdated: '2026-10-24T14:09:50.745Z'
source: CVEORG
sourceUrl: 'https://www.cve.org/CVERecord?id=CVE-2026-98982'
references:
  - url: 'https://git.kernel.org/stable/c/a256e31e0c54c4c37d2523aa52faabdcdd2ebc07'
  - url: 'https://git.kernel.org/stable/c/7e1c466011ba9e64d43075396badc03191bcee44'
  - url: 'https://git.kernel.org/stable/c/00287afa7cd989efdbf5822b7efac33cce7d489a'
  - url: 'https://git.kernel.org/stable/c/b138e16fb1e81376cea89f727dda7bfccd140de4'
tags:
  - cve.org
epss: 0.00209
epssPercentile: 0.10522
ingestedAt: '2026-10-23T13:24:55.548Z'
---

## Overview

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

namespace: don't let a pseudo dentry become the root of a mount

d_alloc_pseudo() hands out dentries for pipes, sockets and other files
that are never anyone's child or parent. They carry DCACHE_NORCU and
dentry_free() frees them right away because no lockless path walk can
ever reach them. That holds as long as such a dentry isn't the root of
a mount. But bind mounting /proc/self/fd/<fd> of such a file does
exactly that.

Most callers of alloc_file_pseudo() put their files on kernel-internal
mounts and may_copy_tree() refuses those. bpf_token_create() doesn't. It
places the token file on the bpffs mount the caller handed it and that
mount is in the caller's mount namespace so the clone goes through:

  mount --bind /proc/self/fd/<token> <file>
  open_tree(tokfd, "", AT_EMPTY_PATH | OPEN_TREE_CLONE) + move_mount()

__follow_mount_rcu() then loads ->mnt_root of that mount, reads d_seq
and d_flags of the dentry and only then checks mount_lock. The dentry
can be gone by then. The final mntput() of an unmounted parent unhooks
a child that stayed attached to it under mount_lock alone. When the
child's holder does the final put right after that the root is dput()
and freed immediately while a walker that found the mount hashed still
looks at it.

Refuse to clone a mount with a DCACHE_NORCU dentry as its root. Nothing
sensible can be done with a bind mount of a bpf token anyway.

## Affected

- `Linux >= 35f96de04127d332a5c5e8a155d31f452f88c76d < a256e31e0c54c4c37d2523aa52faabdcdd2ebc07`
- `Linux >= 35f96de04127d332a5c5e8a155d31f452f88c76d < 7e1c466011ba9e64d43075396badc03191bcee44`
- `Linux >= 35f96de04127d332a5c5e8a155d31f452f88c76d < 00287afa7cd989efdbf5822b7efac33cce7d489a`
- `Linux >= 35f96de04127d332a5c5e8a155d31f452f88c76d < b138e16fb1e81376cea89f727dda7bfccd140de4`
- `Linux 6.9`

## Remediation

Refer to the linked advisories for vendor-supplied fixes and affected version ranges.
