CVE-2026-88892: openpanel · Server-Side Request Forgery (SSRF)
Affects Openpanel-dev openpanelSource CVE Database V5
Not known to be exploited · CVSS 5.3 Medium.
Data as of 10/25/2026, 16:58:58 UTC
- EPSS
- 0.3% chance of exploitation in 30 days – higher than 26% of CVEsExploit Prediction Scoring System: the likelihood attackers will use this flaw soon.
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:L/SI:N/SA:NExploitation evidence
Disclosed: evidence found.
CVE published 10 Sep 2026
Detectable: no evidence on record.
No public nuclei template indexed
Weaponised: no evidence on record.
No public exploit code indexed in Metasploit or Exploit-DB
Exploited in the wild: no evidence on record.
Not in CISA KEV and no source reports exploitation
Observed by OffSeq Mirage: no evidence on record.
No attack traffic recorded by OffSeq Mirage sensors
A missing step is not evidence of safety. Sources: cve.org (opens in a new tab), the Metasploit, Exploit-DB and nuclei-templates index as of 2026-10-25.
What to do
Affected software
| Product | Affected | Fixed in |
|---|---|---|
| Openpanel-devopenpanel | Affected
| Fixed in– |
AI-suggested
Until an official fix is available, restrict access to the data importer functionality to trusted users only and consider network-level controls to limit server outbound requests. Monitor for updates from the Openpanel-dev project regarding patches or official mitigations.
Description
In OpenPanel through 2.3.0, 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.
Impact
An authenticated organization member can cause the server to make arbitrary HTTP requests to internal network addresses, potentially exposing internal services and metadata endpoints. The attacker can scan internal hosts, ports, and paths by observing response status messages. Furthermore, internal data returned in a specific CSV format can be ingested and viewed as analytics events, leaking sensitive internal information. This could lead to information disclosure within the internal network environment.
Summary
In OpenPanel versions up to 2.3.0, the data importer component fetches a caller-supplied URL using a plain fetch method instead of the project's SSRF guard utility. The URL is only validated by a basic string URL check, allowing URLs pointing to internal addresses such as 127.0.0.1 or the AWS metadata service. Authenticated organization members, including those with minimal access, can exploit this to make the server connect to arbitrary internal addresses. The HTTP response status and text are stored and returned to the user, enabling internal network scanning. Additionally, if the internal response is in Umami CSV format, it is ingested as analytics events visible to the attacker.