🔴 【深度分析】严重安全漏洞: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. 攻击整合

结合以上弱点,攻击者可发起以下步骤:

  1. 构造请求:POST /user-setup/%20/9999999999
  2. 传递任意的新邮箱和密码参数。
  3. 系统将 invite_hash = ' ' 匹配到数据库中第一个已激活用户(id 最小),并使用 9999999999 通过解密检查。
  4. 端点直接更新该用户的邮箱和密码,然后自动以该用户身份登录(生成会话)。

整个过程无需任何凭据、会话或用户交互,完全匿名。


影响评估

攻击向量 远程网络(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 或类似路径的异常请求。
  • 审查所有活跃用户账号(尤其是最早注册的账号)是否被篡改过邮箱或密码,如有异常应立即重置。

参考资料


警告:该漏洞的利用代码可能已在公开渠道流传,请务必在24小时内采取修复措施,避免被攻击者批量扫描和利用。