<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:webfeeds="http://webfeeds.org/rss/1.0"><channel><title>Browserslist (&lt;= 4.28.6) - CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/products/browserslist--4.28.6/</link><description>Trending threats, MITRE ATT&amp;CK coverage, and detection metadata. Fed continuously.</description><generator>Hugo</generator><language>en</language><managingEditor>hello@craftedsignal.io</managingEditor><webMaster>hello@craftedsignal.io</webMaster><lastBuildDate>Tue, 01 Sep 2026 18:00:21 +0000</lastBuildDate><atom:link href="https://feed.craftedsignal.io/products/browserslist--4.28.6/feed.xml" rel="self" type="application/rss+xml"/><image><url>https://feed.craftedsignal.io/favicon-32x32.png</url><title>CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/</link><width>32</width><height>32</height></image><webfeeds:icon>https://feed.craftedsignal.io/favicon.svg</webfeeds:icon><item><title>Browserslist Unbounded Memory Growth via Cache Exhaustion</title><link>https://feed.craftedsignal.io/briefs/2026-09-browserslist-oom/</link><pubDate>Tue, 01 Sep 2026 18:00:21 +0000</pubDate><author>hello@craftedsignal.io</author><guid isPermaLink="true">https://feed.craftedsignal.io/briefs/2026-09-browserslist-oom/</guid><description>The Browserslist package is vulnerable to a volumetric denial-of-service attack due to a missing cache eviction policy in its internal query result storage, leading to unbounded heap growth and potential OOM crashes in long-running processes.</description><content:encoded><![CDATA[<p>The Browserslist package (up to and including v4.28.6) contains a memory management vulnerability in its internal query and parse caches. The application maintains two objects, <code>cache</code> and <code>parseCache</code>, which store results indexed by query keys generated via <code>JSON.stringify()</code>. These caches lack size constraints, time-to-live (TTL) policies, or eviction mechanisms, and are not cleared by the <code>browserslist.clearCaches()</code> function.</p>
<p>In long-running Node.js processes such as web servers or CI workers, an attacker who can influence the query strings passed to <code>browserslist()</code> can cause unbounded memory growth. Specifically, the <code>since &lt;year&gt;-&lt;month&gt;-&lt;day&gt;</code> query pattern allows for a large space of valid, distinct keys. By sending a high volume of unique requests, an attacker can force the accumulation of cache entries until the process exhausts available heap memory, resulting in an out-of-memory (OOM) crash. Analysis showed an approximately 150x memory amplification factor, where 20,000 distinct queries consumed over 50 MB of permanent heap space.</p>
<h2 id="attack-chain">Attack Chain</h2>
<ol>
<li>Attacker identifies a target application utilizing Browserslist in a long-running process (e.g., web server or CI pipeline) that accepts user-influenced input for browser queries.</li>
<li>Attacker crafts a series of distinct, syntactically valid <code>since &lt;year&gt;-&lt;month&gt;-&lt;day&gt;</code> query strings.</li>
<li>Attacker sends a high volume of requests to the target, each containing a unique date variation to ensure the cache key is novel.</li>
<li>The target application passes these queries to the <code>browserslist()</code> function.</li>
<li>The library generates a unique <code>cacheKey</code> using <code>JSON.stringify()</code> for each request.</li>
<li>Browserslist stores the resulting data in the unbounded <code>cache</code> and <code>parseCache</code> objects.</li>
<li>Memory usage of the process grows linearly with the number of unique queries.</li>
<li>Upon reaching memory limits, the process crashes due to an OOM condition, resulting in a denial-of-service.</li>
</ol>
<h2 id="impact">Impact</h2>
<p>Successful exploitation results in a denial-of-service via process termination. This vulnerability impacts long-running Node.js applications that process external inputs influencing browser queries. The attack requires a sustained, high-volume request stream rather than a single malicious payload, which characterizes it as a volumetric DoS.</p>
<h2 id="recommendation">Recommendation</h2>
<ol>
<li>Upgrade the <code>browserslist</code> package to a version that implements the bounded cache fix (e.g., &gt; 4.28.6).</li>
<li>If an immediate upgrade is not possible, review application code to identify if user input influences <code>browserslist()</code> calls and implement an application-layer cache proxy or query validation to restrict the variety of permitted query strings.</li>
<li>Ensure that if <code>BROWSERSLIST_DISABLE_CACHE</code> is used as a workaround, the impact on performance is measured against the expected request load.</li>
</ol>
]]></content:encoded><category domain="severity">low</category><category domain="type">advisory</category><category>denial-of-service</category><category>memory-exhaustion</category><category>javascript</category><category>nodejs</category><category>vulnerability</category><category>prototype-pollution</category><category>supply-chain</category></item></channel></rss>