首页 网络安全 正文

Chatwoot认证绕过漏洞CVE-2026-63765

摘要

栋科技漏洞库关注到Chatwoot在4.16.0 版本之前的直传文件控制器存在认证绕过漏洞,追踪为CVE-2026-63765,CVSS 4.0评分8.8。

Chatwoot 是基于 Ruby+Vue 开发、MIT 开源的私有化全渠道客服工单平台,对标商用工具 Zendesk、Intercom,且支持本地自建部署。

一、基本情况

Chatwoot全渠道统一消息工作台,一站式聚合所有客户沟通渠道,同一客户多平台消息自动合并对话上下文,客户数据完全自主管控。

Chatwoot存在的认证绕过漏洞CVE-2026-63765

Chatwoot 适合跨境电商售前售后、SaaS 产品客户支持、海外品牌官网客服、需要数据本地留存的企业咨询系统、有私有化需求团队。

栋科技漏洞库关注到Chatwoot在4.16.0 版本之前的直传文件控制器存在认证绕过漏洞,追踪为CVE-2026-63765,CVSS 4.0评分8.8。

二、漏洞分析

CVE-2026-63765是Chatwoot直传文件控制器认证绕过漏洞,未认证攻击者可在任意租户账号下创建任意 ActiveStorage 二进制存储块。

由于控制器缺少身份校验逻辑,攻击者可定位任意账号和会话获取签名 PUT 上传地址,向后端写入任意数据,直接上传任意Blob创建。

会话直传文件控制器直接继承ActiveStorage::DirectUploadsController,

而非需要鉴权的 API 基类,因此继承链中不会执行用户身份校验方法authenticate_user!;仅剩的权限校验逻辑在未登录访问时会跳过。

未认证的网络攻击者可在任意租户账户创建存储 Blob,并获取一次性签名 PUT 上传链接,向服务存储写入任意内容。

源码测试验证:请求者current_user为空时,请求仍能抵达存储上传逻辑并返回合法上传签名链接。

(一)漏洞入口文件:

app/controllers/api/v1/accounts/conversations/direct_uploads_controller.rb第 9 行调用父类create方法,

执行 Rails 7.1.5.2 内置的ActiveStorage::DirectUploadsController#create

该方法会生成数据库 Blob 记录并返回一次性签名 PUT 上传地址。

(二)对应路由:

POST /api/v1/accounts/:account_id/conversations/:conversation_id/direct_uploads

(路由配置文件 config/routes.rb 第 153 行)

该控制器父类为原生存储上传控制器,而非鉴权基类Api::V1::Accounts::BaseController。

身份校验函数authenticate_user!仅注册在Api::BaseController中,不在此控制器继承链内。

唯一的账号校验来自工具类EnsureCurrentAccountHelper#ensure_current_account,

其权限判断包裹在if current_user条件内(ensure_current_account_helper.rb 13-15 行)。

未登录时current_user为空,校验逻辑直接跳过,系统直接返回目标账号。

三、POC概念验证

1、攻击流程

(1)获取目标账号:

current_account直接通过 ID 查询数据库激活账号,

因用户未登录,不会执行账号访问权限校验函数account_accessible_for_user?,无租户身份限制;

(2)获取会话:基于当前账号,通过自增可猜测的展示 ID 查询会话;

(3)创建上传凭证:仅当账号 / 会话不存在时才会拦截请求,校验通过后调用父类方法生成存储 Blob 并返回签名上传链接;

(4)全局控制器关闭 CSRF 防护,无跨站校验拦截。

(2)漏洞突破边界:

外部无认证攻击者可直接访问各租户仅允许登录用户使用的文件存储模块。

同类型组件Api::V1::Widget::DirectUploadsController通过站点令牌完成鉴权,仅有账号会话上传接口缺失鉴权逻辑。

2、POC代码

管理员已设置登录后刷新可查看

3、验证方式:

安装项目配套 Rails(actionpack 7.1.5.2),加载项目原始文件(账号校验辅助文件与对应控制器代码),

仅对外部数据模型做模拟,强制当前用户为空,通过 Rack::Test 驱动控制器回调流程完成测试:

HTTP status: 200
Body: SINK REACHED: blob created + signed upload URL returned
Current.account set? true

权限校验逻辑被设置为触发即抛出异常,但全程并未执行,

足以证明 if current_user 判断会对未认证请求直接跳过全部授权校验,请求可直达 ActiveStorage 上传处理逻辑。

4、危害影响

攻击者无需认证即可在任意账号创建存储二进制对象,同时获取签名PUT上传链接,

能够向配置的存储后端(本地磁盘、S3、GCS)写入任意数据。

可造成存储滥用、服务器资源耗尽、在应用存储域名存放攻击者可控文件、数据库堆积大量无关联孤立存储记录,

且该攻击无需登录、可跨租户实施。

若部署环境将存储域名视作可信资源,漏洞危害会进一步放大。

5、修复方案

为该控制器增加身份校验,例如继承带鉴权能力的API基类,或手动强制开启身份校验与会话权限校验:

class Api::V1::Accounts::Conversations::DirectUploadsController < ActiveStorage::DirectUploadsController
  include AccessTokenAuthHelper
  before_action :authenticate_user!          # or authenticate_access_token! for token clients
  # keep current_account + conversation, and require the conversation be accessible to current_user
  # via ConversationPolicy#show? / PermissionFilterService
end

因此已认证客服仅能向自身有权访问的收件箱 / 团队下的会话上传文件。

四、影响范围

Chatwoot < 4.16.0

五、修复建议

Chatwoot ≥ 4.16.0

六、参考链接

管理员已设置登录后刷新可查看



扫描二维码,在手机上阅读
评论
更换验证码
友情链接