CVE-2026-63188: @logto/tunnel Path Traversal via Unsanitized request.url
The @logto/tunnel CLI serves local sign-in UI files without checking that the requested path stays inside the configured directory, so anyone who can reach the tunnel port can read arbitrary files on…

The problem
The tunnel command accepts --experience-path to serve a local folder of static sign-in UI assets. In packages/tunnel/src/commands/tunnel/utils.ts, the filesystem path is built with path.join(staticPath, request.url) and opened with fs.open(requestPath, 'r').
No URL normalization and no containment check are performed before the file is opened. Because Node.js preserves dot-dot segments in request.url (for example /../secret.txt), the joined path can resolve to any location the CLI process can read. The server also binds to all interfaces by default, so the exposure is not limited to localhost.
Proof of concept
A working proof-of-concept for CVE-2026-63188 in @logto/tunnel, with the exact payload below.
GET /../secret.txt HTTP/1.1
Host: 127.0.0.1:9000path.join('/tmp/logto-ui/static', '/../secret.txt') resolves to /tmp/logto-ui/secret.txt, which is outside the configured staticPath. Node preserves the leading /../ in request.url, so the traversal works without any encoding tricks.
The patch (commit 5686815) adds a path.resolve() call to canonicalize the joined path and then verifies that the result starts with the resolved staticPath before opening the file. Any request whose resolved path does not share the staticPath prefix is rejected with a 403.
CWE-22 applies directly: user-controlled input is fed to a filesystem operation with no boundary enforcement.
The fix
Upgrade @logto/tunnel to 0.3.9 or later. The fix is in commit 5686815955534f803d3d50738259efd0f741e62c (PR #9113). If you cannot upgrade immediately, bind the tunnel to localhost only and ensure the port is not reachable from other hosts.
Reported by wangsijie.
Related research
- high · 7.1@typespec/openapi3 Path Traversal via Versioned Enum Value in Output Filename
- critical · 9CVE-2026-75604CVE-2026-75604: Next.js Unauthenticated RCE via Windows Cache Path Traversal
- high · 7.5CVE-2026-82393CVE-2026-82393: pnpm Scoped-Name Path Traversal Arbitrary File Write
- high · 7.1CVE-2026-82392CVE-2026-82392: pnpm Virtual Store Linker Path Traversal via Crafted Lockfile