Bitwarden Server v2026.9.2 - 高危 - IDOR - 将可解密的保险库项目植入调用者无权写入的集合中
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · bitwarden-cipher-create-acl
Bitwarden Server v2026.9.2 - Bitwarden
在 Entity Framework 路径(MariaDB、Postgres、SQLite)上创建组织密码库条目时,会在附加到集合之前丢弃调用者 id。已确认的成员可以将一个组织密钥条目植入他们无权写入的集合中。集合成员会将其作为普通共享登录项同步。
| ID | 暂无 CVE |
| CWE | CWE-863 / CWE-639 |
| CVSS | 高危:7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L |
| 产品 | Bitwarden Server |
| 受影响版本 | v2026.9.2 (9ee4e0eb) lite EF(MariaDB / Postgres / SQLite)。MSSQL/Dapper 保留 @UserId。 |
| 认证 | 已确认的组织成员 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
攻击者向共享集合中添加密码库条目。他们无法读取或替换其中已有的机密。
已确认的组织成员已经拥有组织密钥,因此新条目会对所有能看到该集合的人解密。Bitwarden 会将其显示为公司密码库内的普通共享登录项、笔记、卡片或 SSH 密钥。
Okta、GitHub、VPN、Payroll)的登录项,其 URI 指向攻击者控制的服务器。集合成员从 Bitwarden 打开它,就会落到攻击者页面,或对仿冒页面自动填充。new AWS key、bastion SSH key、DB password after change)。有人会将其复制到生产环境或终端中。Production 的承包商在 lite EF 上仍可向其中植入新条目。如果他们对目标集合没有访问权限,POST /api/ciphers/create 可能在写入已提交后返回 404。受害者仍会在同步时收到该条目。
在 2026 年那一波之后,我锁定了 bitwarden/server v2026.9.2(9ee4e0eb):管理员请求 TDE(CVE-2026-60104)、SSO ExternalId 截断(CVE-2026-101878)、组织导入空集合(CVE-2026-43638)。这些都已修复。但创建时的集合 ACL 没有。
CiphersController.PostCreate 只检查组织成员身份,然后在设置了 OrganizationId 时传入 skipPermissionCheck: true。SaveDetailsAsync 随后将“该集合存在于组织中”视为唯一的集合检查。
Lite MariaDB/Postgres/SQLite 使用 EF。CreateAsyncReturnCipher 因为存在组织 id 而设置 cipher.UserId = null,然后将这个 null 传入 UpdateCollectionsAsync。Null 用户 id 意味着组织中的所有集合。SQL Server Dapper 为 Cipher_UpdateCollections 保留 @UserId(ReadOnly = 0)。那条路径是反例。
已记录的弯路:将云端的 POST /organizations 当作自托管创建(它是 [NotSelfHostedOnly];lite 需要许可证文件,因此实验环境在注册后直接播种组织行);植入到调用者无法读取的集合中,并将 HTTP 404 当作失败(CollectionCipher 行已经提交);假设 MSSQL lite 会显示它(Dapper 不会丢弃调用者 id);关闭 BW_ENABLE_ADMIN 导致 lite 从不迁移 User / OrganizationDomain(在此镜像上 admin 是 EF 迁移器);在 /identity/connect/token 上省略 Bitwarden-Client-Version,然后看着密码授权返回 400。一个反弹 shell。纯属表演。
cd lab
./run.sh
目标仅为 http://127.0.0.1:18160。镜像 ghcr.io/bitwarden/lite:2026.9.2 加上 MariaDB。
SUCCESS BITWARDEN-CIPHER-CREATE-ACL create-http=404 collectioncipher=1 victim-sync-has-cipher=yes cipher=<id> negative-http=404 readonly-http=200 BITWARDEN-CIPHER-CREATE-ACL-WITNESS
无访问权限的植入在 CollectionCipher 提交后返回 404。受害者的 GET /api/ciphers 和 /api/sync 都包含新 id。对 B 的只读访问返回 200 且仍能植入。外部组织的集合保持 404,且没有连接行。
将保存用户 id 传入 EF 的 UpdateCollectionsAsync,就像 CipherDetails_CreateWithCollections 在将存储的 UserId 列置空后仍传递 @UserId 一样。在成员创建路径上,不要将 null 用户视为“所有集合”。存在于组织中并不等于写入权限。
CiphersController.cs(Post、PostCreate)CipherService.cs(SaveDetailsAsync)CipherRepository.cs(CreateAsyncReturnCipher、UpdateCollectionsAsync)