{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2025-38352","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2025-04-16T04:51:24.006Z","datePublished":"2025-07-22T08:04:25.277Z","dateUpdated":"2026-09-08T15:32:28.302Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-08-05T12:01:20.234Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nposix-cpu-timers: fix race between handle_posix_cpu_timers() and posix_cpu_timer_del()\n\nIf an exiting non-autoreaping task has already passed exit_notify() and\ncalls handle_posix_cpu_timers() from IRQ, it can be reaped by its parent\nor debugger right after unlock_task_sighand().\n\nIf a concurrent posix_cpu_timer_del() runs at that moment, it won't be\nable to detect timer->it.cpu.firing != 0: cpu_timer_task_rcu() and/or\nlock_task_sighand() will fail.\n\nAdd the tsk->exit_state check into run_posix_cpu_timers() to fix this.\n\nThis fix is not needed if CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y, because\nexit_task_work() is called before exit_notify(). But the check still\nmakes sense, task_work_add(&tsk->posix_cputimers_work.work) will fail\nanyway in this case."}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:L - The vulnerability is reached purely through local syscalls — `timer_create`/`timer_settime`/`timer_delete` (or `clock_nanosleep`) plus `ptrace`/`waitpid` to control task reaping — with the trigger arriving via the local timer tick. There is no network-facing path into posix-cpu-timers.\nAC:L - The attacker controls both sides of the race: it arms the CPU timer expiry, chooses the precise moment of `release_task()` by calling `waitpid()` from its own parent/tracer, and issues the concurrent `timer_delete()` from a sibling thread — retryable in a tight loop and widenable by queueing up to 20 timers on the firing list. Real-world exploitation of this exact bug confirms it is reliably winnable.\nPR:L - No capability or permission check exists anywhere on the path — `validate_clock_permissions()`/`pid_for_clock()` gate only on thread-group/pid existence, and `grep` for `capable`/`CAP_` in both posix-timers files returns nothing. Any unprivileged local user, including a seccomp-confined Android app UID, can reach it.\nUI:N - The attacker's own processes and threads perform every step — creating the timer, exiting the traced thread, reaping it, and deleting the timer. No victim action of any kind is needed.\nS:U - The use-after-free corrupts kernel heap objects and escalates within the kernel's own security authority, which is standard kernel privilege escalation. No hypervisor, IOMMU, or other security-authority boundary is crossed.\nC:H - The freed `struct sigqueue` is linked into the signal pending list by `send_sigqueue()` and later copied out to userspace through `dequeue_signal()`/`rt_sigtimedwait()`, disclosing whatever now occupies the reclaimed slab object — an effectively arbitrary kernel-memory read. The `do_cpu_nanosleep()` variant additionally exposes reclaimed kernel stack.\nI:H - `send_sigqueue()` writes into the freed object (`q->info.si_overrun++`) and performs a `list_add_tail()` linked-list insertion on attacker-resprayable memory, followed by a double free on dequeue — a classic controlled-write primitive leading to full privilege escalation, as demonstrated by in-the-wild exploitation of this flaw.\nA:H - Even without successful exploitation the race causes `BUG_ON(!(q->flags & SIGQUEUE_PREALLOC))` in `send_sigqueue()`, `WARN_ON_ONCE()` in the delete path, list corruption, and a double free — any of which oops or panic the kernel. Spinning the race is trivially repeatable as a denial of service."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/time/posix-cpu-timers.c"],"versions":[{"version":"0bdd2ed4138ec04e09b4f8165981efc99e439f55","lessThan":"78a4b8e3795b31dae58762bc091bb0f4f74a2200","status":"affected","versionType":"git"},{"version":"0bdd2ed4138ec04e09b4f8165981efc99e439f55","lessThan":"c076635b3a42771ace7d276de8dc3bc76ee2ba1b","status":"affected","versionType":"git"},{"version":"0bdd2ed4138ec04e09b4f8165981efc99e439f55","lessThan":"2f3daa04a9328220de46f0d5c919a6c0073a9f0b","status":"affected","versionType":"git"},{"version":"0bdd2ed4138ec04e09b4f8165981efc99e439f55","lessThan":"764a7a5dfda23f69919441f2eac2a83e7db6e5bb","status":"affected","versionType":"git"},{"version":"0bdd2ed4138ec04e09b4f8165981efc99e439f55","lessThan":"2c72fe18cc5f9f1750f5bc148cf1c94c29e106ff","status":"affected","versionType":"git"},{"version":"0bdd2ed4138ec04e09b4f8165981efc99e439f55","lessThan":"c29d5318708e67ac13c1b6fc1007d179fb65b4d7","status":"affected","versionType":"git"},{"version":"0bdd2ed4138ec04e09b4f8165981efc99e439f55","lessThan":"460188bc042a3f40f72d34b9f7fc6ee66b0b757b","status":"affected","versionType":"git"},{"version":"0bdd2ed4138ec04e09b4f8165981efc99e439f55","lessThan":"f90fff1e152dedf52b932240ebbd670d83330eca","status":"affected","versionType":"git"}]},{"product":"Linux","vendor":"Linux","defaultStatus":"affected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/time/posix-cpu-timers.c"],"versions":[{"version":"2.6.36","status":"affected"},{"version":"0","lessThan":"2.6.36","status":"unaffected","versionType":"semver"},{"version":"5.4.295","lessThanOrEqual":"5.4.*","status":"unaffected","versionType":"semver"},{"version":"5.10.239","lessThanOrEqual":"5.10.*","status":"unaffected","versionType":"semver"},{"version":"5.15.186","lessThanOrEqual":"5.15.*","status":"unaffected","versionType":"semver"},{"version":"6.1.142","lessThanOrEqual":"6.1.*","status":"unaffected","versionType":"semver"},{"version":"6.6.94","lessThanOrEqual":"6.6.*","status":"unaffected","versionType":"semver"},{"version":"6.12.34","lessThanOrEqual":"6.12.*","status":"unaffected","versionType":"semver"},{"version":"6.15.3","lessThanOrEqual":"6.15.*","status":"unaffected","versionType":"semver"},{"version":"6.16","lessThanOrEqual":"*","status":"unaffected","versionType":"original_commit_for_fix"}]}],"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"2.6.36","versionEndExcluding":"5.4.295"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"2.6.36","versionEndExcluding":"5.10.239"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"2.6.36","versionEndExcluding":"5.15.186"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"2.6.36","versionEndExcluding":"6.1.142"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"2.6.36","versionEndExcluding":"6.6.94"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"2.6.36","versionEndExcluding":"6.12.34"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"2.6.36","versionEndExcluding":"6.15.3"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"2.6.36","versionEndExcluding":"6.16"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/78a4b8e3795b31dae58762bc091bb0f4f74a2200"},{"url":"https://git.kernel.org/stable/c/c076635b3a42771ace7d276de8dc3bc76ee2ba1b"},{"url":"https://git.kernel.org/stable/c/2f3daa04a9328220de46f0d5c919a6c0073a9f0b"},{"url":"https://git.kernel.org/stable/c/764a7a5dfda23f69919441f2eac2a83e7db6e5bb"},{"url":"https://git.kernel.org/stable/c/2c72fe18cc5f9f1750f5bc148cf1c94c29e106ff"},{"url":"https://git.kernel.org/stable/c/c29d5318708e67ac13c1b6fc1007d179fb65b4d7"},{"url":"https://git.kernel.org/stable/c/460188bc042a3f40f72d34b9f7fc6ee66b0b757b"},{"url":"https://git.kernel.org/stable/c/f90fff1e152dedf52b932240ebbd670d83330eca"}],"title":"posix-cpu-timers: fix race between handle_posix_cpu_timers() and posix_cpu_timer_del()","x_generator":{"engine":"bippy-1.2.0"}},"adp":[{"problemTypes":[{"descriptions":[{"type":"CWE","cweId":"CWE-367","lang":"en","description":"CWE-367 Time-of-check Time-of-use (TOCTOU) Race Condition"}]}],"references":[{"url":"https://www.cisa.gov/known-exploited-vulnerabilities-catalog?field_cve=CVE-2025-38352","tags":["government-resource"]},{"url":"https://github.com/farazsth98/chronomaly","tags":["exploit"]}],"metrics":[{"other":{"type":"ssvc","content":{"timestamp":"2025-09-05T03:55:31.566379Z","id":"CVE-2025-38352","options":[{"Exploitation":"active"},{"Automatable":"no"},{"Technical Impact":"total"}],"role":"CISA Coordinator","version":"2.0.3"}}},{"other":{"type":"kev","content":{"dateAdded":"2025-09-04","reference":"https://www.cisa.gov/known-exploited-vulnerabilities-catalog?field_cve=CVE-2025-38352"}}}],"title":"CISA ADP Vulnrichment","providerMetadata":{"orgId":"134c704f-9b21-4f2e-91b3-4a467353bcc0","shortName":"CISA-ADP","dateUpdated":"2026-09-08T15:32:28.302Z"}},{"title":"CVE Program Container","references":[{"url":"https://lists.debian.org/debian-lts-announce/2025/10/msg00008.html"},{"url":"https://lists.debian.org/debian-lts-announce/2025/10/msg00007.html"}],"providerMetadata":{"orgId":"af854a3a-2127-422b-91ae-364da2661108","shortName":"CVE","dateUpdated":"2025-11-03T17:37:02.965Z"}}]}}