Nextcloud 35.0.0 — 被委派的 Webhooks 管理员可通过 webhook 更新 tokenNeeded 生成 1 小时的管理员应用密码
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-webhook-tokenneeded
Nextcloud Server 35.0.0 - Nextcloud GmbH
WebhooksController::create() 会将 tokenNeeded 置空,除非调用者是完整的实例管理员。update() 则不会。一个被委派的 Webhooks 设置管理员(不在 admin 组中)可以在现有 webhook 上存储 tokenNeeded.user_ids: ["admin"],然后在事件触发时,为该 uid 收到一个一小时有效的、无作用域限制的 PERMANENT_TOKEN 应用密码。
一个仅被信任管理 webhook 的恶意行为者,可以以 admin(或他们指定的任何用户)身份登录一小时,绕过 2FA,并读取或覆盖该用户的文件。
| ID | 暂无 CVE |
| CWE | CWE-863, CWE-269 |
| CVSS | 高危:8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 产品 | Nextcloud Server |
| 受影响版本 | 35.0.0 (da02f41) 官方 nextcloud:35.0.0-apache |
| 认证 | 被委派的 Webhooks 设置管理员(IDelegatedSettings) |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅限 127.0.0.1 |
你把 Webhooks 设置工作交给了某人。他们不在 admin 组中。Nextcloud 仍然允许他们编辑现有 webhook,使得在下一个匹配事件发生时,服务器会向他们邮寄一个一小时有效的登录凭证,可用于他们列出的任何 uid,包括 admin。
凭借该登录凭证,他们可以:
他们不需要主机上的 PHP shell。他们不需要是完整的实例管理员。互联网上没有账户的陌生人无法做到这一点。漏洞在于你已经信任管理 webhook 的员工,冒充了你并未信任的人。
WebhooksController 是 #[AuthorizedAdminSetting(settings: Admin::class)]。Admin 实现了 IDelegatedSettings。这就是 Nextcloud 将设置面板交给非 admin 组的方式。
tokenNeeded 要求服务器在 webhook 触发时为指定 uid 附加认证令牌。TokenService::createEphemeralToken 生成 IToken::PERMANENT_TOKEN,其 password = null。应用密码。2FA 已被绕过。
PR #60543 对 create 进行了限制:除非你是完整的实例管理员,否则 tokenNeeded 会被置空。我以被委派用户 hooker 创建了一个 webhook,带有 tokenNeeded.user_ids: ["admin"]。存储的 tokenNeeded 为 []。Create 已被限制。有一瞬间,这看起来像是一个已完成的补丁。
然后我将相同的请求体 POST 到 /webhooks/{id}。存储的 user_ids 为 ['admin']。update() 从未复制那个 if。
以 hooker 身份 PUT 一个文件,使 NodeCreatedEvent 触发。Cron 运行 WebhookCall。Catcher JSON 中包含 authentication.user_ids.admin.token。以 Bearer 方式 GET 管理员的私有见证文件返回了 200,X-User-Id: admin。
以下情况会让此漏洞失效,但不会给你任何有用的信息:update 返回 403(控制器已与 create 匹配);create 已经生成令牌(#60543 不在该构建上);catcher 中 authentication 为空(cron 未生成);ExApp 头路径(实验用户是被委派的 hooker)。
cd lab
./run.sh
目标仅限 http://127.0.0.1:18320(Nextcloud)和 :18321(catcher)。
SUCCESS NEXTCLOUD-WEBHOOK-TOKENNEEDED who=delegated-webhook-admin uid=admin NEXTCLOUD-WEBHOOK-TOKENNEEDED-WITNESS
将 create 中的 isAdmin 置空逻辑复制到 update() 中。在该修复发布之前,不要将 Webhooks 设置委派给非管理员组。
da02f41)GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。