Nextcloud 35.0.0 — o segredo de compartilhamento federado é uma senha de aplicativo sem escopo para toda a árvore de Arquivos do compartilhador
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-federated-ocm-token
Nextcloud Server 35.0.0 - Nextcloud GmbH
Um segredo de compartilhamento federado é gerado como uma senha de aplicativo PERMANENT_TOKEN sem escopo para o compartilhador. A API do destinatário o retorna como refresh_token. Reproduzi-lo como Bearer no WebDAV do remetente autentica como o compartilhador e lê arquivos que nunca foram compartilhados.
Um agente malicioso com quem você compartilha federadamente um único arquivo pode fazer login como você no seu Nextcloud, ignorar o 2FA e ler ou sobrescrever todos os seus arquivos, não apenas o que você compartilhou.
| ID | sem CVE ainda |
| CWE | CWE-269, CWE-287 |
| CVSS | Crítico: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N (destinatário federado). A conversão de link público é pior (sem conta de destinatário em um par). |
| Produto | Nextcloud Server |
| Afetado | 35.0.0 (da02f41) oficial nextcloud:35.0.0-apache |
| Autenticação | destinatário federado (ou conversor de link público) |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Você compartilha um arquivo ou pasta com bob em outro Nextcloud. O Nextcloud gera um segredo de 32 caracteres, armazena-o como sua senha de aplicativo e entrega esse segredo ao Bob como refresh_token.
Bob (ou qualquer pessoa que converta seu link público em um compartilhamento federado) então:
Eles não obtêm um shell PHP no host. Eles não precisam da sua senha. Não aceite o compartilhamento e não chame o OCM access-token primeiro: essa troca bloqueia o escopo do sistema de arquivos. O lab prova o segredo pré-troca.
Um compartilhamento deveria ser um compartilhamento. Um arquivo. Uma pasta. Eu li FederatedShareProvider::createFederatedShare na tag v35.0.0. Ele gera um segredo de 32 caracteres como IToken::PERMANENT_TOKEN para o compartilhador sem escopo. PublicKeyToken::getScopeAsArray define SCOPE_FILESYSTEM => true por padrão. Isso é uma senha de aplicativo. Session::tryTokenLogin aceita um Bearer permanente.
O trabalho de troca OCM (PR #57234 / #57166) já bloqueia o escopo do sistema de arquivos após a primeira troca. Uma análise não oficial usou esse salto pós-troca. Eu tentei isso primeiro. Nesta árvore o token trocado é TEMPORARY, chamado OCM Access Token, e /remote.php/dav o rejeita (allowOcmAccessToken false). O DAV disse não.
Então eu não troquei. ocm_discovery_enabled permaneceu false para que o destinatário não o trocasse por mim. Duas máquinas oficiais nextcloud:35.0.0-apache, overwrite.cli.url como DNS do docker (http://sender / http://recipient). Deixe isso em 127.0.0.1 e o S2S fala consigo mesmo.
Alice compartilha um arquivo com bob@http://recipient. Bob lê compartilhamentos pendentes. refresh_token com comprimento 32. access_token com comprimento 0. GET Bearer não autenticado do arquivo testemunha privado da Alice, nunca incluído no compartilhamento, retornou 200, X-User-Id: alice.
cd lab
./run.sh
Alvo apenas http://127.0.0.1:18340 (remetente) e :18341 (destinatário).
SUCCESS NEXTCLOUD-OCM-PERMANENT-TOKEN who=federated-recipient uid=alice NEXTCLOUD-OCM-PERMANENT-TOKEN-WITNESS
Gere o segredo federado com escopo de sistema de arquivos false desde a primeira inserção. Não aceite esse segredo como Bearer/Basic em /remote.php/dav. A primeira troca já bloqueia o escopo do FS; a criação nunca deveria ter entregado uma senha de aplicativo.
GNU Affero GPL v3.0. Veja LICENSE. Apenas lab em loopback. Sem garantia.