Nextcloud 35.0.0 — 被委派的 Webhooks 管理员可通过 webhook 更新 tokenNeeded 生成 1 小时的管理员应用密码
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-webhook-tokenneeded
技术分析文章:https://abraxaslabs.tech/research/nextcloud-webhook-tokenneeded
Nextcloud Server 35.0.0 - Nextcloud GmbH
WebhooksController::create() 会在调用者不是完整实例管理员时将 tokenNeeded 置空。update() 则不会。一个被委派的 Webhooks 设置管理员(不在 admin 组中)可以在现有 webhook 上存储 tokenNeeded.user_ids: ["admin"],然后在事件触发时,为该 uid 获得一个有效期为 1 小时、无作用域限制的 PERMANENT_TOKEN 应用密码。
一个只被信任管理 webhook 的恶意行为者,可以以 admin(或他们指定的任意用户)身份登录 1 小时,绕过 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,使得在下一个匹配事件发生时,服务器会向他们邮寄一个有效期为 1 小时的登录凭据,可用于他们列出的任意 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。捕获器 JSON 中包含 authentication.user_ids.admin.token。以 Bearer 方式 GET 管理员的私有见证文件返回 200,X-User-Id: admin。
以下情况会让此漏洞失效,但不会让你学到任何东西:update 返回 403(控制器已与 create 匹配);create 已经生成令牌(#60543 不在该构建上);捕获器中 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
将创建时对 isAdmin 置空的处理复制到 update() 中。在该修复发布之前,请勿将 Webhooks 设置委派给非管理员组。
da02f41)GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。