
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
Nextcloud Server 35.0.0 - Nextcloud GmbH
WebhooksController::create() setzt tokenNeeded auf null, es sei denn, der Aufrufer ist ein vollständiger Instanz-Administrator. 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 ihr eine einstündige Anmeldung für jede von ihr aufgeführte uid zusendet, einschließlich admin.
Mit dieser Anmeldung kann sie:
Sie benötigen keine PHP-Shell auf dem Host. Sie müssen 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 liegt bereits hinter Ihnen.
PR #60543 hat create abgesichert: Wenn Sie kein vollständiger Instanz-Administrator sind, wird tokenNeeded auf null gesetzt. Ich habe als delegierter Benutzer hooker einen Webhook mit tokenNeeded.user_ids: ["admin"] erstellt. Gespeichertes tokenNeeded war []. Create ist abgesichert. Für eine Minute sieht das wie ein fertiger Patch aus.
Dann habe ich denselben Body per POST an /webhooks/{id} gesendet. Gespeicherte user_ids war ['admin']. update() hat das if nie kopiert.
Laden Sie eine Datei als hooker hoch, damit NodeCreatedEvent ausgelöst wird. Cron führt WebhookCall aus. Das Catcher-JSON enthält authentication.user_ids.admin.token. Ein Bearer-GET der privaten Zeugendatei des Administrators gab 200 zurück, X-User-Id: admin.
Wege, auf denen dies stirbt, ohne Ihnen etwas beizubringen: update 403 (der Controller stimmt bereits mit create überein); create erzeugt bereits Token (#60543 nicht im Build); leeres authentication im Catcher (Cron hat nichts erzeugt); ExApp-Header-Pfad (der Lab-Benutzer ist delegierter hooker).
cd lab
./run.sh
Ziel 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
Kopieren Sie das isAdmin-Null-Setzen aus create in update(). Bis das ausgeliefert wird, delegieren Sie die Webhooks-Einstellungen nicht an Nicht-Admin-Gruppen.
da02f41)GNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.