Katalog CVE

CVE-2026-88892

ŚrednieCVSS 5.0
Opublikowano: Zaktualizowano: Przetłumaczono: NVD NIST

Streszczenie

OpenPanel w importerze danych pobiera adres URL podany przez użytkownika za pomocą zwykłego fetch() zamiast istniejącego mechanizmu ochrony przed SSRF (safe-fetch.ts). Walidacja ogranicza się do z.string().url(), więc akceptowane są adresy takie jak http://127.0.0.1:9911/ czy http://169.254.169.254/latest/meta-data/. Uwierzytelniony członek organizacji, w tym domyślny użytkownik 'member' bez uprawnień do projektu, może zmusić serwer do połączenia się z dowolnym osiągalnym adresem, a wynik (status HTTP i tekst statusu) jest zapisywany i zwracany temu samemu użytkownikowi.

Ocena ryzyka

Podatność pozwala na skanowanie wewnętrznych hostów, portów i ścieżek (SSRF) oraz potencjalne pobranie danych z wewnętrznych usług, jeśli odpowiedź zostanie zinterpretowana jako CSV Umami. Może to prowadzić do wycieku informacji o infrastrukturze wewnętrznej i nieautoryzowanego dostępu do danych.

Rekomendacja

Wdrożyć poprawkę, gdy tylko będzie dostępna, a do tego czasu ograniczyć lub wyłączyć funkcję importu danych oraz wymusić korzystanie z istniejącego mechanizmu safe-fetch.ts. Należy również zweryfikować, czy użytkownicy bez uprawnień do projektu nie mogą wywoływać importu.

Inne podatności w OpenPanel

Zobacz wszystkie
Oryginalny opis (angielski, źródło NVD)

OpenPanel is an analytics platform. In all versions (no patched release available at time of publication), the data importer fetches a caller-supplied URL with plain fetch instead of the project's existing SSRF guard (apps/api/src/utils/safe-fetch.ts). In packages/importer/src/providers/umami.ts, parseRemoteFile calls fetch() on config.fileUrl, which is validated only by z.string().url(), so values such as http://127.0.0.1:9911/ or http://169.254.169.254/latest/meta-data/ are accepted; the shared createFileImportConfig factory gives the plausible provider the same field. An authenticated organization member — including a default 'member' with no project_access rows, for whom the intended access-level check is skipped because getProjectAccess returns boolean true rather than a level object — can therefore make the server connect to any address reachable from it. The resulting HTTP status and status text are persisted as Import.errorMessage and returned by import.get to the same user, providing a scanning oracle for internal hosts, ports and paths; if an internal response parses as Umami CSV, its rows are ingested as events and become readable in the attacker's analytics views.

Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS