abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · lago-invite-ato
技术分析文章:https://abraxaslabs.tech/research/lago-invite-ato
Lago v1.53.0 - GetLago
Mutations::Invites::Accept 没有 AuthenticableApiUser。Create/revoke 有。Accept 没有。register_from_invite 通过邀请邮箱加载用户。如果该账户已有成员关系,提交的密码会被丢弃。AuthToken.encode(user:) 仍会执行。该 JWT 是用户作用域的。没有组织声明。客户端会为该用户已归属的任意组织发送 x-lago-organization。包括受害者的组织。createInvite 已经将令牌返回给邀请者。
将 cfo@victim 邀请进一个一次性组织,自己接受邀请,你就在该邮箱已归属的每一个组织中都成为了那个人。全程不涉及邮箱。受害者密码不变。
| ID | 暂无 CVE |
| CWE | CWE-287, CWE-306 |
| CVSS | 严重:9.6 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N |
| 产品 | Lago / lago-api |
| 受影响 | 直至 v1.53.0 的邮箱/密码 acceptInvite |
| 认证 | 组织管理员(organization:members:create);Cloud 注册即可 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
你需要一个自己控制的组织。Cloud 注册即可(LAGO_DISABLE_SIGNUP 默认为 false)。邀请一个受害者邮箱,用假密码在未认证状态下接受邀请,然后切换请求头到 Victim Corp。发票、API 密钥、Stripe、钱包。
这不是一个没有账户的随机访客。不是密码重置。假登录会失败。真实受害者密码仍然有效。Google/Okta 接受会绑定 IdP 邮箱,不是这个漏洞。单组织自托管且数据库中没有任何其他人的邮箱,不会让你获得另一个商户。同一数据库、两个组织、同一邮箱:就会。
与 Stripe 一次性发票 IDOR 属于同一代码树。不同的漏洞。
我读了 Accept(没有 AuthenticableApiUser),然后 find_or_initialize_by(email:),然后跳过密码的成员关系已存在分支,然后 AuthToken.encode(user:)。然后 Google 接受,它确实检查 google_oidc["email"] == invite.email。邮箱/密码接受不会绑定现有用户的密码。
第一个注意到这一点的客户端会邀请一个未使用的地址,接受它,并得到一个全新的 Lago 用户,密码就是他们提交的那个。这是特性。证据是现有受害者用户 id 被返回。
已记录的弯路:用 Google/Okta 接受;把没有 JWT 时 createInvite 返回 401 当作全部真相(create 是认证的,accept 不是);在 currentUser 上只看攻击者组织(线索是列表中的 Victim Corp);假密码能登录(那意味着哈希被覆盖了——实验环境断言它没有被覆盖);反弹 shell。作秀。没有收件箱。
然后:两次 registerUser 调用分别植入 Victim Corp 和 Attacker Corp。每次运行都使用全新邮箱,以免脏卷导致 422 user_already_exists。对受害者邮箱调用 createInvite。使用虚拟密码进行未认证的 acceptInvite。返回的用户 id 与受害者匹配。currentUser.organizations 列出两者。切换请求头后返回 Victim Corp。
cd lab
./run.sh
仅针对 http://127.0.0.1:13000。Stripe IDOR 使用了 13001。无 UI 端口。
IOC victim_password_unchanged
IOC victim_real_password_still_works
SUCCESS LAGO-INVITE-ATO acceptInvite JWT is existing victim; lists Victim Corp; no inbox
如果用户已存在,则要求其以本人身份进行认证(或证明邮箱 / IdP 归属)后,再附加成员关系。不得从未经认证的接受操作中为已存在用户签发 JWT。如果邀请 token 是一种能力凭证,则停止将其返回给邀请者。
accept.rb · accept_service.rb · users_service.rb · create.rb · object.rb · google_service.rbGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。