<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bug-Bounty on burnedsignal</title><link>http://burnedsignal.com/zh/tags/bug-bounty/</link><description>Recent content in Bug-Bounty on burnedsignal</description><generator>Hugo</generator><language>zh</language><lastBuildDate>Wed, 08 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://burnedsignal.com/zh/tags/bug-bounty/index.xml" rel="self" type="application/rss+xml"/><item><title>Grafana 的 No-Op 验证器如何将匿名访问变为预认证 SSRF</title><link>http://burnedsignal.com/zh/posts/grafana-oss-preauth-ssrf/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><guid>http://burnedsignal.com/zh/posts/grafana-oss-preauth-ssrf/</guid><description>&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;ul>
&lt;li>Grafana OSS 为数据源代理端点内置了一个 &lt;strong>no-op 请求验证器&lt;/strong>，始终返回 &lt;code>nil&lt;/code>，SSRF 防护为零。&lt;/li>
&lt;li>结合两项默认配置，这使得&lt;strong>未认证用户&lt;/strong>能够通过代理向 Grafana 服务器可达的任意内部服务发起 HTTP 请求。&lt;/li>
&lt;li>对 Shodan 上 1,000 个随机实例的扫描发现，&lt;strong>约 7,800 个暴露在互联网上的 Grafana 实例&lt;/strong>开启了匿名访问，可直接利用，无需任何凭据。&lt;/li>
&lt;li>在启用了 IMDSv1 的 EC2 上，这意味着&lt;strong>无需登录即可窃取完整的 AWS 凭据&lt;/strong>：AccessKeyId、SecretAccessKey、会话令牌。&lt;/li>
&lt;li>Grafana Enterprise 版本内置了真实的验证器，OSS 版本没有。这是一个刻意的产品划分。&lt;/li>
&lt;li>已提交至 Grafana 漏洞奖励计划，被标记为超出范围。MITRE 已分配编号 &lt;strong>&lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-39104">CVE-2026-39104&lt;/a>&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="背景介绍">背景介绍&lt;/h2>
&lt;p>Grafana 的数据源代理是一项合法功能。你配置一个数据源（Prometheus、InfluxDB 等）并指定后端 URL，Grafana 代表仪表板用户将查询转发到该数据源。这样既能将凭据保留在服务端，又能避免 CORS 问题。&lt;/p>
&lt;p>端点格式如下：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>GET /api/datasources/proxy/uid/{uid}/path/to/resource
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>正常使用场景：仪表板执行结构化查询，Grafana 将其转发到数据源，响应返回。流程清晰。&lt;/p>
&lt;p>问题在于：该端点同时充当&lt;strong>原始 HTTP 代理&lt;/strong>，会将你附加的任意路径直接转发到所配置的数据源 URL，而 OSS 版本中没有任何代码对该 URL 的目标进行验证。&lt;/p>
&lt;hr>
&lt;h2 id="漏洞链">漏洞链&lt;/h2>
&lt;p>三个组件组合在一起构成预认证 SSRF：&lt;/p>
&lt;p>&lt;img src="http://burnedsignal.com/images/grafana-ssrf/vulnerability-chain.svg" alt="漏洞链示意图，展示 no-op 验证器、空白名单和匿名访问如何组合">&lt;/p></description></item></channel></rss>