<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://db.gcve.eu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Sat, 17 Oct 2026 19:01:16 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-98260 — exec: Cleanup POSIX timers right after de_thread()</title>
      <link>https://db.gcve.eu/vuln/cve-2026-98260</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;exec: Cleanup POSIX timers right after de_thread()&lt;/p&gt;
&lt;p&gt;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&amp;#39;s
posix_cputimers. The task is looked up by that PID.&lt;/p&gt;
&lt;p&gt;When a non-leader thread exec()s, de_thread() changes which task owns
that PID. pid_task(timer-&amp;gt;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.&lt;/p&gt;
&lt;p&gt;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-&amp;gt;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.&lt;/p&gt;
&lt;p&gt;In short:&lt;/p&gt;
&lt;p&gt;the non-leader thread B           the parent&lt;/p&gt;
&lt;p&gt;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&amp;#39;s PID now belongs to the leader
      release_task(leader)
        __exit_signal(leader)
          posix_cpu_timers_exit(leader)  // cleans leader&amp;#39;s queue, not B&amp;#39;…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;exec: Cleanup POSIX timers right after de_thread()&lt;/p&gt;
&lt;p&gt;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&amp;#39;s
posix_cputimers. The task is looked up by that PID.&lt;/p&gt;
&lt;p&gt;When a non-leader thread exec()s, de_thread() changes which task owns
that PID. pid_task(timer-&amp;gt;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.&lt;/p&gt;
&lt;p&gt;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-&amp;gt;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.&lt;/p&gt;
&lt;p&gt;In short:&lt;/p&gt;
&lt;p&gt;the non-leader thread B           the parent&lt;/p&gt;
&lt;p&gt;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&amp;#39;s PID now belongs to the leader
      release_task(leader)
        __exit_signal(leader)
          posix_cpu_timers_exit(leader)  // cleans leader&amp;#39;s queue, not B&amp;#39;…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/cve-2026-98260</guid>
    </item>
  </channel>
</rss>
