编按:把控制面也暴露到公网确实高风险。
决定限制自己公网服务器对外的 ssh 端口,仅允许通过家里的香橙派访问。
读完本文,你会搞懂:哪吒监控最近曝出的几条高危漏洞究竟是什么、为什么一个面板应用会同时出这么多严重问题、以及如何在 5 分钟内确认自己是否中招。
━━━ ━━━ ━━━
背景:十万台服务器的\"透明窗口\"
哪吒监控(Nezha Monitoring)是国内使用最广的开源服务器监控面板之一。简单来说,它由一个服务端(Dashboard)和一群探针(Agent)组成。部署在哪吒上的服务器数量,保守估计超过 十万台——涵盖了一线互联网公司、云厂商的运维监控、众多个人站长和独立开发者的小型集群。
这套架构本身简洁漂亮:Agent 主动连接 Dashboard 上报数据,Dashboard 提供 Web 管理界面。部署方便,自托管可控,因此广受欢迎。
但问题出在:Dashboard 暴露在公网。
这意味着,如果有人能攻破 Dashboard,就能拿到所有被监控服务器的信息、SSH 配置、甚至执行命令的权限。2026 年中陆续曝出的一组高危 CVE,让这个风险变成了现实。
漏洞全景:一组连环雷
到目前为止,哪吒监控在 2026 年已披露 5 个 CVE,其中 3 个 CVSS 评分 ≥ 9.0。不是小打小闹的安全补丁,而是可以直接被远程攻击者利用、无需任何权限、甚至可以直接控制服务器的漏洞。
| CVE 编号 | CVSS | 类型 | 影响版本 | 简述 |
|---|---|---|---|---|
| CVE-2026-53519 | 9.1 | 未授权任意文件读取 | \< 2.0.13 | 无需登录,读取服务器任意文件 |
| CVE-2026-46716 | 9.0 | 跨租户远程代码执行 | 1.4.0 ≤ v \< 2.0.8 | 低权限用户在所有服务器上执行命令 |
| CVE-2026-46717 | 7.5 | 信息泄露 | 1.4.0 ≤ v \< 2.0.8 | 调用通知处理程序泄露敏感信息 |
| CVE-2026-53521 | 6.5 | DDNS 跨用户提权 | 2.0.14 ≤ v \< 2.1.0 | 利用不存在的 DDNS 配置劫持更新 |
| CVE-2026-53522 | 5.3 | WebSocket DoS | 1.0.0 ≤ v \< 2.2.0 | 无连接限制导致拒绝服务 |
最引人注目的两个漏洞值得单独分析。
漏洞一:CVE-2026-53519——一个函数引发的\"裸奔\"
CVSS 9.1,接近满分。这是什么概念?它意味着一个完全没有登录的、在公网扫到哪吒监控端口的攻击者,可以直接下载你的配置文件、JWT 密钥、甚至系统文件。
根因分析
漏洞出在 Dashboard 的 fallbackToFrontend 函数中。这个函数的设计初衷是:当用户访问 /dashboard/xxx 路径时,如果这个路径没有对应的 API handler,就退回到前端静态文件,返回前端的 index.html——这是单页应用的常规做法。
但实现上的问题是一个经典错误:
if strings.HasPrefix(url, "/dashboard") {
trimmed := strings.TrimPrefix(url, "/dashboard") // "/dashboard../data/config.yaml"
filePath := path.Join("admin-dist", trimmed) // → "admin-dist/../data/config.yaml"
// path.Join 会规范化 → "data/config.yaml"
os.Stat(filePath) // ✅ 找到了
http.ServeFile(w, r, filePath) // 「给我吧」
}
关键漏洞点:strings.HasPrefix 检查的是字符串前缀,不是路径段匹配。
/dashboard../data/config.yaml 确实以 /dashboard 开头,检查通过。TrimPrefix 得到 ../data/config.yaml,path.Join 将其规范化。最终返回了服务器上的任意文件。
攻击链
- 攻击者扫描公网,找到暴露的哪吒监控 Dashboard(默认端口 8008)
- 构造请求:
GET /dashboard../data/config.yaml -
拿到
config.yaml,其中包含: -
数据库连接字符串
- JWT 签名密钥 (
jwt_secret_key) - OAuth 配置
- Agent Secret(用于 Agent → Dashboard 的身份验证)
有了 jwt_secret_key,攻击者可以伪造任意用户身份登录 Dashboard,包括 admin。
影响面
这个问题非常严重。 原因是:
- 哪吒监控 Dashboard 最常见的部署方式是 Docker,直接映射 8008 端口,没有任何前置反向代理或认证网关
- 很多用户开着默认的用户名密码(admin / admin)
- Docker 容器内的 config.yaml 包含了 JWT 密钥和数据库连接信息
审计一个真实的暴露面数据:在 Shodan / FOFA 上搜索哪吒监控关键词,可以找到 数千个 直接暴露在公网的面板实例。其中相当一部分运行着 2.0.13 以下的版本。
如果你部署了哪吒监控且版本低于 2.0.13,你的 config.yaml 可能已经被人看过了。
漏洞二:CVE-2026-46716——从低权限到 root 权限的一条命令
如果说 53519 是偷窥,那 46716 就是直接动手。
这个漏洞影响 1.4.0 到 2.0.8 之间的版本。攻击路径是这样的:
- 攻击者通过某种方式注册或获取了一个 Dashbaord 账号(最低权限
RoleMember) - 调用
POST /api/v1/cron接口创建计划任务 - 利用权限检查绕过,这个计划任务的执行范围被设置为 所有服务器
- 计划任务中包含的攻击命令在所有探针上被执行
意味着什么?一个只有最基础的 RoleMember 权限的用户,可以在 Dashboard 纳管的所有服务器上任意执行 shell 命令。从普通成员到全量服务器沦陷,只有一步之遥。
这个漏洞在 2.0.8 版本中被修复,但修复方式是否彻底,需要持续关注——类似的权限绕过往往会在后续版本中以变种形式重现。
CVE-2026-53521:DDNS 配置劫持
这是一个更有趣的漏洞。如果 Dashboard 上有一个不存在的 ddns_profiles ID 被持久化了,之后其他用户创建了相同 ID 的 DDNS 配置文件,那么原来的任务就会被劫持到攻击者的服务器上更新 DNS。
这不是传统意义上的\"提权\",但它属于业务逻辑漏洞——利用系统设计中的隐式信任关系。这类漏洞在复杂应用(特别是涉及 cron、webhook、第三方集成功能)中非常常见,但很难通过自动化扫描发现,需要人工审计。
如果跑的是哪吒监控,现在该做什么?第一步:确认版本
# Docker 部署
docker exec -it nezha-dashboard ./dashboard --version
# 或者查看容器镜像标签
docker inspect nezha-dashboard | jq '.[].Config.Image'
第二步:根据版本决定升级策略
| 当前版本 | 需要修复的 CVE | 目标版本 |
|---|---|---|
| \< 2.0.8 | CVE-2026-46716, CVE-2026-46717 | ≥ 2.0.13 |
| 2.0.8 - 2.0.12 | CVE-2026-53519 | ≥ 2.0.13 |
| 2.0.14 - 2.0.x | CVE-2026-53521 | ≥ 2.1.0 |
| 2.1.0 or above | CVE-2026-53522 | ≥ 2.2.0 |
建议:直接升级到最新的 2.2.0+。
第三步:升级操作
# Docker Compose 部署
docker compose pull
docker compose up -d
# 手动部署
# 下载最新 Release
wget https://github.com/nezhahq/nezha/releases/download/v2.2.0/dashboard-linux-amd64.zip
# ... 按官方文档替换二进制并重启
第四步:升级后的安全检查
即使升级了,也要确认关键配置没有被泄露过:
# 检查 JWT 密钥是否已被替换
grep jwt_secret_key config.yaml
# 检查审计日志(如果有)
# 查看 /dashboard../data/config.yaml 的访问记录
# 替换 JWT 密钥(重要!如果已经被读取过,旧密钥已不安全)
# 修改 config.yaml,重新生成 jwt_secret_key 并重启 Dashboard
# 重置所有 Agent Secret
# 在 Dashboard 的 agent 管理页面重新生成每个 agent 的 secret
第五步:长期安全建议
- 永远不要将 Dashboard 直接暴露在公网。 在前面套一层 Nginx / Caddy 做反向代理,顺便加一个简单的 Basic Auth 或 Cloudflare Access。
- 升级 Agent 的执行命令权限和自动升级权限。 如果被攻破,弱权限的 Agent 可以更大程度上限制攻击面。
- 关闭 Dashboard 的注册功能(如果不需要对外开放)。
- 配置审计日志并定期检查异常访问。
- 加入哪吒监控的 GitHub Security Advisories 通知,第一时间收到安全更新。
这次漏洞事件说明了什么?
哪吒监控的连环漏洞并非个例,而是开源监控面板面临的一个普遍安全困境。
困境一:功能越做越多,攻击面越做越大。
Dashboard 1.0 版本的功能很纯粹:展示探针状态、预警通知。后来的版本陆续加入了 cron 任务、DDNS 更新、通知集成——每个新功能都引入了新的攻击面。cron 功能允许\"在所有服务器上执行命令\",这个设计本身就非常危险,一旦权限检查出错就是灾难性后果。
困境二:开源安全修复的不对称性。
商业软件有安全团队,漏洞发现到修复、到用户升级的平均窗口期较短。开源项目从漏洞披露到用户实际升级,时间窗口长得多。很多用户直到今天仍然跑着 1.x 版本的 Dashboard,完全不知道自己的服务器在裸奔。
困境三:Go 的隐式安全问题。
哪吒监控用 Go 编写。strings.HasPrefix 做路径检查这个错误,在 Go 项目中出现的频率非常高。Ruby 有 start_with?、Python 有 startswith——同样的模式,同样的潜在风险。Go 社区的工具链依赖和旧版本 Go 的安全漏洞(2024\~2025 年曝出数起 Go 编译器本身的安全问题)也加剧了这类应用的整体风险。
如果你的业务依赖于哪吒监控,现在是时候认真审视它的安全性了。一个好的运维习惯是:监控系统本身,也应该是被监控的对象。
━━━ ━━━ ━━━
后记: 我在写这篇文章的过程中,用 FOFA 搜了一下公网上暴露的哪吒监控 Dashboard。找到的第一台主机版本是 2.0.11,config.yaml 直接可读,JWT 密钥明文可见,Agent Secret 一共管理了 13 台服务器。这种场景正在全球数千个实例上真实上演。
━━━ ━━━ ━━━
*本文参考来源:*
- *NVD - CVE-2026-53519: https://nvd.nist.gov/vuln/detail/CVE-2026-53519*
- *NVD - CVE-2026-46716: https://nvd.nist.gov/vuln/detail/CVE-2026-46716*
- *NVD - CVE-2026-53521: https://nvd.nist.gov/vuln/detail/CVE-2026-53521*
- *NVD - CVE-2026-53522: https://nvd.nist.gov/vuln/detail/CVE-2026-53522*
- *Tenable - Nezha Monitor Vulnerabilities Report, 2026*
- *哪吒监控 GitHub 仓库: https://github.com/nezhahq/nezha*
- *CVEfeed.io - CVE-2026-46716 Analysis: https://cvefeed.io*
- *Endor Labs - Nezha Monitor CVE-2026-53519 Deep Dive*
- *Reddit r/selfhosted - \"Nezha security issues\" 讨论帖*
- *Nodeseek - 哪吒监控漏洞跟踪贴*
自动化平台的"噩梦":从表达式注入到沙箱逃逸,解析 n8n 高危 RCE 漏洞防御方案
一个字符就能提权到 root?Linux 内核 CVE-2026-23111 深度剖析
Docker CVE-2026-34040 鉴权绕过与宿主机访问漏洞
常见问题(FAQ)
Q1:这篇文章主要讲什么? 决定限制自己公网服务器对外的 ssh 端口,仅允许通过家里的香橙派访问。 Q2:还有哪些关键事实? 原因是: - 哪吒监控 Dashboard 最常见的部署方式是 Docker,直接映射 8008 端口,没有任何前置反向代理或认证网关 - 很多用户开着默认的用户名密码(admin / admin) - Docker 容器内的 config.yaml 包含了 JWT 密钥和数据库连接信息 审计一个真实的暴露面数据:在 Shodan / … Q3:有哪些值得注意的细节? 第三步:升级操作 # Docker Compose 部署 docker compose pull docker compose up -d # 手动部署 # 下载最新 Release wget https://github.com/nezhahq/nezha/releases/download/v2.2.0/dashboard-linux-amd64.… Q4:核心结论是什么? 2026 年中陆续曝出的一组高危 CVE,让这个风险变成了现实。