Frigate: RTSP-Zugangsdaten-Leck über geteilten nginx-Proxy-Cache

Durch einen nutzerübergreifend geteilten nginx-Proxy-Cache kann ein angemeldeter Viewer-Benutzer Admin-only-Antworten lesen, darunter RTSP-Kamerazugangsdaten im Klartext.

Advisory-ID: TP-2026-029
Produkt: Frigate (selbst-gehosteter NVR mit KI-Objekterkennung)
Schwachstellentyp: Offenlegung sensibler Informationen über geteilten Cache (CWE-524)
CVE: nicht beantragt
CVSS 3.1: 6.5 (Mittel) · CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Betroffene Versionen: <= 0.17.1
Behoben in: 0.17.2
Hersteller-Advisory: GHSA-4vfc-hxpj-f7x7
Gemeldet: 19. Mai 2026

Zusammenfassung

Frigate ist ein selbst-gehosteter NVR mit KI-Objekterkennung. Die nginx-Location /api/ aktiviert proxy_cache ohne expliziten proxy_cache_key, sodass nginx den Standard-Schlüssel $scheme$proxy_host$request_uri nutzt, der weder Cookie noch Authorization-Header enthält. Die auth_request-Prüfung akzeptiert Admin- und Viewer-Token gleichermaßen als authentifiziert, und bei einem Cache-HIT bedient nginx den zwischengespeicherten Body, ohne die FastAPI-Rollenprüfung auszuführen. Dadurch liest jeder Viewer-Benutzer innerhalb des 5-Sekunden-Fensters nach einem Admin-Aufruf die Admin-only-Antwort. turingpoint hat den Ablauf verifiziert und gemeldet; der Hersteller hat ihn in 0.17.2 behoben.

Ursache

Die nginx-Location /api/ aktiviert proxy_cache api_cache mit proxy_cache_valid 200 5s ohne expliziten proxy_cache_key (docker/main/rootfs/usr/local/nginx/conf/nginx.conf). nginx setzt den Cache-Schlüssel daher auf den Standard $scheme$proxy_host$request_uri, der weder Cookie noch Authorization-Header enthält. auth_request /auth prüft nur Signatur und Ablauf des JWT und akzeptiert Admin- wie Viewer-Token als authentifiziert. Bei einem Cache-HIT bedient nginx den Body direkt aus /dev/shm/nginx_cache, ohne FastAPI aufzurufen, sodass die Routenabhängigkeit dependencies=[Depends(require_role(["admin"]))] übersprungen wird. Dies ist verschieden von GHSA-26g3-f8g8-9ffh, das /api/config/raw auf FastAPI-Ebene absicherte, den nginx-Cache-Schlüssel aber nicht änderte.

Proof of Concept

# Admin pollt eine Admin-only-Route und befüllt damit den Cache:
GET /api/config/raw_paths        (Admin-JWT)

# innerhalb von 5 Sekunden, gleicher Pfad, mit einem Viewer-JWT:
GET /api/config/raw_paths        (Viewer-JWT)

-> nginx liefert den zwischengespeicherten Admin-Body, inklusive RTSP-Kamera-URLs
   mit Klartext-Zugangsdaten.

Der zweite Aufruf trifft denselben Cache-Schlüssel und wird aus dem Cache bedient, bevor FastAPI mit seiner Rollenprüfung läuft; das Viewer-Token gilt der auth_request-Stufe als gültig authentifiziert.

Auswirkung

  • Lesen Admin-only-JSON-Antworten durch jeden authentifizierten Viewer im 5-Sekunden-Fenster.
  • Offenlegung von RTSP-Kamera-URLs mit Klartext-Zugangsdaten (/api/config/raw_paths).
  • Offenlegung der vollständigen Benutzer- und Rollenliste (/api/users).

Referenzen

Steckt so etwas in Ihrer Software?

Diese Schwachstelle hat unser Team im Rahmen seiner Arbeit gefunden. Lassen Sie Ihre Anwendungen von denselben Spezialisten prüfen, mit einem Penetrationstest von turingpoint.