漏洞概述 Bitwarden 的 端点存在一个低权限成员可以接管另一个成员 Vault 的漏洞。该漏洞允许攻击者通过构造特定的请求,获取受害者的加密密钥,并利用该密钥解密受害者的整个 Vault。 影响范围 受影响产品: Bitwarden/server 严重程度: 高 (CVSS 8.7) CVE: CVE-2026-60104 报告: HackerOne #3676230 修复: PR #7615 - commit (PM-35401) 修复版本: server release (2026-06-10) 修复方案 1. 修复代码: - 在 方法中,增加对 的检查,确保请求类型为 。 - 增加对 的检查,确保请求中的邮箱与当前认证用户的邮箱一致。 2. 修复步骤: - 在 方法中,增加对 的检查,确保请求类型为 。 - 增加对 的检查,确保请求中的邮箱与当前认证用户的邮箱一致。 POC 代码 路径 A - 密钥泄露(原始报告) 1. 攻击者使用自己的最低权限自定义凭据进行认证。 2. 攻击者生成一个一次性 RSA-2048 密钥对。 3. 攻击者 POST 一个 ,包含受害者的邮箱和自己的公钥。 4. 在组织的设备审批面板中,请求显示为 ,与真实用户不可区分。所有者/管理员批准。 5. 攻击者使用 头检索结果。 6. 攻击者使用自己的私钥 RSA-OAEP 解密密钥,获得受害者的原始 64 字节 Vault 密钥。 路径 B - 缺失链接(完整会话,仅攻击者凭据) 1. 攻击者使用自己的最低权限自定义凭据进行认证。 2. 攻击者捕获受害者的设备 ID(通过 SignalR)。 3. 攻击者生成 RSA-2048 密钥对。 4. 攻击者 POST 一个 ,包含受害者的邮箱和自己的公钥。 5. 受害者批准登录推送。 6. 攻击者使用 头检索结果。 7. 攻击者使用自己的私钥 RSA-OAEP 解密密钥,获得受害者的原始 64 字节 Vault 密钥。 8. 攻击者 POST 一个 ,使用受害者的设备 ID 和自己的访问代码。 9. 攻击者使用受害者的访问令牌 GET ,解密整个 Vault。 披露时间线 2026-04-15: 报告给 HackerOne (#3676230) 2026-04-16: Bitwarden 确认 BOLA 和未认证密钥泄露 2026-04-17: 演示路径 B:端点未强制执行请求类型,允许将 交换为 以获取受害者范围的会话 2026-04-20: 分类并路由给工程团队 2026-05-21: 修复合并到 (PR #7615, commit ) 2026-06-10: 在服务器版本 中发布 2026-06-26: 解决并颁发赏金 2026-07-08: 公开撰写 2026-07-09: CVE-2026-60104 分配给 VulnCheck (CNA) 经验教训 两个身份在一个处理程序中是 BOLA 等待发生:一个来自令牌,一个来自主体。如果代码从不断言它们相等,攻击者将使他们不同意。 一个不固定请求类型的端点继承所有其他类型的权力: 是为 设计的,但它默默地接受了 ,这是一个不同的、更危险的状态机,最终导致可管理的会话令牌。 一个被盗的密钥只是妥协的一半:你还需要密文。一个加密密钥和加密数据解锁通常位于不同的访问检查之后,因此泄漏密钥并不自动泄漏数据。这成为一次完整的接管,因为第二个漏洞——未固定的请求类型——也产生了一个受害者范围的会话来获取数据。始终追踪密钥的所有路径到明文;它本身可能什么都不是。 批准会洗掉攻击者输入:人类点击“批准”重新加密到任何公共密钥,沿着请求一起。他们看到受害者的邮箱并信任它;他们从未看到交换的密钥。 感谢 @mandreko-bitwarden 和 Bitwarden 安全团队在漏洞修复和修复方面的帮助。 — @thesanjok