CVE-2026-88892
ŚrednieCVSS 5.0Streszczenie
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- CVE-2026-88893Wysokie
Procedury wyszukiwania udziałów w OpenPanel nie weryfikują kontroli dostępu i zwracają hashe haseł oraz chronione definicje raportów nieuwierzytelnionym wywołującym. Atakujący posiadający link do udziału może pobrać hashe haseł argon2id oraz pełne konfiguracje raportów, w tym nazwy zdarzeń, filtry i wymiary podziału, co umożliwia offline łamanie haseł i kradzież danych biznesowych.
- CVE-2026-93983Średnie
OpenPanel do commita bad75bdd nie escapuje kluczy właściwości w zapytaniach ClickHouse SQL, co pozwala uwierzytelnionym użytkownikom na wstrzyknięcie warunków logicznych SQL. Atakujący mogą podać spreparowane nazwy filtrów, aby obejść izolację projektów i uzyskać dostęp do metryk z innych projektów.
- CVE-2026-93982Niskie
OpenPanel do commita bad75bdd zapisuje tokeny uwierzytelniające Model Context Protocol z parametrów zapytania URL do zwykłych logów aplikacji bez redakcji. Atakujący mający dostęp do standardowego wyjścia aplikacji lub scentralizowanych systemów logowania może przechwycić dane uwierzytelniające zakodowane w base64, aby odtworzyć żądania MCP i uzyskać dostęp do analityki projektu.
- CVE-2026-88891Wysokie
OpenPanel nie egzekwuje poziomu dostępu tylko do odczytu w 26 z 29 procedur modyfikujących, co pozwala użytkownikom z uprawnieniami odczytu na modyfikowanie, usuwanie i publikowanie danych projektu. Atakujący z jawnym dostępem tylko do odczytu mogą usuwać raporty i pulpity nawigacyjne, planować usunięcie całych projektów, publikować prywatne analizy w publicznych linkach oraz modyfikować reguły alertów poprzez wykorzystanie braku walidacji poziomu dostępu w resolverach mutacji.
- CVE-2026-88890Wysokie
OpenPanel do commita cd24bb8 zawiera podatność SQL injection w kreatorze filtrów analitycznych, który nie waliduje identyfikatorów kolumn filtrów profile.* przed interpolacją do klauzul WHERE ClickHouse. Uwierzytelniony atakujący z uprawnieniami odczytu w zakresie projektu lub eksportu root może wstrzyknąć dowolny SQL ClickHouse, aby obejść izolację projektów i odczytać dane analityczne innych organizacji oraz dane osobowe (PII) za pomocą technik blind boolean oracle.
- CVE-2026-85615Średnie
OpenPanel przed wersją 2.3.0 zawiera podatność na niebezpieczne bezpośrednie odwołanie do obiektu (IDOR) w procedurach tRPC report.getLayouts i report.resetLayout, które nie wiążą dashboardId z autoryzowanym projectId. Uwierzytelnieni atakujący mogą podać dowolny dashboardId ofiary z własnym projectId, aby odczytać układy raportów i konfiguracje lub usunąć układy dashboardów między dzierżawcami.
- CVE-2026-85614Wysokie
OpenPanel przed wersją 2.3.0 zawiera podatność nieuwierzytelnionego ataku SSRF w punkcie końcowym GET /tools/site-checker. Parametr URL jest w pełni kontrolowany przez klienta i nie ma filtrowania adresów prywatnych ani ochrony przed DNS-rebinding.
- CVE-2026-85613Wysokie
OpenPanel przed wersją 2.3.0 zawiera podatność na cross-site scripting w nieuwierzytelnionym punkcie końcowym proxy favicon GET /misc/favicon, która umożliwia zdalnym atakującym wykonanie skryptów poprzez dostarczenie adresu URL pliku SVG. Atakujący mogą hostować złośliwe pliki SVG z osadzonymi skryptami, które wykonują się w przeglądarce ofiary na pochodzeniu API, umożliwiając uwierzytelnione żądania do chronionych punktów końcowych.
- CVE-2026-85612Wysokie
OpenPanel przed wersją 2.3.0 zawiera nieuwierzytelnioną podatność na podrabianie żądań po stronie serwera (SSRF) w punktach końcowych /misc/favicon i /misc/og, które akceptują parametr url dostarczony przez atakującego z niewystarczającą walidacją. Atakujący mogą zmusić API do pobierania dowolnych wewnętrznych hostów i punktów końcowych metadanych chmury, a małe odpowiedzi są zwracane w niezmienionej formie, umożliwiając kradzież poświadczeń i enumerację wewnętrznych usług.
- CVE-2026-85611Średnie
OpenPanel przed wersją 2.3.0 zawiera podatność na złamanie autoryzacji na poziomie obiektów między dzierżawcami w procedurach tRPC report.getLayouts i report.resetLayout, które nie ograniczają zapytań dashboardów do projektu wywołującego. Uwierzytelnieni atakujący mogą podać własny projectId z odgadnionym dashboardId ofiary, aby odczytać poufne definicje raportów lub trwale usunąć układy dashboardów między dzierżawcami.
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

