Node.jsのメール送信ライブラリ Nodemailer に、SMTPコマンド注入の脆弱性 CVE-2026-82854 が2026年8月31日にNVDへ公表されました。
ただし慌てて対応する必要がある人は限られます。 この脆弱性は既定の設定では発生せず、修正版もすでに2026年3月25日に公開されています。それどころか、この脆弱性は評価機関によってLOW(2.3)とCRITICAL(9.8)に大きく割れています。
この記事では、なぜ評価が割れているのか、そして自分のアプリが影響を受けるかをどう判定するかを整理します。
上のスコアはGitHub Security Advisory(開発元側の評価)の値です。 NVDに載っている値とは異なります。理由は次のとおりです。
評価がLOWとCRITICALに割れている
同じCVEに対して、2つの評価が並存しています。数字だけを見ると正反対の結論になるので、どちらを見ているかを意識してください。
- ▸GitHub Security Advisory(GHSA-c7w3-x93f-qmm8):CVSS 4.0 で 2.3 / LOW。ベクタは `CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N`
- ▸NVD(評価元は VulnCheck):CVSS 3.1 で 9.8 / CRITICAL(`CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H`)、CVSS 4.0 で 9.3 / CRITICAL(`CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N`)
差が出ているのは主に AT(攻撃要件) と PR(必要な権限)、そして影響の大きさの見積もりです。GitHub側は「攻撃が成立するには前提条件が要る(AT:P)」「影響は完全性への軽微なもの(VI:L)」と評価し、VulnCheck側は「前提条件なし(AT:N)」「機密性・完全性・可用性すべてに重大な影響(VC:H/VI:H/VA:H)」と評価しています。
この記事はGitHub側の評価を採用しています。 理由は次の節のとおり、開発元自身が前提条件を明記しているためです。なお2026年8月31日に確認した時点で、NISTによる分析はまだ完了していません(NVD APIの `vulnStatus` は `Received`)。
何が起きるのか
`sendMail()` にカスタムの `envelope` オブジェクトを渡すとき、その `size` プロパティに改行コード(CRLF)が入っていると、値がSMTPの `MAIL FROM` コマンドへ `SIZE=...` としてそのまま連結されます。
Nodemailerはコマンド文字列の末尾に `\r\n` を付けてTCPソケットへ書き込むため、`size` の中の改行がそこで `MAIL FROM` を終わらせ、続きが新しいSMTPコマンドとして解釈されます。 これにより `RCPT TO` などを注入でき、送信メールに攻撃者が指定した宛先を密かに追加できます。
同じ関数の中でも、`from` / `to` などのアドレスは `[\r\n<>]` の検査を受け、DSNパラメータは `encodeXText()` でエンコードされています。`size` だけがこの処理から漏れていた、という構図です。
自分が影響を受けるかの判定
ここが最も重要です。GitHub Security Advisoryは次のように明記しています。Nodemailerは既定ではメッセージの `from` / `to` からenvelopeを自動構築し、`size` を含めません。
つまりこの脆弱性は、アプリケーションが `sendMail()` へ `size` 付きのカスタム `envelope` を明示的に渡している場合にのみ成立します。そのうえで、その `size` の値に利用者の入力が流れ込んでいる必要があります。
さらに実行時の条件がもう1つあります。該当のコードは `if (this._envelope.size && this._supportedExtensions.includes('SIZE'))` という判定の中にあり、接続先のSMTPサーバーがSIZE拡張を広告している場合にのみ `SIZE=...` が付加されます。SIZE拡張に対応していないサーバーへ送っている場合、この経路自体が実行されません。
- ✓自分のコードで `sendMail()` に `envelope` オプションを渡しているか検索する(渡していなければ、この脆弱性の影響は受けません)
- ✓渡している場合、その `envelope` に `size` プロパティを設定しているか確認する
- ✓`size` を設定している場合、その値がユーザー入力・外部API・DBの値など、攻撃者が影響を与えうる経路から来ていないか追跡する
- ✓接続先のSMTPサーバーがSIZE拡張に対応しているか確認する(対応していなければ該当コードは実行されない)
- ✓いずれの場合も、Nodemailerを 8.0.4 以降へ更新する(現行の最新は 9.0.6 系)
- ✓`package-lock.json` / `yarn.lock` を更新し、実際に解決されたバージョンを `npm ls nodemailer` で確認する
修正版はすでに5か月前に出ている
影響を受けるのは 8.0.4 より前のすべてのバージョンで、修正版は 8.0.4 です。
注意したいのは時系列です。8.0.4 は 2026年3月25日にnpmで公開され、GitHub Advisory Database への掲載は2026年3月26日です(GitHub Advisory APIの `published_at`)。今回NVDにCVEとして載ったのが2026年8月31日で、修正から約5か月後にあたります。
したがって、通常の更新を続けているプロジェクトの多くは、CVEが公表される前にすでに修正済みのはずです。現在のNodemailerの最新は 9.0.6 系です。長期間バージョンを固定しているプロジェクトだけが確認の対象になります。
npm ls nodemailer
npm install nodemailer@^9
# 8系を維持する場合は 8.0.4 以降へ
npm install nodemailer@^8.0.4この件から持ち帰れること
CVSSスコアは誰が評価したかで変わります。 今回のように2.3と9.8が並存することは珍しくありません。スコアだけで優先度を決めず、自分のアプリがその前提条件に当てはまるかを読むほうが確実です。
また、CVEの公表日は修正の公開日ではありません。 今回は修正が5か月先行していました。逆に、CVEが公表されていなくても修正版が出ていることがあります。依存パッケージの更新は、CVEの公表を待つ運用にしないほうが安全です。
