<?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 20:49:27 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-74488 — wifi: mwifiex: use the subframe length when parsing A-MSDU TDLS frames</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-74488</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;wifi: mwifiex: use the subframe length when parsing A-MSDU TDLS frames&lt;/p&gt;
&lt;p&gt;mwifiex_11n_dispatch_amsdu_pkt() splits an A-MSDU with
ieee80211_amsdu_to_8023s() and walks the resulting subframes. For each
subframe it passes the subframe data pointer to
mwifiex_process_tdls_action_frame(), but pairs it with skb-&amp;gt;len, the
length of the A-MSDU parent, instead of rx_skb-&amp;gt;len:&lt;/p&gt;
&lt;p&gt;rx_skb = __skb_dequeue(&amp;amp;list);
	rx_hdr = (struct rx_packet_hdr *)rx_skb-&amp;gt;data;
	if (ISSUPP_TDLS_ENABLED(priv-&amp;gt;adapter-&amp;gt;fw_cap_info) &amp;amp;&amp;amp;
	    ntohs(rx_hdr-&amp;gt;eth803_hdr.h_proto) == ETH_P_TDLS) {
		mwifiex_process_tdls_action_frame(priv, (u8 *)rx_hdr,
						  skb-&amp;gt;len);
	}&lt;/p&gt;
&lt;p&gt;The parent is not a valid description of that buffer, and may not be
valid memory at all. ieee80211_amsdu_to_8023s() ends with&lt;/p&gt;
&lt;p&gt;if (!reuse_skb)
		dev_kfree_skb(skb);&lt;/p&gt;
&lt;p&gt;and it only sets reuse_skb when the parent is linear, is not a
head_frag, and is being consumed as the *last* subframe. So when the
parent does not qualify for reuse it has already been freed, and the
read of skb-&amp;gt;len is a use-after-free. When it is reused, skb-&amp;gt;len is
the length of the last subframe, applied to every earlier subframe,
which over-states the buffer whenever an earlier subframe is shorter.&lt;/p&gt;
&lt;p&gt;The callee cannot absorb a wrong length, because it derives its own
ceiling from the value it is given. Each frame type computes&lt;/p&gt;
&lt;p&gt;ies_len = len - sizeof(struct ethhdr) - TDLS_*_FIX_LEN;&lt;/p&gt;
&lt;p&gt;and the element walk is t…&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;wifi: mwifiex: use the subframe length when parsing A-MSDU TDLS frames&lt;/p&gt;
&lt;p&gt;mwifiex_11n_dispatch_amsdu_pkt() splits an A-MSDU with
ieee80211_amsdu_to_8023s() and walks the resulting subframes. For each
subframe it passes the subframe data pointer to
mwifiex_process_tdls_action_frame(), but pairs it with skb-&amp;gt;len, the
length of the A-MSDU parent, instead of rx_skb-&amp;gt;len:&lt;/p&gt;
&lt;p&gt;rx_skb = __skb_dequeue(&amp;amp;list);
	rx_hdr = (struct rx_packet_hdr *)rx_skb-&amp;gt;data;
	if (ISSUPP_TDLS_ENABLED(priv-&amp;gt;adapter-&amp;gt;fw_cap_info) &amp;amp;&amp;amp;
	    ntohs(rx_hdr-&amp;gt;eth803_hdr.h_proto) == ETH_P_TDLS) {
		mwifiex_process_tdls_action_frame(priv, (u8 *)rx_hdr,
						  skb-&amp;gt;len);
	}&lt;/p&gt;
&lt;p&gt;The parent is not a valid description of that buffer, and may not be
valid memory at all. ieee80211_amsdu_to_8023s() ends with&lt;/p&gt;
&lt;p&gt;if (!reuse_skb)
		dev_kfree_skb(skb);&lt;/p&gt;
&lt;p&gt;and it only sets reuse_skb when the parent is linear, is not a
head_frag, and is being consumed as the *last* subframe. So when the
parent does not qualify for reuse it has already been freed, and the
read of skb-&amp;gt;len is a use-after-free. When it is reused, skb-&amp;gt;len is
the length of the last subframe, applied to every earlier subframe,
which over-states the buffer whenever an earlier subframe is shorter.&lt;/p&gt;
&lt;p&gt;The callee cannot absorb a wrong length, because it derives its own
ceiling from the value it is given. Each frame type computes&lt;/p&gt;
&lt;p&gt;ies_len = len - sizeof(struct ethhdr) - TDLS_*_FIX_LEN;&lt;/p&gt;
&lt;p&gt;and the element walk is t…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-74488</guid>
    </item>
  </channel>
</rss>
