Live › vulnerability › CVE-2026-54442
The URL validation regex added to emissary's NavAction.java accepts protocol-relative and single-slash URLs, so the fix for CVE-2026-35571 is incomplete. An attacker can send users to attacker-controlled hosts or make the server request internal services, including cloud metadata endpoints.
Summary written from the sources below. Check the originals before acting.
First seen by InfraStack 2026-10-30 22:51 UTC. All times on this page are UTC.
Teams that run emissary and let user-supplied values reach the NavAction navigation path can be exposed to redirects and server-side requests. Applications that do not use NavAction or that run a version outside the affected range can skip this.
| Product | Ecosystem | Affected | Fixed in |
|---|---|---|---|
| gov.nsa.emissary:emissary | maven | < 8.51.0 | 8.51.0 |
gov.nsa.emissary:emissary version in your build file; versions below 8.51.0 are affected.VALID_LINK pattern ^(https?:/)?/.* in NavAction.java (around line 47).gov.nsa.emissary:emissary 8.51.0 is the fixed version per the product range, but the advisory says the fix is incomplete, so confirm the regex in that release.Each row is the first time that source carried this signal. The analyst’s rows are its own findings.
The URL validation regex ^(https?:/)?/.* added to emissary's NavAction.java allows protocol-relative URLs (//evil.com/...) and single-slash scheme variants (http:/evil.com) to bypass validation, enabling SSRF and open redirect attacks.
Medium
CWE-918 — Server-Side Request Forgery (SSRF)
The fix in NavAction.java (line 47) introduces a VALID_LINK pattern:
Pattern.compile("^(https?:/)?/.*")
This regex is intended to restrict navigation links to relative paths and HTTP/HTTPS URLs. However, it has multiple bypass vectors.
Protocol-relative URLs (//evil.com/...): The group (https?:/)? is optional, so the pattern reduces to //.* when the group is absent. This matches //evil.com/steal?c=SESSION, which browsers resolve to the current page's protocol plus the attacker's host.
Single-slash scheme (http:/evil.com): The regex group captures http:/ as a valid match, and browsers normalize http:/evil.com to http://evil.com, creating an open redirect to the attacker's server.
Protocol-relative to cloud metadata (//169.254.169.254/...): This enables SSRF to cloud instance metadata endpoints, which is particularly dangerous in AWS/GCP environments where IAM credentials can be retrieved.
The pre-fix code had no validation at all, accepting any URL. The fix blocks javascript:, ftp:, and data: URIs, but the protocol-relative and single-slash bypasses remain exploitable.
"""
CVE-2026-35571 - NationalSecurityAgency/emissary SSRF via NavAction
The fix in commit e2078417464b adds URL scheme validation using:
Pattern.compile("^(https?:/)?/.*")
This allows protocol-relative URLs (//evil.com) and single-slash variants
(http:/evil.com) to bypass the validation.
Tested against: emissary@0d4dc56 (pre-fix) and patch e207841
Extracted from: src/main/java/emissary/server/mvc/NavAction.java:47
"""
import re
import sys
FIXED_PATTERN = re.compile(r"^(https?:/)?/.*")
def vulnerable_accepts(link: str) -> bool:
"""Pre-fix behaviour: no validation, everything passes."""
return True
def fixed_accepts(link: str) -> bool:
"""Post-fix behaviour: must match VALID_LINK pattern."""
return bool(FIXED_PATTERN.match(link))
TEST_VECTORS = [
("javascript: XSS payload",
"javascript:alert(document.cookie)", True),
("ftp: scheme",
"ftp://evil.com/exfil", True),
("data: URI",
"data:text/html,<script>alert(1)</script>", True),
("Relative path",
"/path/to/resource", False),
("HTTP URL",
"http://trusted.internal:8080/api", False),
("HTTPS URL",
"https://trusted.internal/api", ),
(,
, ),
(,
, ),
(,
, ),
(,
, ),
(,
, ),
(,
, ),
(,
, ),
(,
, ),
(,
, ),
(,
, ),
(,
, ),
]
():
( * )
()
()
( * )
()
bypasses_found = []
results_table = []
desc, url, should_block TEST_VECTORS:
vuln_result = vulnerable_accepts(url)
fixed_result = fixed_accepts(url)
should_block fixed_result:
status =
bypasses_found.append((desc, url))
should_block fixed_result:
status =
should_block fixed_result:
status =
should_block fixed_result:
status =
:
status =
results_table.append((desc, url, vuln_result, fixed_result, status))
desc, url, vuln, fixed, status results_table:
display_url = (url) (url) > url
()
()
()
()
( * )
()
()
()
bypasses_found:
()
()
desc, url bypasses_found:
()
()
()
()
()
()
()
()
()
()
()
sys.exit()
:
()
sys.exit()
__name__ == :
main()
Steps to reproduce:
python3 poc.pyExpected output:
VULNERABILITY CONFIRMED
Protocol-relative URLs (//evil.com/) and single-slash variants (http:/evil.com) bypass the regex validation.
An attacker can craft navigation links that bypass URL validation to redirect users to attacker-controlled servers (open redirect) or make the emissary server issue requests to internal services (SSRF). The //169.254.169.254/latest/meta-data/ bypass is particularly dangerous in cloud environments, enabling retrieval of IAM credentials.
Replace the regex with one that explicitly rejects protocol-relative URLs. Alternatively, parse the URL with java.net.URI and validate the scheme and host against an allowlist rather than relying on regex.
This page as .md · .json · in your agent: get_signal("CVE-2026-54442")
GitHub Advisory Database, CC-BY 4.0. Posts quoted belong to their authors.