🔴 严重 | CVE-2026-53595 — FreeScout is a free help desk and shared inbox bui...
🔴 【深度分析】严重安全漏洞:CVE-2026-53595
CVSS 评分: 严重(9.4)🔴 状态: Deferred 发布时间: 2026-07-20
🔍 技术细节速览
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2026-53595 |
| CVSS 评分 | 9.4 🔴 |
| 严重程度 | 严重 |
| CVSS 向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L |
| CWE 分类 | CWE-178,CWE-287,CWE-640 |
| 发布时间 | 2026-07-20 |
| 最后更新 | 2026-07-21 |
| 状态 | Deferred |
| 数据来源 | security-advisories@github.com |
漏洞概述
CVE-2026-53595 是一个影响 FreeScout 开源帮助台系统的严重身份认证绕过漏洞,攻击者可在无需任何认证的情况下,利用 MySQL/MariaDB 的字符串比较特性与解密函数的异常行为,直接接管系统中活动时间最早的账号(包括支持代理或管理员)。该漏洞危害极大,可导致攻击者完全控制目标账号、窃取敏感数据并执行未授权操作。
- CVSS 评分:9.4(严重)
- CVSS 向量:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L- 攻击向量(AV:N):远程网络可达,无需物理接触。
- 攻击复杂度(AC:L):利用条件简单,无需特殊环境或复杂步骤。
- 权限要求(PR:N):无需任何前置权限或有效会话。
- 用户交互(UI:N):不需要受害者参与。
- 影响范围:机密性和完整性均为高,可用性为低(攻击者可修改账号信息但不会直接导致服务中断)。
受影响组件与版本
- 产品:FreeScout(基于 Laravel 框架的免费帮助台与共享收件箱系统)
- 受影响版本:< 1.8.224
- 修复版本:1.8.224 及以上
漏洞原理分析
该漏洞由多个设计缺陷组合而成,最终形成一条完整的攻击链:
1. 账号选择逻辑缺陷:仅依赖 invite_hash 字段
在 FreeScout 的用户激活流程中,公开端点 POST /user-setup/{hash}/{invite_sent_at}(对应 OpenController@userSetupSave)用于设置新用户的邮箱和密码。该端点通过 URL 路径中的 {hash} 参数直接与数据库中的 invite_hash 列进行匹配,从而确定目标用户账号,未对请求者身份做任何认证。这本身并不一定是漏洞,因为 invite_hash 应为用户激活邀请链接中的唯一随机值。
2. MySQL/MariaDB 字符串比较行为:尾部空格被忽略
一旦用户完成激活,系统会将其 invite_hash 字段设置为空字符串('')。在 MySQL/MariaDB 中,VARCHAR 类型的字段进行等值比较时,会忽略尾部空格。这意味着:
- 数据库中存储的
invite_hash = ''(空字符串) - 攻击者将 URL 参数中的
hash设置为%20(即一个空格字符 URL 编码后的) - 查询条件
WHERE invite_hash = ' '在 MySQL/MariaDB 下等价于WHERE invite_hash = '',从而匹配到所有invite_hash为空字符串的用户(即已经激活的用户)。由于查询返回多条记录时,数据库通常会返回第一条(通常按主键或插入顺序),因此攻击者会匹配到系统中id最小的已激活用户,很可能是一个较早注册的支持代理或通过邀请添加的管理员。
3. 解密函数的安全缺陷:失败时返回原始输入
除了账号选择之外,端点还通过 {invite_sent_at} 参数进行时间戳验证,防止过期的邀请链接被滥用。该参数会被送入 Helper::decrypt 方法,使用目标用户的密码哈希作为密钥进行解密,然后比较解密后的时间戳与当前时间是否在 TTL(time-to-live)范围内。
然而,Helper::decrypt 方法在解密失败时(例如传入的不是有效密文)会直接返回原始输入,不做任何修改。因此,攻击者可以构造一个简单的数值(如 9999999999)作为 invite_sent_at 参数:
- 该数值无法被正确解密(因为密钥不匹配),但解密函数仍原样返回
9999999999 - 系统将其视为一个未来的时间戳(远大于当前时间),从而绕过 TTL 检查,使该请求被视为有效。
4. 攻击整合
结合以上弱点,攻击者可发起以下步骤:
- 构造请求:
POST /user-setup/%20/9999999999 - 传递任意的新邮箱和密码参数。
- 系统将
invite_hash = ' '匹配到数据库中第一个已激活用户(id 最小),并使用9999999999通过解密检查。 - 端点直接更新该用户的邮箱和密码,然后自动以该用户身份登录(生成会话)。
整个过程无需任何凭据、会话或用户交互,完全匿名。
影响评估
| 攻击向量 | 远程网络(AV:N) |
|---|---|
| 攻击复杂度 | 低(AC:L):仅需发送一个特制 HTTP POST 请求 |
| 所需权限 | 无(PR:N) |
| 利用条件 | 目标系统必须使用 MySQL/MariaDB 数据库(Laravel 默认支持,但使用 PostgreSQL 或 SQLite 不受此字符串空格问题影响) |
| 潜在后果 | 攻击者可劫持系统中活跃时间最早的账号(通常是管理员或支持代理),完全控制该账号后: • 读取所有工单、邮件、客户信息(高机密性影响) • 修改系统配置、删除数据、创建其他恶意账号(高完整性影响) • 可能导致服务降级但非直接拒绝服务(低可用性影响) |
严重性评估:由于 CVSS 评分高达 9.4,且利用成本极低,该漏洞属于紧急级别,应立即修复。
修复建议
1. 立即升级到修复版本
- 官方已在 FreeScout 1.8.224 中修复该漏洞。请所有受影响用户尽快将系统升级至该版本或更高。
- 升级命令(若使用 Git 部署):
git pull origin master php artisan migrate
2. 临时缓解措施(无法立即升级时)
- 限制公开端点访问:在 Web 服务器(Nginx/Apache)层面,对
/user-setup/*路径实施 IP 白名单或增加验证码(但注意原功能是为新用户激活设计,需权衡可用性)。 - 修改数据库引擎:如果可能,临时将数据库切换为 PostgreSQL 或 SQLite(需评估兼容性),避免 MySQL/MariaDB 的字符串空格比较行为被利用。
- 加强密钥管理:检查
Helper::decrypt方法是否已修复,确保解密失败时应返回失败状态而非原始输入。
3. 安全审计
- 建议检查系统日志中是否有针对
/user-setup/%20或类似路径的异常请求。 - 审查所有活跃用户账号(尤其是最早注册的账号)是否被篡改过邮箱或密码,如有异常应立即重置。
参考资料
- CVE 详情:https://nvd.nist.gov/vuln/detail/CVE-2026-53595
- 相关 CWE:
- FreeScout 官方安全公告:https://github.com/FreeScout/FreeScout/security/advisories/GHSA-xxxx-xxxx-xxxx(注:实际公告链接需从 NVD 参考中获取,此处因数据未提供具体 GitHub 公告 ID,建议访问 FreeScout 的 Security Advisories 页面)
- MySQL 文档 - 字符串比较:https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html(解释了
VARCHAR比较忽略尾部空格的行为) - Laravel 加密行为:Laravel 的
Crypt::decrypt在失败时会抛出异常,但 FreeScout 的自定义Helper::decrypt存在问题,建议开发者参考 Laravel 官方实现加固。
警告:该漏洞的利用代码可能已在公开渠道流传,请务必在24小时内采取修复措施,避免被攻击者批量扫描和利用。