Nextcloud 35.0.0 — il segreto della condivisione federata è una password applicativa senza ambito per l'intero albero Files del condivisore
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-federated-ocm-token
Nextcloud Server 35.0.0 - Nextcloud GmbH
Un segreto di condivisione federata viene generato come app password PERMANENT_TOKEN senza scope per chi condivide. L'API del destinatario lo restituisce come refresh_token. Replicandolo come Bearer sul WebDAV del mittente si accede come chi ha condiviso e si leggono file che non erano mai stati condivisi.
Un malintenzionato con cui hai condiviso in federazione un solo file può accedere come te sul tuo Nextcloud, aggirare il 2FA e leggere o sovrascrivere tutti i tuoi file, non solo quello che hai condiviso.
| ID | nessuna CVE al momento |
| CWE | CWE-269, CWE-287 |
| CVSS | Critico: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N (destinatario federato). La conversione da link pubblico è peggiore (nessun account destinatario su un peer). |
| Prodotto | Nextcloud Server |
| Affetto | 35.0.0 (da02f41) ufficiale nextcloud:35.0.0-apache |
| Auth | destinatario federato (o convertitore di link pubblico) |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Condividi un file o una cartella con bob su un altro Nextcloud. Nextcloud genera un segreto di 32 caratteri, lo memorizza come la tua app password e consegna quel segreto a Bob come refresh_token.
Bob (o chiunque converta il tuo link pubblico in una condivisione federata) quindi:
Non ottengono una shell PHP sull'host. Non hanno bisogno della tua password. Non accettare la condivisione e non chiamare prima OCM access-token: quello scambio blocca lo scope del filesystem. Il lab dimostra il segreto pre-scambio.
Una condivisione dovrebbe essere una condivisione. Un file. Una cartella. Ho letto FederatedShareProvider::createFederatedShare sul tag v35.0.0. Genera un segreto di 32 caratteri come IToken::PERMANENT_TOKEN per chi condivide senza alcuno scope. PublicKeyToken::getScopeAsArray imposta di default SCOPE_FILESYSTEM => true. Questa è un'app password. Session::tryTokenLogin accetta un Bearer permanente.
Il lavoro sullo scambio OCM (PR #57234 / #57166) blocca già lo scope del filesystem dopo il primo scambio. Un writeup non ufficiale ha usato quel passaggio post-scambio. L'ho provato per primo. Su questo albero il token scambiato è TEMPORARY, chiamato OCM Access Token, e /remote.php/dav lo rifiuta (allowOcmAccessToken false). DAV ha detto no.
Quindi non ho effettuato lo scambio. ocm_discovery_enabled è rimasto false così il destinatario non l'avrebbe scambiato per me. Due box ufficiali nextcloud:35.0.0-apache, overwrite.cli.url come DNS docker (http://sender / http://recipient). Lascialo su 127.0.0.1 e S2S parla con se stesso.
Alice condivide un file con bob@http://recipient. Bob legge le condivisioni in sospeso. refresh_token lunghezza 32. access_token lunghezza 0. Una GET Bearer non autenticata del file testimone privato di Alice, mai nella condivisione, ha restituito 200, X-User-Id: alice.
cd lab
./run.sh
Target solo http://127.0.0.1:18340 (mittente) e :18341 (destinatario).
SUCCESS NEXTCLOUD-OCM-PERMANENT-TOKEN who=federated-recipient uid=alice NEXTCLOUD-OCM-PERMANENT-TOKEN-WITNESS
Generare il segreto federato con scope del filesystem false fin dal primo inserimento. Non accettare quel segreto come Bearer/Basic su /remote.php/dav. Il primo scambio blocca già lo scope FS; la creazione non avrebbe mai dovuto distribuire un'app password.
GNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.