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

exit: hold a reference to thread_pid across proc_flush_pid

Commit 0a36bad01731 ("release_task: kill the no longer needed
get/put_pid(thread_pid)") removed the reference around proc_flush_pid().
It assumed that free_pids(post.pids) at the end of release_task() would
keep thread_pid alive until then.

That assumption is wrong. __change_pid() only records a detached PID in
post.pids when pid_has_task() is false for every PIDTYPE. If another task
still uses the exiting task's PID as its process group or session ID,
__unhash_process() removes the exiting task's PIDTYPE_PID link but leaves
the PID out of post.pids. release_task() therefore holds no reference to
it after dropping tasklist_lock.

The other task can then remove the remaining PIDTYPE links. Its
free_pids() call schedules delayed_put_pid(), and the RCU callback can free
the PID before the first release_task() reaches proc_flush_pid().

An unprivileged reproducer races wait4(-1) against setsid() to trigger this
ordering. Three of three fresh v7.2 KASAN boots reported:

BUG: KASAN: slab-use-after-free in
proc_invalidate_siblings_dcache+0x3e2/0x3f0
Read of size 8 by task h7_pid_reaper/1921

Call Trace:
proc_invalidate_siblings_dcache
release_task
wait_consider_task
__do_wait
do_wait
kernel_wait4

Freed by task 0:
kmem_cache_free
put_pid
delayed_put_pid
rcu_core

Last potentially related work creation:
__call_rcu_common
free_pids
ksys_setsid

KASAN identified a 144-byte object from the pid cache and located the bad
read 80 bytes into the freed object, matching pid->inodes. With an
explicit reference, three of three fresh boots completed without a KASAN
report. The concurrent RCU callback dropped its reference while
proc_flush_pid() was protected, and the balancing put_pid() performed the
final free afterward.

Take a reference before __unhash_process() clears p->thread_pid and release
it after proc_flush_pid() completes.

A tested source reproducer is available privately on request. No
controlled read or write, information leak, or privilege escalation is
claimed. The mainline patch applies directly to v6.19.y and newer;
v6.16.y through v6.18.y need a context-adjusted backport.
Published: 2026-09-25
Score: 7.8 High
EPSS: < 1% Very Low
KEV: No
Impact: Kernel Crash (Denial of Service)
Action: Patch Immediately
AI Analysis

Impact

The Linux kernel contains a use‑after‑free bug (CWE-825) involving the thread_pid reference during process teardown. A recent commit removed the reference to thread_pid when calling proc_flush_pid(), but the reference may already be freed by a concurrent RCU callback. The race between wait4(-1) and setsid() can trigger this oversight, resulting in a KASAN‑detected read of a freed pid cache object and a kernel crash. No privilege escalation or data leak can be achieved; the flaw primarily causes a denial‑of‑service.

Affected Systems

Vulnerable kernels include Linux kernel releases prior to 6.19, as well as the 6.16.y through 6.18.y series before the backport of the fix. The patch is included in the mainline v6.19 and newer kernels. Systems running older releases, whether built from source or packaged by distributions, require a backport of the commit or a distribution update that applies the same change.

Risk and Exploitability

The CVSS score of 7.8 indicates high severity, and the EPSS score of < 1% indicates a very low exploitation probability. The KEV status is not listed, meaning no known active exploitation is reported. The flaw can be triggered locally by any unprivileged user on vulnerable kernels, providing a straightforward denial‑of‑service vector. No privilege escalation or data leak can be achieved; the risk is limited to availability and system stability. The ability to crash the kernel still represents a moderate to high impact for environments that cannot tolerate downtime.

Generated by OpenCVE AI on October 1, 2026 at 10:05 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Apply the official patch from the Linux kernel repository (commit 0a36bad01731) to clear the thread_pid reference before and after proc_flush_pid().
  • If running a kernel version between 6.16.y and 6.18.y, backport the patch or install a distribution security update that includes the same change.
  • After making the change, reboot the system so that all old PID references are fully cleared before the next boot.
  • Enable kernel memory corruption detection such as KASAN or similar tools to surface the issue early and monitor system logs for use‑after‑free indicators.

Generated by OpenCVE AI on October 1, 2026 at 10:05 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Thu, 01 Oct 2026 08:15:00 +0000

Type Values Removed Values Added
Weaknesses CWE-362
CWE-416

Wed, 30 Sep 2026 00:15:00 +0000


Fri, 25 Sep 2026 15:00:00 +0000

Type Values Removed Values Added
Metrics cvssV3_1

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


Fri, 25 Sep 2026 14:45:00 +0000

Type Values Removed Values Added
Weaknesses CWE-362
CWE-416

Fri, 25 Sep 2026 10:30:00 +0000

Type Values Removed Values Added
Description In the Linux kernel, the following vulnerability has been resolved: exit: hold a reference to thread_pid across proc_flush_pid Commit 0a36bad01731 ("release_task: kill the no longer needed get/put_pid(thread_pid)") removed the reference around proc_flush_pid(). It assumed that free_pids(post.pids) at the end of release_task() would keep thread_pid alive until then. That assumption is wrong. __change_pid() only records a detached PID in post.pids when pid_has_task() is false for every PIDTYPE. If another task still uses the exiting task's PID as its process group or session ID, __unhash_process() removes the exiting task's PIDTYPE_PID link but leaves the PID out of post.pids. release_task() therefore holds no reference to it after dropping tasklist_lock. The other task can then remove the remaining PIDTYPE links. Its free_pids() call schedules delayed_put_pid(), and the RCU callback can free the PID before the first release_task() reaches proc_flush_pid(). An unprivileged reproducer races wait4(-1) against setsid() to trigger this ordering. Three of three fresh v7.2 KASAN boots reported: BUG: KASAN: slab-use-after-free in proc_invalidate_siblings_dcache+0x3e2/0x3f0 Read of size 8 by task h7_pid_reaper/1921 Call Trace: proc_invalidate_siblings_dcache release_task wait_consider_task __do_wait do_wait kernel_wait4 Freed by task 0: kmem_cache_free put_pid delayed_put_pid rcu_core Last potentially related work creation: __call_rcu_common free_pids ksys_setsid KASAN identified a 144-byte object from the pid cache and located the bad read 80 bytes into the freed object, matching pid->inodes. With an explicit reference, three of three fresh boots completed without a KASAN report. The concurrent RCU callback dropped its reference while proc_flush_pid() was protected, and the balancing put_pid() performed the final free afterward. Take a reference before __unhash_process() clears p->thread_pid and release it after proc_flush_pid() completes. A tested source reproducer is available privately on request. No controlled read or write, information leak, or privilege escalation is claimed. The mainline patch applies directly to v6.19.y and newer; v6.16.y through v6.18.y need a context-adjusted backport.
Title exit: hold a reference to thread_pid across proc_flush_pid
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 Kernel
cve-icon MITRE

Status: PUBLISHED

Assigner: Linux

Published:

Updated: 2026-10-19T09:10:29.542Z

Reserved: 2026-09-25T10:18:58.200Z

Link: CVE-2026-97903

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-09-25T11:17:17.150

Modified: 2026-10-19T10:17:40.527

Link: CVE-2026-97903

cve-icon Redhat

Severity : Moderate

Publid Date: 2026-09-25T00:00:00Z

Links: CVE-2026-97903 - Bugzilla

cve-icon OpenCVE Enrichment

Updated: 2026-10-01T10:15:06Z

Weaknesses
  • CWE-825

    Expired Pointer Dereference