Nextcloud 35.0.0 — 联邦共享密钥是一个未限定作用域的应用密码,可访问共享者的整个文件树
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-federated-ocm-token
Nextcloud Server 35.0.0 - Nextcloud GmbH
联邦共享密钥会以未限定作用域的 PERMANENT_TOKEN 应用密码形式为共享者生成。接收方 API 会将其作为 refresh_token 返回。将其作为 Bearer 在发送方 WebDAV 上重放,即可登录为共享者并读取从未被共享的文件。
与你联邦共享一个文件的恶意行为者,可以在你的 Nextcloud 上以你的身份登录、绕过 2FA,并读取或覆盖你的所有文件,而不仅仅是你共享的那一个。
| ID | 暂无 CVE |
| CWE | CWE-269, CWE-287 |
| CVSS | 严重:8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N(联邦接收方)。公开链接转换更严重(对端无需接收方账户)。 |
| 产品 | Nextcloud Server |
| 受影响版本 | 35.0.0(da02f41)官方 nextcloud:35.0.0-apache |
| 认证 | 联邦接收方(或公开链接转换者) |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
你将一个文件或文件夹共享给另一个 Nextcloud 上的 bob。Nextcloud 会生成一个 32 字符的密钥,将其存储为你的应用密码,并将该密钥作为 refresh_token 交给 Bob。
随后 Bob(或任何将你的公开链接转换为联邦共享的人)可以:
他们不会在主机上获得 PHP shell。他们不需要你的密码。不要接受该共享,也不要先调用 OCM access-token:该交换会锁定文件系统作用域。本实验证明的是交换前的密钥。
共享本应只是共享。一个文件。一个文件夹。我阅读了 tag v35.0.0 上的 FederatedShareProvider::createFederatedShare。它为共享者生成了一个 32 字符的密钥作为 IToken::PERMANENT_TOKEN,且没有作用域限制。PublicKeyToken::getScopeAsArray 默认 SCOPE_FILESYSTEM => true。这就是一个应用密码。Session::tryTokenLogin 接受永久 Bearer。
OCM 交换相关工作(PR #57234 / #57166)已经在首次交换之后锁定文件系统作用域。一份非官方文章使用了该交换后的跳转。我先尝试了它。在此代码树上,交换后的令牌是 TEMPORARY,名为 OCM Access Token,且 /remote.php/dav 会拒绝它(allowOcmAccessToken 为 false)。DAV 说了不。
所以我没有进行交换。ocm_discovery_enabled 保持为 false,这样接收方就不会替我交换它。两个官方 nextcloud:35.0.0-apache 实例,overwrite.cli.url 设为 docker DNS(http://sender / http://recipient)。将其保留为 127.0.0.1 会导致 S2S 与自己通信。
Alice 将一个文件共享给 bob@http://recipient。Bob 读取待处理共享。refresh_token 长度为 32。access_token 长度为 0。对 Alice 的私有见证文件(从未在共享中)进行未认证 Bearer GET,返回 200,X-User-Id: alice。
cd lab
./run.sh
目标仅为 http://127.0.0.1:18340(发送方)和 :18341(接收方)。
SUCCESS NEXTCLOUD-OCM-PERMANENT-TOKEN who=federated-recipient uid=alice NEXTCLOUD-OCM-PERMANENT-TOKEN-WITNESS
从首次插入起,就以文件系统作用域为 false 生成联邦密钥。不要在 /remote.php/dav 上接受该密钥作为 Bearer/Basic。首次交换已经锁定 FS 作用域;创建时本就不应发放应用密码。
GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无任何担保。