<?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>Thu, 01 Oct 2026 22:36:15 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-31411 — net: atm: fix crash due to unvalidated vcc pointer in sigd_send()</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-31411</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux, Siemens SIMATIC S7-1500 CPU 1518-4 PN/DP MFP, Siemens SIMATIC S7-1500 CPU 1518F-4 PN/DP MFP, Siemens SIPLUS S7-1500 CPU 1518-4 PN/DP MFP&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;net: atm: fix crash due to unvalidated vcc pointer in sigd_send()&lt;/p&gt;
&lt;p&gt;Reproducer available at [1].&lt;/p&gt;
&lt;p&gt;The ATM send path (sendmsg -&amp;gt; vcc_sendmsg -&amp;gt; sigd_send) reads the vcc
pointer from msg-&amp;gt;vcc and uses it directly without any validation. This
pointer comes from userspace via sendmsg() and can be arbitrarily forged:&lt;/p&gt;
&lt;p&gt;int fd = socket(AF_ATMSVC, SOCK_DGRAM, 0);
    ioctl(fd, ATMSIGD_CTRL);  // become ATM signaling daemon
    struct msghdr msg = { .msg_iov = &amp;amp;iov, ... };
    *(unsigned long *)(buf + 4) = 0xdeadbeef;  // fake vcc pointer
    sendmsg(fd, &amp;amp;msg, 0);  // kernel dereferences 0xdeadbeef&lt;/p&gt;
&lt;p&gt;In normal operation, the kernel sends the vcc pointer to the signaling
daemon via sigd_enq() when processing operations like connect(), bind(),
or listen(). The daemon is expected to return the same pointer when
responding. However, a malicious daemon can send arbitrary pointer values.&lt;/p&gt;
&lt;p&gt;Fix this by introducing find_get_vcc() which validates the pointer by
searching through vcc_hash (similar to how sigd_close() iterates over
all VCCs), and acquires a reference via sock_hold() if found.&lt;/p&gt;
&lt;p&gt;Since struct atm_vcc embeds struct sock as its first member, they share
the same lifetime. Therefore using sock_hold/sock_put is sufficient to
keep the vcc alive while it is being used.&lt;/p&gt;
&lt;p&gt;Note that there may be a race with sigd_close() which could mark the vcc
with various flags (e.g., ATM_VF_RELEASED) after find_get_vcc() returns.
Howev…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux, Siemens SIMATIC S7-1500 CPU 1518-4 PN/DP MFP, Siemens SIMATIC S7-1500 CPU 1518F-4 PN/DP MFP, Siemens SIPLUS S7-1500 CPU 1518-4 PN/DP MFP&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;net: atm: fix crash due to unvalidated vcc pointer in sigd_send()&lt;/p&gt;
&lt;p&gt;Reproducer available at [1].&lt;/p&gt;
&lt;p&gt;The ATM send path (sendmsg -&amp;gt; vcc_sendmsg -&amp;gt; sigd_send) reads the vcc
pointer from msg-&amp;gt;vcc and uses it directly without any validation. This
pointer comes from userspace via sendmsg() and can be arbitrarily forged:&lt;/p&gt;
&lt;p&gt;int fd = socket(AF_ATMSVC, SOCK_DGRAM, 0);
    ioctl(fd, ATMSIGD_CTRL);  // become ATM signaling daemon
    struct msghdr msg = { .msg_iov = &amp;amp;iov, ... };
    *(unsigned long *)(buf + 4) = 0xdeadbeef;  // fake vcc pointer
    sendmsg(fd, &amp;amp;msg, 0);  // kernel dereferences 0xdeadbeef&lt;/p&gt;
&lt;p&gt;In normal operation, the kernel sends the vcc pointer to the signaling
daemon via sigd_enq() when processing operations like connect(), bind(),
or listen(). The daemon is expected to return the same pointer when
responding. However, a malicious daemon can send arbitrary pointer values.&lt;/p&gt;
&lt;p&gt;Fix this by introducing find_get_vcc() which validates the pointer by
searching through vcc_hash (similar to how sigd_close() iterates over
all VCCs), and acquires a reference via sock_hold() if found.&lt;/p&gt;
&lt;p&gt;Since struct atm_vcc embeds struct sock as its first member, they share
the same lifetime. Therefore using sock_hold/sock_put is sufficient to
keep the vcc alive while it is being used.&lt;/p&gt;
&lt;p&gt;Note that there may be a race with sigd_close() which could mark the vcc
with various flags (e.g., ATM_VF_RELEASED) after find_get_vcc() returns.
Howev…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-31411</guid>
    </item>
  </channel>
</rss>
