CVE-2026-98258
Microsoft — posix-cpu-timers: Prevent freeing a timer which is queued on the expiry list
Microsoft · Not classified by connected sources
EVRS 0 of 100 Informational
Monitor
Rank 2,954 of 2,960 tracked
Why it scores 0
Evidence available: 2 of 8 signalsNo strong exploitation, disclosure, or severity signal is available for this CVE yet.
- CISA KEVDid not apply
- RansomwareNo data
- Vendor exploitationNo data
- EPSSDid not apply
- Microsoft Exploitability IndexNo data
- Pre-patch disclosureNo data
- KEV recencyNo data
- CVSSNo data
The band answers “how soon”, not “how bad”. No data for: Ransomware, Vendor exploitation, Microsoft Exploitability Index, Pre-patch disclosure, KEV recency, CVSS. Why some signals show no data
Fix
Patch or fixed version identifiedFixed in
openSUSE Tumbleweed -> kernel-devel-0:7.2.10-1.1.aarch64 | linux -> 7.2.8-1
Affected versions
Not identified by the connected sources
Fixed versions from NVD.
Evidence
Each value with its source| Measure | Value | Source |
|---|---|---|
| CVSS base scoreHow severe the flaw is in itself. It does not say how likely an attack is. | Not publishedNVD and the CVE record were checked and hold no score. | NVD |
| FIRST EPSSFIRST's estimate of the chance this is exploited in the next 30 days, and how that ranks against all CVEs. | 0.001 (2.8th pctl) | FIRST EPSS |
| Actively exploitedWhether a source of record has confirmed attacks using it in the wild. | Not confirmed | Patch Tuesday |
| Public exploit moduleA module existing is not the same as active exploitation. | None known | Metasploit |
| EUVD cross-referenceENISA's record: CVSS 7.8 (v3.1), assigned by Linux. | Listed | ENISA EUVD |
Description
NVDIn the Linux kernel, the following vulnerability has been resolved: posix-cpu-timers: Prevent freeing a timer which is queued on the expiry list Kijo analyzed another race in the POSIX CPU timer code: Commit bf635681c906 converted cpu_timer::firing from a tristate value to a boolean. This lost the distinction between "not owned by the firing list" and "still owned, but delivery was canceled". The resulting race is: expiry handler timer_settime() timer_delete() -------------- --------------- -------------- collect timer onto private firing list firing = true observes firing = true firing = false return TIMER_RETRY wait for handler observes firing = false finish deletion unhash and free timer resume list traversal read freed elist.next -> UAF The firing bit is clearly the wrong indicator since that commit. Check whether the timer is queued on the expiry list or not instead. If it is queued clear the firing bit to prevent signal delivery as before and return TIMER_RETRY so the caller unlocks the timer which allows the expiry code to make progress and remove it from the list.
