<?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>Tue, 20 Oct 2026 19:17:13 +0000</lastBuildDate>
    <item>
      <title>GHSA-v53p-9fqp-m79j — Nodemailer: Quadratic backtracking in the addressparser free-text fallback allows remote denial of service</title>
      <link>https://db.gcve.eu/vuln/ghsa-v53p-9fqp-m79j</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: nodemailer&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;When `addressparser` finds no address by its strict reading, it falls back to pulling one out of the free text with `/\s*\b[^@\s]+@[^\s]+\b\s*/`. That pattern backtracks quadratically: `[^@\s]+` is retried from every offset and rescans the run to the next `@` each time. A single header value holding a long whitespace-free run with no usable `@` blocks the Node.js event loop for tens of seconds.&lt;/p&gt;
&lt;p&gt;It is cheaper to exploit than GHSA-prgh-xp8r-p3m5: 273KB is enough for ~43s, where the comment-joined shape needed ~1.5MB for ~10s.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The fallback in `src/addressparser/index.ts` ran the pattern as a search. `[^@\s]+` crosses neither whitespace nor `@`, so from each start offset it scans forward to the next `@` or to the end of the run and then fails, and the engine simply advances one character and repeats. Three shapes make every offset fail:&lt;/p&gt;
&lt;p&gt;- the run holds no `@` at all
- the only `@` has nothing after it
- the only `@` has nothing before it&lt;/p&gt;
&lt;p&gt;A fourth reaches it with a valid address present but placed past a long run, so the long run is walked before the match is found.&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;```js
const addressparser = require(&amp;#39;nodemailer/lib/addressparser&amp;#39;);
const s = Date.now();
addressparser(&amp;#39; &amp;gt;&amp;#39; + &amp;#39;&amp;gt;[x][x]&amp;#39;.repeat(40000)); // 273KB
console.log(Date.now() - s, &amp;#39;ms&amp;#39;); // ~43000 ms, blocking
```&lt;/p&gt;
&lt;p&gt;Measured on 10.0.5:&lt;/p&gt;
&lt;p&gt;| Value | Parse time |
| --- | --- |
| `&amp;#39;[x]&amp;#39;.repeat(40000)` (117KB) | 9.0 s |
| `&amp;#39;[x]&amp;#39;.repeat(40000) + &amp;#39;@&amp;#39;` (117KB) | 8.9 s |
| `&amp;#39;@&amp;#39; + &amp;#39;[x]&amp;#39;.repeat(4…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: nodemailer&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;When `addressparser` finds no address by its strict reading, it falls back to pulling one out of the free text with `/\s*\b[^@\s]+@[^\s]+\b\s*/`. That pattern backtracks quadratically: `[^@\s]+` is retried from every offset and rescans the run to the next `@` each time. A single header value holding a long whitespace-free run with no usable `@` blocks the Node.js event loop for tens of seconds.&lt;/p&gt;
&lt;p&gt;It is cheaper to exploit than GHSA-prgh-xp8r-p3m5: 273KB is enough for ~43s, where the comment-joined shape needed ~1.5MB for ~10s.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The fallback in `src/addressparser/index.ts` ran the pattern as a search. `[^@\s]+` crosses neither whitespace nor `@`, so from each start offset it scans forward to the next `@` or to the end of the run and then fails, and the engine simply advances one character and repeats. Three shapes make every offset fail:&lt;/p&gt;
&lt;p&gt;- the run holds no `@` at all
- the only `@` has nothing after it
- the only `@` has nothing before it&lt;/p&gt;
&lt;p&gt;A fourth reaches it with a valid address present but placed past a long run, so the long run is walked before the match is found.&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;```js
const addressparser = require(&amp;#39;nodemailer/lib/addressparser&amp;#39;);
const s = Date.now();
addressparser(&amp;#39; &amp;gt;&amp;#39; + &amp;#39;&amp;gt;[x][x]&amp;#39;.repeat(40000)); // 273KB
console.log(Date.now() - s, &amp;#39;ms&amp;#39;); // ~43000 ms, blocking
```&lt;/p&gt;
&lt;p&gt;Measured on 10.0.5:&lt;/p&gt;
&lt;p&gt;| Value | Parse time |
| --- | --- |
| `&amp;#39;[x]&amp;#39;.repeat(40000)` (117KB) | 9.0 s |
| `&amp;#39;[x]&amp;#39;.repeat(40000) + &amp;#39;@&amp;#39;` (117KB) | 8.9 s |
| `&amp;#39;@&amp;#39; + &amp;#39;[x]&amp;#39;.repeat(4…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-v53p-9fqp-m79j</guid>
    </item>
  </channel>
</rss>
