
Nextcloud 35.0.0 — delegierter Webhooks-Administrator kann über Webhook-Update ein 1h-Admin-App-Passwort erzeugen tokenNeeded
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-webhook-tokenneeded
Write-up: https://abraxaslabs.tech/research/nextcloud-webhook-tokenneeded
Nextcloud Server 35.0.0 - Nextcloud GmbH
WebhooksController::create() setzt tokenNeeded auf null, sofern der Aufrufer kein vollständiger Instanz-Administrator ist. update() tut das nicht. Ein delegierter Webhooks-Einstellungsadministrator (nicht in admin) kann tokenNeeded.user_ids: ["admin"] auf einem bestehenden Webhook speichern und erhält dann ein einstündiges, nicht eingeschränktes PERMANENT_TOKEN-App-Passwort für diese uid, wenn das Ereignis ausgelöst wird.
Ein böswilliger Akteur, dem nur die Verwaltung von Webhooks anvertraut wurde, kann sich eine Stunde lang als admin (oder als jeden von ihm benannten Benutzer) anmelden, 2FA umgehen und die Dateien dieser Person lesen oder überschreiben.
| ID | noch keine CVE |
| CWE | CWE-863, CWE-269 |
| CVSS | Hoch: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Produkt | Nextcloud Server |
| Betroffen | 35.0.0 (da02f41) offizielles nextcloud:35.0.0-apache |
| Auth | delegierter Webhooks-Einstellungsadministrator (IDelegatedSettings) |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Sie haben jemandem die Aufgabe für die Webhooks-Einstellungen übertragen. Diese Person ist nicht in der Gruppe admin. Nextcloud erlaubt ihr dennoch, einen bestehenden Webhook so zu bearbeiten, dass der Server beim nächsten passenden Ereignis eine einstündige Anmeldung per E-Mail für jede von ihr aufgeführte uid verschickt, einschließlich admin.
Mit dieser Anmeldung kann sie:
Sie benötigt keine PHP-Shell auf dem Host. Sie muss kein vollständiger Instanz-Administrator sein. Ein Fremder im Internet ohne Konto kann dies nicht tun. Die Lücke ist der Mitarbeiter, dem Sie bereits Webhooks anvertraut haben, der sich als die Personen ausgibt, denen Sie es nicht anvertraut haben.
WebhooksController ist #[AuthorizedAdminSetting(settings: Admin::class)]. Admin implementiert IDelegatedSettings. So übergibt Nextcloud ein Einstellungsfenster an eine Gruppe, die nicht admin ist.
tokenNeeded fordert den Server auf, beim Auslösen des Webhooks Authentifizierungstoken für benannte uids anzuhängen. TokenService::createEphemeralToken erzeugt IToken::PERMANENT_TOKEN mit password = null. App-Passwort. 2FA bereits hinter sich.
PR #60543 hat create abgesichert: Sofern man kein vollständiger Instanz-Administrator ist, wird tokenNeeded auf null gesetzt. Ich habe als delegierter Benutzer hooker einen Webhook mit tokenNeeded.user_ids: ["admin"] erstellt. Das gespeicherte tokenNeeded war []. Create ist abgesichert. Für eine Minute sieht das nach einem fertigen Patch aus.
Dann habe ich denselben Body per POST an /webhooks/{id} gesendet. Die gespeicherten user_ids waren ['admin']. update() hat das if nie übernommen.
Eine Datei als hooker per PUT hochgeladen, damit NodeCreatedEvent ausgelöst wird. Cron führt WebhookCall aus. Das Catcher-JSON enthält authentication.user_ids.admin.token. Ein Bearer-GET auf die private Zeugendatei des Administrators gab 200 zurück, X-User-Id: admin.
Wege, auf denen dies scheitert, ohne dass man etwas lernt: update 403 (der Controller stimmt bereits mit create überein); create erzeugt bereits Token (#60543 nicht im Build); leeres authentication im Catcher (Cron hat kein Token erzeugt); ExApp-Header-Pfad (der Lab-Benutzer ist delegierter hooker).
cd lab
./run.sh
Ziele nur http://127.0.0.1:18320 (Nextcloud) und :18321 (Catcher).
SUCCESS NEXTCLOUD-WEBHOOK-TOKENNEEDED who=delegated-webhook-admin uid=admin NEXTCLOUD-WEBHOOK-TOKENNEEDED-WITNESS
Übernehmen Sie das Nullsetzen von isAdmin aus dem Erstellen in update(). Bis dies ausgeliefert wird, delegieren Sie Webhooks-Einstellungen nicht an Nicht-Admin-Gruppen.
da02f41)GNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.