mediumVulnerability

GHSA-f3g8-9xv5-77gv

### Summary Saltcorn validates the post-login `dest` parameter with a string check that only blocks `:/` and `//`. Because all WHATWG-compliant browsers normalise backslashes (`\`) to forward slashes (`/`) for special schemes, a payload such as `/\evil.com/path` slips through `is_relative_url()`, is emitted unchanged in the HTTP `Location` header, and causes the browser to navigate cross-origin to an attacker-controlled domain. The bug is reachable on a default install and only requires a victim who can be tricked into logging in via a crafted Saltcorn URL. ### Details Vulnerable function: `packages/server/routes/utils.js:393-395` ```js const is_relative_url = (url) => { return typeof url === "string" && !url.includes(":/") && !url.includes("//"); }; ``` The function's intent is to allow only same-origin redirects, but the allow-list only checks for two literal substrings. It does not handle: - backslash characters, which WHATWG URL parsing (used by every modern browser) treats as forward slashes for the special schemes `http`, `https`, `ftp`, `ws`, `wss`. A URL parser fed `/\evil.com/path` with a base of `http://victim/` resolves to `http://evil.com/path`. - non-`http(s):` schemes that do not contain `:/`. The strings `javascript:alert(1)`, `data:text/html,...`, `vbscript:...` all pass. Vulnerable callsite: `packages/server/auth/routes.js:1371-1376` ```js } else if ( (req.body || {}).dest && is_relative_url(decodeURIComponent((req.body || {}).dest)) ) { res.redirect(decodeURIComponent((req.body || {}).dest)); } else res.redirect("/"); ``` The body's `dest` is URL-decoded twice (once by body-parser, once by the explicit `decodeURIComponent`) and the same value is passed to `res.redirect`. Express 5's `res.redirect` runs the value through `[email protected]`, whose whitelist character class `[^\x21\x23-\x3B\x3D\x3F-\x5F\x61-\x7A\x7C\x7E]` includes `\x5C` (backslash). The backslash is therefore not percent-encoded and ends up verbatim in the `Location` res

Properties

ghsa_id
GHSA-f3g8-9xv5-77gv
severity
medium
summary
Saltcorn: Open Redirect in `POST /auth/login` due to incomplete `is_relative_url` validation (backslash bypass)
cve_id
GHSA-f3g8-9xv5-77gv
is_ghsa_only
true
ghsa_published
2026-04-16T23:00:45Z
source_url
https://github.com/advisories/GHSA-f3g8-9xv5-77gv
ghsa_updated
2026-04-16T23:00:46Z

Related Entities (4)

VULNERABLE_TO (1)

[Software]npm/@saltcorn/server

AFFECTS (1)

[Software]npm/@saltcorn/server

HAS_WEAKNESS (1)

[Weakness]URL Redirection to Untrusted Site ('Open Redirect')

REPORTED_BY (1)

[Source]GitHub Advisory Database

Explore deeper with Ninja Signal's threat intelligence graph

GHSA-f3g8-9xv5-77gv — Ninja Signal Threat Intelligence | Ninja Signal