Nextcloud 35.0.0 — un partage fédéré contient un mot de passe d'application non limité pour l'ensemble de l'arborescence Files du partageur
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-federated-ocm-token
Nextcloud Server 35.0.0 - Nextcloud GmbH
Un secret de partage fédéré est généré sous forme de mot de passe d'application PERMANENT_TOKEN sans portée pour le partageur. L'API du destinataire le renvoie comme refresh_token. Le rejouer en tant que Bearer sur le WebDAV de l'expéditeur permet de se connecter en tant que le partageur et de lire des fichiers qui n'ont jamais été partagés.
Un acteur malveillant avec qui vous partagez un seul fichier en fédéré peut se connecter en tant que vous sur votre Nextcloud, contourner la 2FA, et lire ou écraser tous vos fichiers, pas seulement celui que vous avez partagé.
| ID | pas encore de CVE |
| CWE | CWE-269, CWE-287 |
| CVSS | Critique : 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N (destinataire fédéré). La conversion de lien public est pire (pas de compte destinataire sur un pair). |
| Produit | Nextcloud Server |
| Affecté | 35.0.0 (da02f41) officiel nextcloud:35.0.0-apache |
| Auth | destinataire fédéré (ou convertisseur de lien public) |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
Vous partagez un fichier ou dossier avec bob sur un autre Nextcloud. Nextcloud génère un secret de 32 caractères, le stocke comme votre mot de passe d'application, et remet ce secret à Bob comme refresh_token.
Bob (ou quiconque convertit votre lien public en partage fédéré) peut alors :
Il n'obtient pas de shell PHP sur l'hôte. Il n'a pas besoin de votre mot de passe. N'acceptez pas le partage et n'appelez pas d'abord OCM access-token : cet échange verrouille la portée du système de fichiers. Le lab prouve le secret avant échange.
Un partage est censé être un partage. Un fichier. Un dossier. J'ai lu FederatedShareProvider::createFederatedShare sur le tag v35.0.0. Il génère un secret de 32 caractères comme IToken::PERMANENT_TOKEN pour le partageur sans portée. PublicKeyToken::getScopeAsArray définit par défaut SCOPE_FILESYSTEM => true. C'est un mot de passe d'application. Session::tryTokenLogin accepte un Bearer permanent.
Le travail sur l'échange OCM (PR #57234 / #57166) verrouille déjà la portée du système de fichiers après le premier échange. Une analyse non officielle utilisait ce saut post-échange. Je l'ai essayé en premier. Sur cet arbre, le token échangé est TEMPORARY, nommé OCM Access Token, et /remote.php/dav le rejette (allowOcmAccessToken false). DAV a dit non.
Donc je n'ai pas échangé. ocm_discovery_enabled est resté false pour que le destinataire ne l'échange pas à ma place. Deux machines officielles nextcloud:35.0.0-apache, overwrite.cli.url en DNS docker (http://sender / http://recipient). Laissez cela à 127.0.0.1 et le S2S se parle à lui-même.
Alice partage un fichier avec bob@http://recipient. Bob lit les partages en attente. refresh_token longueur 32. access_token longueur 0. Un GET Bearer non authentifié du fichier témoin privé d'Alice, jamais inclus dans le partage, a renvoyé 200, X-User-Id: alice.
cd lab
./run.sh
Cible uniquement http://127.0.0.1:18340 (expéditeur) et :18341 (destinataire).
SUCCESS NEXTCLOUD-OCM-PERMANENT-TOKEN who=federated-recipient uid=alice NEXTCLOUD-OCM-PERMANENT-TOKEN-WITNESS
Générer le secret fédéré avec la portée du système de fichiers à false dès la première insertion. Ne pas accepter ce secret comme Bearer/Basic sur /remote.php/dav. Le premier échange verrouille déjà la portée FS ; la création n'aurait jamais dû distribuer un mot de passe d'application.
GNU Affero GPL v3.0. Voir LICENSE. Lab en boucle locale uniquement. Aucune garantie.