Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconIdentify network-accessible logto-tunnel port
-
DeliveryConfirm --experience-path is active via index.html response
-
ExploitSend HTTP GET with ../ traversal sequence in URL
-
InstallNode.js preserves raw traversal in request.url
-
C2path.join resolves path outside staticPath
-
Executefs.open reads target file
-
ImpactFile contents returned in HTTP response body
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Path canonicalization, traversal prevention
MITRE ATT&CK
2 techniques across 2 tactics: Discovery, Collection The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Two specific conditions must both be true for exploitation: (1) The Logto Tunnel CLI must be invoked with the --experience-path flag set to a local directory - without this flag, createStaticFileProxy is never registered and the vulnerable code path is unreachable; and (2) The tunnel port must be network-accessible from the attacker's location - because server.listen(port) binds to all interfaces on most platforms, any host that can route to the port qualifies. Exploitation is read-only: the attacker can read any file accessible to the OS user running logto-tunnel, but cannot write files, execute code, or bypass Logto authentication. The primary limiting factor is the non-default --experience-path deployment mode, which confines the vulnerable population to developers and pipelines explicitly using the custom sign-in experience feature. |
| Impact | The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H) is internally consistent with the description: once the preconditions are met the attack is trivially executable with a single HTTP request and no credentials. EPSS data was not provided in the input, so a quantitative exploitation probability cannot be stated. The vulnerability is not listed in CISA KEV, confirming no actively tracked mass exploitation at time of analysis; however, a complete PoC is publicly documented in GHSA-rxjr-6c9q-h67x, meaningfully elevating near-term opportunistic risk above baseline. Real-world exposure is bounded by two non-default requirements - the --experience-path flag must be active and the tunnel port must be reachable from the attacker - which limits the vulnerable population to developers and CI/CD pipelines running custom Logto UI workflows with the port exposed. Within that population the impact is severe: the process can read any file the OS user can access, including .env files, SSH keys, and credentials typically co-located with development projects. Even a small operations team running logto-tunnel on a shared development server with a network-accessible port should treat this as an urgent remediation given the public PoC and zero-authentication requirement. |
| Exploit ScenarioDerived | An attacker identifies a host running logto-tunnel with --experience-path enabled and the tunnel port accessible over the network. They send a crafted HTTP GET request such as GET /../../../home/runner/.env HTTP/1.1 to the tunnel port; the server resolves the path outside the static directory and returns the file contents directly in the HTTP response body. A complete PoC confirming this scenario is publicly documented in GHSA-rxjr-6c9q-h67x, requiring no authentication, no special tooling, and only a single HTTP request. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 19, 2026
Path traversal in @logto/tunnel (versions <= 0.3.8) exposes arbitrary file read to any network peer that can reach the tunnel port when the --experience-path flag is active. The Node.js static file proxy passes request.url directly into path.join(staticPath, request.url) followed by fs.open without URL normalization or containment checks, allowing ../ sequences to escape the configured static directory. A working proof-of-concept is publicly documented in GHSA-rxjr-6c9q-h67x; no active exploitation is confirmed in CISA KEV as of the analysis date, and the vendor-released fix is version 0.3.9.
RemediationAI
Upgrade @logto/tunnel to version 0.3.9 or later using npm install @logto/tunnel@0.3.9 or by updating the version constraint in package.json and running npm install. The patched release is confirmed at https://github.com/logto-io/logto/releases/tag/@logto/tunnel@0.3.9. If immediate upgrade is not possible, two compensating controls are available with distinct trade-offs: (1) Remove the --experience-path flag from the tunnel invocation - this disables createStaticFileProxy entirely and eliminates the vulnerable code path, but also disables custom sign-in experience asset serving; or (2) Restrict network access to the tunnel port via host firewall rules or by fronting with a reverse proxy bound to 127.0.0.1, which prevents remote exploitation while preserving functionality but requires infrastructure changes and does not fix the underlying flaw. The upstream fix PR and commit are at https://github.com/logto-io/logto/pull/9113 and commit 5686815955534f803d3d50738259efd0f741e62c.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in npm, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The @logto/tunnel npm package (CPE: cpe:2.3:a:logto-io:logto) is a Node.js CLI tool that proxies Logto authentication flows while optionally serving custom sign-in experience assets from a local filesystem path via the --experience-path flag. The vulnerable code in packages/tunnel/src/commands/tunnel/utils.ts constructs the file path as path.join(staticPath, request.url) - a textbook CWE-22 (Path Traversal) pattern. Node.js HTTP servers preserve raw ../ sequences in request.url, and path.join resolves them without bounds-checking against the static root, so a URL like /../secret.txt escapes staticPath entirely. The server is started with server.listen(port) without binding to a specific interface, which on many platforms defaults to all interfaces and can expose the service to network peers beyond localhost. The fix in 0.3.9 introduces getSafeStaticFilePath(), which decodes the URL, strips query strings, rejects backslashes, resolves the full path, and checks via path.relative that the result does not start with '..' or is absolute - blocking raw, percent-encoded (%2e%2e%2f), and backslash variants.
Know when Logto gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
Network-reachable unauthenticated read with no user interaction; confidentiality-only impact, no integrity or availability effect.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Logto is the modern, open-source auth infrastructure for SaaS and AI apps. Prior to 0.3.9, the Logto Tunnel npm package enabled createStaticFileProxy from packages/tunnel/src/commands/tunnel/index.ts and passed request.url from static asset requests through packages/tunnel/src/commands/tunnel/utils.ts using path.join(staticPath, request.url) and then fs.open(requestPath, "r") without URL normalization or a containment check. When --experience-path was enabled and the tunnel port was reachable, an unauthenticated requester could send a path containing ../ to createStaticFileProxy and read files outside the configured static directory that were readable by the logto-tunnel process. The service used server.listen(port), which could expose the tunnel to other hosts depending on the platform and deployment. This issue is fixed in version 0.3.9.
Articles & Coverage 1
Executive ViewAI
@logto/tunnel versions 0.3.8 and earlier contain a path traversal vulnerability allowing remote attackers to read arbitrary files from affected systems, potentially exposing sensitive configuration data, credentials, and application state. This creates risk of broader system compromise and data theft for organizations using this component. Immediate patching to version 0.3.9 is required to contain this exposure.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.
Server-side request forgery in Logto prior to 1.43.0 allows an authenticated tenant administrator to point outbound conn
Server-side request forgery in Logto through 1.42.0 allows tenant administrators holding Management API credentials to r
Server-side request forgery in Logto through 1.42.0 allows tenant administrators holding Management API tokens to direct
Catastrophic ReDoS in Logto's email subaddressing blocklist allows unauthenticated remote attackers to stall the Node.js
Stored social and enterprise SSO provider access tokens can be retrieved from Logto's Account API by a low-trust applica
GitHub Actions workflow injection in Logto's commitlint.yml exposes versions 1.40.1 through 1.41.0 to arbitrary shell co
EUVD-2026-62867
GHSA-rxjr-6c9q-h67x
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB