Cloudreve has Broken Access Control - Revoked Share Access Still Allows Signed File URL Generation via Cached context_hint
Beschreibung
Zusammenfassung Cloudreves Filelisting-Antworten geben dem Client einen "context hint" (UUID), der Folgeoperationen beschleunigen soll. Wenn dieser Hinweis auf der Route `file/url` (und `file/thumb`) wiederholt wird, speichert DBFS einen `shareNavigatorState`, der die bereits geladene Share-Root und Share-Zeile enthält. Auf eine spätere anfrage, die den gleichen hinweis trägt, "sharenavigator". RestoreState` füllt `shareRoot` und `shareNavigator wieder auf. Zu `dann **überspringt `Root`**. "Root" ist der einzige Ort, der "Inventar" neu überprüft. IsValidShare` (Share-Verfall, Rest-Download-Anzahl, Eigentümerstatus, Gültigkeit der Quelldatei) und das Share-Passwort. Infolgedessen kann ein Empfänger, der einen Kontexthint vorwarmt, während der Zugriff gültig ist, signierte Datei-URLs für bereits bekannte freigegebene Dateipfade bis zum Kontexthint TTL (`5 * 60` = 300 s) prägen, nachdem der Eigentümer die Freigabe gelöscht hat oder die Freigabe abläuft - plus die Lebensdauer einer signierten Entitäts-URL, die in diesem Fenster geprägt wurde. Dies ist ein **Widerruf / Ablaufbypass **, keine Möglichkeit, unbekannte Freigabeinhalte zu entdecken: Der Angreifer muss bereits Zugriff auf die Freigabe gehabt haben und die Zieldatei-URI aus einer vorherigen Auflistung kennen. ## Wurzelursache (verifiziert unter `26b6b10`) **1. Listenantworten geben den Hinweis und jede Datei URI** – `service/explorer/response.go` füllt `ListResponse.ContextHint` und `FileResponse` aus. Weg` (`f.Uri(falsch). String()`. **2. `file/url` und `file/thumb` akzeptieren den vom Kunden bereitgestellten Hinweis** `routers/router.go:631` und `:662`: ```go file. POST("url", middleware.ContextHint(), /* ... */ Controller. FileURL file.GET("Daumen", Middleware.ContextHint(), /* ... */ Controller. Daumen) ``` Das einzige Auth-Gate der `file`-Gruppe ist `Middleware. RequiredScopes(types.ScopeFilesRead)` — es gibt **keine unabhängige Share-Validierungs-Middleware auf dieser Route. Alle Share-Validierung lebt innerhalb von DBFS. **3. Die Middleware vertraut dem Header verbatim** — `middleware/file.go:41`: ``go func ContextHint() gin. HandlerFunc { return func(c *gin.Context) { if c.GetHeader(dbfs.ContextHintHeader) != "" { // X-Cr-Context-Hint util.WithValue(c, dbfs.ContextHintCtxKey{}, uuid.FromStringOrNil(c.GetHeader(dbfs.ContextHintHeader)) } c.Next() } `` **4. DBFS stellt den zwischengespeicherten Navigatorzustand bei einem Hinweis-Hit** wieder her -- `dbfs.go:745` (`ContextHintTTL = 5 * 60`, `dbfs.go:34`). Bei einem miss bewaffnet es "persiststate"; die schließung feuert in "dbfs". Recycle()` am Ende der Anfrage. **5. Persisted share state trägt die geladene `shareRoot` + `share` row** — `share navigator.go:72`/`:85`. `RestoreState` setzt `n.shareRoot`, `n.share`, `n.owner`, etc. **6. `Root` ist das einzige Gültigkeits-/Passwort-Gate** — `share navigator.go:114` → `inventory.IsValidShare(share)` (`inventory/share.go:227`: `IsShareExpired` checkt `Expires`). Before(now)` **and** `RemainDownloads NOT nil => Root() skipped root, err := n.Root(ctx, path) ... } ... } ``` Der Single-File-Share-Zweig ist **auch ** betroffen: er nennt `latestSharedSingleFile`, was `n.fileClient abruft. GetByID(n.share.Edges.File.ID)` direkt aus dem wiederhergestellten `share` ohne Revalid ..
Quellen & weiterführende Informationen
Hier werden ausschließlich tatsächlich zu dieser Schwachstelle gespeicherte Quellenbelege angezeigt.
Was ist zur Behebung zu tun?
Herstellerhinweise prüfen und das betroffene Produkt kurzfristig patchen oder kompensierende Schutzmaßnahmen aktivieren.
Empfohlene Schritte
- Betroffene Systeme identifizieren: github.com/cloudreve/Cloudreve/v4.
- Exposition prüfen: Internet-Erreichbarkeit, Admin-Oberflächen, VPN, Mail- oder Webdienste.
- Hersteller-Advisory öffnen und verfügbare Updates, Workarounds oder Deaktivierungen prüfen.
- Nacharbeiten dokumentieren: betroffene Assets, Maßnahme, Zeitpunkt, Restrestrisiko.
Übergangsmaßnahmen
- Zugriff auf betroffene Dienste auf vertrauenswürdige Netze einschränken.
- WAF/IDS/EDR-Regeln und Hersteller-IOCs aktivieren, sofern verfügbar.
- Nicht benötigte Funktionen, Plugins oder Dienste temporär deaktivieren.
- Administrative Zugänge besonders absichern: MFA, Passwortrotation, Session-Invalidierung.