OpenCost暴露和管理绕过漏洞CVE-2026-67349
OpenCost 是CNCF孵化级、厂商中立的开源云原生成本监控工具,主打Kubernetes集群资源费用统计与分摊,基于 Apache 2.0 协议。
一、基本情况
OpenCost 是Kubecost开源内核,无企业付费功能、无官方商业支持,适合自建 FinOps 成本体系、不想依赖商业付费产品的运维团队。

OpenCost 可以对接 AWS、Azure、GCP 等公有云账单接口,也支持自建本地机房自定义定价,统一汇总多云 + 本地集群的全部支出。
栋科技漏洞库关注到OpenCost相关版本中未经身份验证的Helm值暴露和管理绕过漏洞,追踪为CVE-2026-67349,CVSS 4.0评分 8.7。
二、漏洞分析
CVE-2026-67349是 OpenCost 在1.221.0之前版本中,无法对GET/helmValues端点进行身份验证,导致 Helm 值暴露和管理绕过漏洞。
该漏洞暴露了包含云提供商凭据的base64解码的HELM_VALUES环境变量。
当ADMIN_TOKEN未设置时,adminAuthMiddleware无法打开,
允许未经身份验证的攻击者通过POST/serviceKey修改GCP服务帐户密钥,以重定向计费呼叫。
具体来说,OpenCost在其HTTP API上暴露了两个身份验证弱点:
GET/helmValues是无条件未经身份验证的——处理程序注册时没有任何类型的auth包装器。
在Helm部署的标准OpenCost实例中,Helm_VALUES环境变量由具有完整部署值的图表填充,
这可能包括云提供商API密钥、对象存储凭据或传递为Helm的其他机密价值观。
任何网络可访问的呼叫者都可以在没有凭据的情况下读取此数据。
adminAuthMiddleware默认情况下无法打开——中间件仅强制使用Bearer令牌
当设置ADMIN_TOKEN环境变量时。未设置时(默认为每次刷新安装),中间件记录警告并传递所有请求。
突变终点由该中间件(POST/serviceKey、GET/cloud/config/enable、GET/cloud等)封装,
GET/cloud/config/disable、GET/cloud-config/delete)因此未经身份验证在默认部署中。
发现1-GET/helmValues缺少任何身份验证包装
pkg/costmodel/router.go:574:
router.POST("/serviceKey", adminAuthMiddleware(a.AddServiceKey)) // line 573: has middleware
router.GET("/helmValues", a.GetHelmValues) // line 574: NO middleware
紧邻路由(POST/serviceKey)承载adminAuthMiddleware。
这个/helmValues路由没有,甚至选择加入版本也没有。这是一种结构上的不一致没有任何保护层。
处理程序(pkg/costmodel/router.go:408-425)解码并返回HELM_VALUES没有任何身份验证检查的环境变量:
func (a *Accesses) GetHelmValues(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
encodedValues := sysenv.Get("HELM_VALUES", "")
if encodedValues == "" {
fmt.Fprintf(w, "Values reporting disabled")
return
}
result, _ := base64.StdEncoding.DecodeString(encodedValues)
w.Write(result)
}
在Helm部署的OpenCost实例中,图表将Helm_VALUES设置为base64编码部署值。
任何包含机密的值(云API密钥、计费集成凭据)被返回给未经身份验证的调用者。
发现2-adminAuthMiddleware处于选择加入状态,打开失败
pkg/costmodel/router。go:134-155:
func adminAuthMiddleware(next httprouter.Handle) httprouter.Handle {
return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
adminToken := env.GetAdminToken()
if adminToken == "" {
log.DedupedWarningf(5, "Admin token (ADMIN_TOKEN) not configured; write operations are unauthenticated")
next(w, r, ps) // passes through unconditionally
return
}
// ... token check only reached when ADMIN_TOKEN is set
}
}
pkg/env/costmodel.go:118-120:GetAdminToken()返回env。获取(“ADMIN_TOKEN”,“”)--
默认值为空字符串,因此每次新部署都处于故障打开模式。
受影响的路由(在默认部署中,所有路由都可以在没有凭据的情况下访问):
POST/serviceKey--将任意字节写入GCP服务帐户密钥文件(配置路径中的key.json),
替换云凭据GET/cloud/config/enable、/cloud/config/disable、/cloud-config/delete--操纵云计费集成,
导致数据管道中断
GET/cloud/config/export——导出云计费集成结构
三、POC概念验证
在ghcr.io/opencost/opencost:最新版本(v1.120.2,cb9a0cb)上测试,由一种k8s集群支持。
HELM_VALUES设置为包含假云凭据的base64编码测试对象。
集装箱警告确认打开模式失败:
WRN Admin token (ADMIN_TOKEN) not configured; write operations are unauthenticated
步骤1-GET/helmValues返回没有凭据的机密:
[/lv]
GET /helmValues HTTP/1.1
Host: opencost:9003
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json
{"cloudCostConfig":{"awsSecretAccessKey":"AKIA_ATTACKER_SECRET_KEY","apiKey":"sk-attacker-verysecret-4567"}}
[/lv]
步骤2——接受POST/serviceKey,但未进行身份验证(已到达处理程序,尝试写入):
管理员已设置登录后刷新可查看带有写入错误(测试环境中没有目录)的HTTP 200确认
在没有任何身份验证质询的情况下调用了处理程序。在生产GCP部署中
目录存在,写入成功,替换GCP服务帐户密钥。
四、影响范围
OpenCost <1.121.0
五、修复建议
OpenCost ≥ 1.121.0
六、参考链接
管理员已设置登录后刷新可查看