
Nextcloud 35.0.0 — un amministratore con delega Webhooks può generare una password applicativa admin della durata di 1h tramite l'aggiornamento del webhook tokenNeeded
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-webhook-tokenneeded
Nextcloud Server 35.0.0 - Nextcloud GmbH
WebhooksController::create() azzera tokenNeeded a meno che il chiamante non sia un amministratore completo dell'istanza. update() no. Un amministratore delegato delle impostazioni Webhooks (non nel gruppo admin) può memorizzare tokenNeeded.user_ids: ["admin"] su un webhook esistente, e poi ricevere una password applicativa PERMANENT_TOKEN non limitata, della durata di un'ora, per quell'uid quando l'evento si attiva.
Un malintenzionato a cui era stato affidato solo il compito di gestire i webhook può accedere come admin (o come qualsiasi utente da lui indicato) per un'ora, aggirare il 2FA e leggere o sovrascrivere i file di quella persona.
| ID | nessuna CVE al momento |
| CWE | CWE-863, CWE-269 |
| CVSS | Alto: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Prodotto | Nextcloud Server |
| Affetto | 35.0.0 (da02f41) ufficiale nextcloud:35.0.0-apache |
| Auth | amministratore delegato delle impostazioni Webhooks (IDelegatedSettings) |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Hai assegnato a qualcuno il compito delle impostazioni Webhooks. Non è nel gruppo admin. Nextcloud gli consente comunque di modificare un webhook esistente in modo che, al successivo evento corrispondente, il server gli invii per email un accesso di un'ora per qualsiasi uid elencato, incluso admin.
Con quell'accesso può:
Non ha bisogno di una shell PHP sull'host. Non ha bisogno di essere un amministratore completo dell'istanza. Un estraneo su internet senza account non può farlo. La falla è il dipendente di cui ti sei già fidato per i webhook, che impersona le persone di cui non ti fidavi.
WebhooksController è #[AuthorizedAdminSetting(settings: Admin::class)]. Admin implementa IDelegatedSettings. È così che Nextcloud assegna un pannello delle impostazioni a un gruppo che non è admin.
tokenNeeded chiede al server di allegare token di autenticazione per gli uid indicati quando il webhook si attiva. TokenService::createEphemeralToken genera IToken::PERMANENT_TOKEN con password = null. Password applicativa. 2FA già superato.
La PR #60543 ha protetto create: a meno che tu non sia un amministratore completo dell'istanza, tokenNeeded viene azzerato. Ho creato un webhook come utente delegato hooker con tokenNeeded.user_ids: ["admin"]. Il tokenNeeded memorizzato era []. Create è protetto. Per un minuto sembra una patch completa.
Poi ho inviato lo stesso body in POST a /webhooks/{id}. Gli user_ids memorizzati erano ['admin']. update() non ha mai copiato l'if.
Ho caricato un file in PUT come hooker in modo che scattasse NodeCreatedEvent. Cron esegue WebhookCall. Il JSON del catcher contiene authentication.user_ids.admin.token. Una GET con Bearer del file testimone privato di admin ha restituito 200, X-User-Id: admin.
Modi in cui questo muore senza insegnarti nulla: update 403 (il controller corrisponde già a create); create che genera già token (#60543 non presente nella build); authentication vuoto nel catcher (cron non ha generato); percorso header ExApp (l'utente del lab è il delegato hooker).
cd lab
./run.sh
Target solo http://127.0.0.1:18320 (Nextcloud) e :18321 (catcher).
SUCCESS NEXTCLOUD-WEBHOOK-TOKENNEEDED who=delegated-webhook-admin uid=admin NEXTCLOUD-WEBHOOK-TOKENNEEDED-WITNESS
Copia l'azzeramento isAdmin di create in update(). Finché non viene rilasciata, non delegare le impostazioni Webhooks a gruppi non-admin.
da02f41)GNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.