CVE-2021-43798:Grafana 8.x 插件静态资源路由路径穿越漏洞分析

摘要

CVE-2021-43798 是 Grafana 8.x 系列中存在的一处路径穿越漏洞,位于插件静态资源服务的 HTTP 路由中。该漏洞允许未认证的远程攻击者通过目录穿越序列读取服务器上 Grafana 进程有权限访问的任意文件。Grafana 官方已发布安全公告并提供了修复版本。需要说明的是,公开报告未给出 CVSS 评分或正式严重性等级,本文所述内容均基于公开信息整理,不代表独立验证的结果。

漏洞根因

Grafana 通过 GET /public/plugins/<pluginID>/... 路由为已安装插件提供静态资源服务。该路由在处理请求时,将用户提供的 filePath 参数直接与插件的静态资源目录进行拼接,且在整个过程中未对路径做任何规范化处理或过滤。

具体而言,当 filePath 中包含 ../ 序列时,请求的最终路径可以跳出 /public/plugins/<pluginID>/ 这一基准目录,遍历至服务器上的任意路径。路由参数在校验阶段也未确认解析后的路径是否仍限定在插件目录范围内,便将其传递给文件服务逻辑执行读取。

修复提交(commit c798c0e958d15d9cc7f27c72113d572fa58545ce)对请求的文件路径进行了清洗,使穿越序列无法逃逸出插件基准目录。该修复随 8.3.1 版本发布,并回溯至 8.0.7、8.1.8 和 8.2.7。

攻击链与前置条件

攻击的成立需要满足以下前置条件:

  • 目标实例运行受影响的 Grafana 8.x 版本;
  • 攻击者已知或可猜到一个已安装插件的 ID,用作穿越锚点——Grafana 8.x 默认内置的插件(如 alertmanagergrafana-clock-panel)即可满足此条件;
  • 该端点无需认证,任何可网络到达目标的攻击者均可发起请求;
  • 目标文件须对 Grafana 进程可读(进程默认以 grafana 用户身份运行)。

在上述条件满足时,攻击者向 /public/plugins/<pluginID>/ 路径后附加 ../ 穿越序列,指向服务器上的目标文件(如 /etc/passwd/etc/grafana/grafana.ini/proc/self/environ)。为防止 HTTP 客户端在请求到达服务器前将 ../ 序列规范化,攻击者可使用 --path-as-is 选项或 URL 编码的 ..%2f 分隔符。

在受影响版本上,服务器以 HTTP 200 返回所请求文件的内容;在已修复版本(8.3.1 及以上)上,同样的请求返回 HTTP 404。

影响范围

受影响的版本范围如下:

  • 8.0.0-beta1 至 8.0.7 之前
  • 8.1.0 至 8.1.8 之前
  • 8.2.0 至 8.2.7 之前
  • 8.3.0

修复版本为 8.0.7、8.1.8、8.2.7 和 8.3.1 及以上。

漏洞的核心影响在于未认证的任意文件读取:攻击者可读取 Grafana 进程可访问的任何文件。在默认 grafana 用户身份下,可被读取的敏感文件包括 /etc/passwd、Grafana 配置文件 grafana.ini 以及进程环境变量 /proc/self/environ,后者可能包含凭据或密钥。此类信息泄露可能进一步暴露配置细节、数据库连接字符串或存储于环境变量与配置文件中的密钥,从而为后续攻击创造条件。

需要指出的是,可利用性取决于 Grafana 进程对目标文件的读取权限;公开报告确认了以默认 grafana 用户身份的读取行为,但未对该用户权限范围之外的情况做出进一步说明。此外,公开报告仅列出了上述受影响版本范围,并未逐一枚举范围内的每一个中间发行版本。

检测与处置

检测方面,建议关注以下行为特征:

  • 监控发往 /public/plugins/ 端点且包含 ../ 或 URL 编码 ..%2f 穿越序列的 HTTP 请求;
  • /public/plugins/ 路由返回 HTTP 200 且响应内容为文件数据而非预期插件静态资源的情况进行告警;
  • 关注通过插件静态资源路由访问敏感路径(如 /etc/passwdgrafana.ini/proc/self/environ)的请求;
  • 将同一来源对多个不同文件路径的请求与 /public/plugins/ 路由进行关联,作为枚举行为的征兆。

处置方面

  • 将 Grafana 升级至修复版本:8.0.7、8.1.8、8.2.7 或 8.3.1 及以上;
  • 在完成升级之前,限制对 Grafana HTTP 端口的网络访问,仅允许受信任用户接入;
  • 审查可能已被暴露的服务器文件(如 grafana.ini/proc/self/environ),并轮换任何已泄露的凭据或密钥。

Grafana 官方安全公告(GitHub Security Advisory GHSA-8pjx-jj86-j47p)及官方博客文章提供了关于此漏洞的进一步信息,修复细节可参阅上述修复提交。

参考资料