<?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://vulnerability.circl.lu</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>Tue, 29 Sep 2026 22:16:28 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-68398 — ppp: defer channel free to an RCU grace period to fix pppol2tp RX UAF</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-68398</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;ppp: defer channel free to an RCU grace period to fix pppol2tp RX UAF&lt;/p&gt;
&lt;p&gt;pppol2tp_recv() runs in the L2TP UDP-encap softirq RX path:&lt;/p&gt;
&lt;p&gt;l2tp_udp_encap_recv() -&amp;gt; l2tp_recv_common() -&amp;gt; pppol2tp_recv()
   -&amp;gt; ppp_input(&amp;amp;po-&amp;gt;chan)&lt;/p&gt;
&lt;p&gt;It runs under rcu_read_lock() holding only an l2tp_session reference and
takes NO reference on the internal PPP channel (struct channel,
chan-&amp;gt;ppp) that ppp_input() dereferences.&lt;/p&gt;
&lt;p&gt;The pppox socket is SOCK_RCU_FREE, so &amp;#39;po&amp;#39; and the embedded ppp_channel
are RCU-safe.  But the internal struct channel is a separate allocation
that ppp_release_channel() frees with a plain kfree():&lt;/p&gt;
&lt;p&gt;close(data socket) -&amp;gt; pppol2tp_release() -&amp;gt; pppox_unbind_sock()
   -&amp;gt; ppp_unregister_channel() -&amp;gt; ppp_release_channel() -&amp;gt; kfree(pch)&lt;/p&gt;
&lt;p&gt;For a channel that is bound (PPPIOCGCHAN) but not attached to a ppp unit
(no PPPIOCCONNECT, pch-&amp;gt;ppp == NULL) and not bridged, teardown skips
both ppp_disconnect_channel()&amp;#39;s synchronize_net() and
ppp_unbridge_channels()&amp;#39;s synchronize_rcu(), so the kfree() has no grace
period.  rcu_read_lock() in pppol2tp_recv() does not protect against a
plain kfree(), so an in-flight ppp_input() on one CPU can dereference
the channel just freed by close() on another CPU.&lt;/p&gt;
&lt;p&gt;The bug is reachable by an unprivileged user.&lt;/p&gt;
&lt;p&gt;Defer the channel free to an RCU callback via call_rcu() so the grace
period fences any in-flight ppp_input(). The disconnect and unbridge
teardown paths already fence with synchroni…&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;ppp: defer channel free to an RCU grace period to fix pppol2tp RX UAF&lt;/p&gt;
&lt;p&gt;pppol2tp_recv() runs in the L2TP UDP-encap softirq RX path:&lt;/p&gt;
&lt;p&gt;l2tp_udp_encap_recv() -&amp;gt; l2tp_recv_common() -&amp;gt; pppol2tp_recv()
   -&amp;gt; ppp_input(&amp;amp;po-&amp;gt;chan)&lt;/p&gt;
&lt;p&gt;It runs under rcu_read_lock() holding only an l2tp_session reference and
takes NO reference on the internal PPP channel (struct channel,
chan-&amp;gt;ppp) that ppp_input() dereferences.&lt;/p&gt;
&lt;p&gt;The pppox socket is SOCK_RCU_FREE, so &amp;#39;po&amp;#39; and the embedded ppp_channel
are RCU-safe.  But the internal struct channel is a separate allocation
that ppp_release_channel() frees with a plain kfree():&lt;/p&gt;
&lt;p&gt;close(data socket) -&amp;gt; pppol2tp_release() -&amp;gt; pppox_unbind_sock()
   -&amp;gt; ppp_unregister_channel() -&amp;gt; ppp_release_channel() -&amp;gt; kfree(pch)&lt;/p&gt;
&lt;p&gt;For a channel that is bound (PPPIOCGCHAN) but not attached to a ppp unit
(no PPPIOCCONNECT, pch-&amp;gt;ppp == NULL) and not bridged, teardown skips
both ppp_disconnect_channel()&amp;#39;s synchronize_net() and
ppp_unbridge_channels()&amp;#39;s synchronize_rcu(), so the kfree() has no grace
period.  rcu_read_lock() in pppol2tp_recv() does not protect against a
plain kfree(), so an in-flight ppp_input() on one CPU can dereference
the channel just freed by close() on another CPU.&lt;/p&gt;
&lt;p&gt;The bug is reachable by an unprivileged user.&lt;/p&gt;
&lt;p&gt;Defer the channel free to an RCU callback via call_rcu() so the grace
period fences any in-flight ppp_input(). The disconnect and unbridge
teardown paths already fence with synchroni…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-68398</guid>
    </item>
  </channel>
</rss>
