Skip to main content

Emissary CVE-2026-54442

MEDIUM
Server-Side Request Forgery (SSRF) (CWE-918)
2026-10-30 https://github.com/NationalSecurityAgency/emissary GHSA-c6q7-wqw2-h65w
4.8
CVSS 3.1 · GitHub Advisory
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain privileged config access to nav links
  2. Delivery
    Inject protocol-relative URL (//169.254.169.254)
  3. Exploit
    Authenticated user loads navigation bar
  4. Execution
    Victim clicks bypassed link
  5. Persist
    Browser reaches attacker host or metadata endpoint
  6. Impact
    Session or IAM credentials exfiltrated

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V4 - API and Web Service URL allowlisting, SSRF prevention
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Credential Access

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Requires the ability to populate an emissary navigation-link value (the navButtons/navItems map consumed by NavAction) with an attacker-chosen string whose value matches ^(https?:/)?/.* - specifically a protocol-relative URL (//evil.com, //169.254.169.254/...), a single-slash scheme (http:/evil.com, https:/evil.com), or a triple-slash (///evil.com) - plus a victim who clicks the rendered nav link (UI:R). The sources do not describe how nav-link values are sourced from external/untrusted input, so the injection vector is not fully specified and should be treated as config- or privilege-dependent (PR:H). Limiting factors: privileged/configuration-level access to nav links, required user interaction, and a bypass string matching the flawed regex. Impact is greatest in AWS/GCP deployments, where the //169.254.169.254/latest/meta-data/ vector can reach the instance metadata endpoint and expose IAM credentials.

Impact

This is a CVSS 4.8 (Medium) issue and the severity signals are consistent with a lower-tier priority rather than an emergency. The CVSS vector CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:N is network-reachable but gated by two strong limiters: PR:H (the flaw lives in navigation-link configuration, which an attacker must be able to populate) and UI:R (a victim must click the rendered link). No EPSS score and no CISA KEV entry were supplied, and the vuln.today decision label is 'this_month' - not 'act_now' or 'emergency' - so none of the decision signals indicate active or imminent widespread exploitation. The supplied PoC is a Python script that only re-implements and tests the regex ^(https?:/)?/.*; it demonstrates the bypass logic but does not drive a running emissary server, so it is not verified as working end-to-end exploit code. One framing caveat worth verifying with the vendor: the advisory labels this CWE-918 SSRF, but the affected code renders the link into an HTML <a href> attribute (client-side navigation), which makes open redirect and browser-driven requests to //169.254.169.254/... the clearly demonstrated impact; true server-side SSRF only applies if emissary itself fetches the configured link, which the sources do not confirm. Net assessment: a real but lower-priority defect - an incomplete follow-up fix to CVE-2026-35571 - whose practical risk is held down by the privileged-configuration and user-interaction requirements, most meaningful in cloud deployments where metadata credential theft is possible.

Exploit ScenarioDerived

An actor able to set an emissary navigation-link value configures an entry to a protocol-relative URL such as //evil.com/steal?c=SESSION or //169.254.169.254/latest/meta-data/; the regex ^(https?:/)?/.* fails to reject it, so it is rendered as a clickable nav link. When a user clicks it, the browser is redirected to the attacker host (open redirect / session theft) or to the cloud metadata endpoint, potentially exposing IAM credentials. A public PoC demonstrates the regex bypass but only simulates the pattern and is not verified as a working server exploit; exploitation also requires privileged configuration access (PR:H) and victim interaction (UI:R).

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 30, 2026

Emissary's navigation-link filter in NavAction.java can be bypassed, so a crafted nav entry can still drive users to an attacker-controlled host (open redirect) or make the Emissary server request internal resources such as the cloud instance metadata endpoint (SSRF). The problem is an incomplete fix: the added pattern ^(https?:/)?/.* accepts protocol-relative strings like //evil.com/..., //169.254.169.254/latest/meta-data/, and single-slash scheme forms such as http:/evil.com, while blocking javascript:, ftp: and data: URIs. Scored CVSS 4.8 (Medium) with a vector requiring high privileges (PR:H) and victim interaction (UI:R), the issue is not in CISA KEV and no confirmed working exploit is known, although the advisory publishes a PoC script demonstrating the regex bypass; package metadata lists the fixed release as 8.51.0.

RemediationAI

Vendor-released patch: 8.51.0, per package metadata (the advisories instead list >= e2078417464b, the commit at https://github.com/NationalSecurityAgency/emissary/commit/e2078417464b9004620dde28dcbca2f73ea06c13); upgrade to the fixed release and verify the navigation filter rejects protocol-relative (//evil.com, //169.254.169.254/...), single-slash (http:/evil.com, https:/evil.com), triple-slash and backslash variants rather than only blocking javascript:, ftp: and data:. The advisory's suggested remediation is to replace the regex with java.net.URI parsing plus explicit scheme and host allowlisting, since regex-only checks are what produced this incomplete fix. Until the update is applied, because populating nav-link values requires high-privileged configuration access (PR:H), keep the navButtons/navItems configuration writable only by trusted administrators and audit existing entries for leading //, ///, \ or single-slash scheme forms; the latter reduces exposure but does not remove the SSRF path, and any tightening of link configuration will block legitimate externally hosted navigation targets. For deployments where the //169.254.169.254/latest/meta-data/ vector matters, enforce IMDSv2-only access so the metadata service is not reachable by unauthenticated request-forgery traffic, accepting the migration cost for older instance tooling.

Affected Packages

maven gov.nsa.emissary:emissary fix: 8.51.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in maven

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Emissary is a Java (Maven, gov.nsa.emissary:emissary) analysis framework whose web UI builds a navigation bar from a navButtons/navItems map rendered through the nav.mustache template; the pre-fix code passed link values straight into the href attribute with no validation. The remediation commit e2078417464b added a VALID_LINK pattern in NavAction.java plus a filter in getNavItems(), and added rel="noopener noreferrer" to the rendered anchors. Root cause class is CWE-918 (Server-Side Request Forgery), compounded by an open-redirect pattern: the optional group (https?:/)? means the pattern degenerates to //.* when the scheme group is absent, so protocol-relative URLs match; the group also happily captures a single slash after the scheme (http:/, https:/), which browsers normalize into a full http:// URL. Because these values are rendered as links and consumed by the navigation flow, a privileged configuration-level actor can point navigation at an arbitrary host, and in AWS/GCP deployments the //169.254.169.254/latest/meta-data/ form can reach instance metadata and expose IAM credentials. Views also note the pre-fix build accepted any URL, so the filter is a narrowing control rather than a complete one.

Know when Java 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

GitHub Advisory PRIMARY 4.8 MEDIUM
AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:N
vuln.today AI 4.8 MEDIUM

Nav links come from configuration an attacker must control, so PR:H; the victim must click the rendered link, so UI:R; the redirect crosses into the attacker/browser context, so S:C; limited confidentiality/integrity from session or metadata exposure and no availability impact.

3.1 AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:H/UI:A/VC:L/VI:L/VA:N/SC:L/SI:N/SA:N

Primary rating from GitHub Advisory.

CVSS VectorGitHub Advisory

Attack Vector
Network
Attack Complexity
Low
Privileges Required
High
User Interaction
Required
Scope
Changed
Confidentiality
Low
Integrity
Low
Availability
None

DescriptionGitHub Advisory

Summary

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.

Affected Package

  • Ecosystem: Maven
  • Package: NationalSecurityAgency/emissary
  • Affected versions: < e2078417464b
  • Patched versions: >= e2078417464b

Severity

Medium

CWE

CWE-918 - Server-Side Request Forgery (SSRF)

Details

The fix in NavAction.java (line 47) introduces a VALID_LINK pattern:

java
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.

PoC

python
"""
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", False),

    ("Protocol-relative URL to attacker host (//evil.com)",
     "//evil.com/steal?c=SESSION", True),
    ("Protocol-relative with embedded credentials",
     "//user:pass@evil.com/path", True),
    ("Protocol-relative to cloud metadata (//169.254.169.254)",
     "//169.254.169.254/latest/meta-data/", True),
    ("Backslash trick (\\\\evil.com)",
     "\\\\evil.com/path", True),
    ("Tab in scheme (java\\tscript:...)",
     "java\tscript:alert(1)", True),
    ("Path starting with attacker-like host (/evil.com)",
     "/evil.com", False),
    ("Triple slash (///evil.com)",
     "///evil.com/etc/passwd", True),
    ("http:/ single-slash to attacker host",
     "http:/evil.com/steal", True),
    ("https:/ single-slash to attacker host",
     "https:/evil.com/steal", True),
    ("URL-encoded javascript scheme (%6a...)",
     "%6aavascript:alert(1)", True),
    ("CRLF injection in path",
     "/legit\r\nLocation: http://evil.com", True),
]


def main():
    print("=" * 72)
    print("CVE-2026-35571 -- Emissary NavAction SSRF / Open-Redirect PoC")
    print("Pattern under test: ^(https?:/)?/.*")
    print("=" * 72)
    print()

    bypasses_found = []
    results_table = []

    for desc, url, should_block in TEST_VECTORS:
        vuln_result = vulnerable_accepts(url)
        fixed_result = fixed_accepts(url)

        if should_block and fixed_result:
            status = "BYPASS"
            bypasses_found.append((desc, url))
        elif should_block and not fixed_result:
            status = "BLOCKED (good)"
        elif not should_block and fixed_result:
            status = "ALLOWED (good)"
        elif not should_block and not fixed_result:
            status = "FALSE-POS"
        else:
            status = "UNKNOWN"

        results_table.append((desc, url, vuln_result, fixed_result, status))

    for desc, url, vuln, fixed, status in results_table:
        display_url = repr(url) if len(url) > 50 else url
        print(f"[{status:>15}]  {desc}")
        print(f"{'':>17}  URL: {display_url}")
        print(f"{'':>17}  pre-fix={vuln}  post-fix={fixed}")
        print()

    print("=" * 72)
    print(f"Total vectors tested : {len(TEST_VECTORS)}")
    print(f"Bypasses found       : {len(bypasses_found)}")
    print()

    if bypasses_found:
        print("VULNERABILITY CONFIRMED -- the following vectors bypass the fix:")
        print()
        for desc, url in bypasses_found:
            print(f"  - {desc}")
            print(f"    URL: {repr(url)}")
        print()
        print("Key finding: The regex ^(https?:/)?/.* allows protocol-relative")
        print("URLs (//evil.com/...) because the optional group (https?:/) can be")
        print("absent, leaving //.* which matches //attacker.com. This enables")
        print("SSRF to arbitrary external hosts via navigation links.")
        print()
        print("Additionally, http:/evil.com and https:/evil.com match the regex")
        print("(group 1 captures 'http:/' or 'https:/') and browsers normalise")
        print("these to http://evil.com, enabling open redirect / SSRF.")
        sys.exit(0)
    else:
        print("No bypasses found -- fix appears complete.")
        sys.exit(1)


if __name__ == "__main__":
    main()

Steps to reproduce:

  1. Run python3 poc.py
  2. Observe that protocol-relative and single-slash URLs bypass the regex

Expected output:

VULNERABILITY CONFIRMED
Protocol-relative URLs (//evil.com/) and single-slash variants (http:/evil.com) bypass the regex validation.

Impact

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.

Suggested Remediation

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.

References

  • Incomplete fix commit: https://github.com/NationalSecurityAgency/emissary/commit/e2078417464b9004620dde28dcbca2f73ea06c13
  • Original CVE: CVE-2026-35571

Threat Intelligence Overview

Prevalence
Low
niche NSA open-source data-workflow framework, limited production footprint
Threat Intel
1
1 source
Data Quality
3 sources
Confidence: Low
NVD CVE.org GHSA GitHub

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
Medium

Priority Score

24
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +24
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.

Affected Products (CPE)GitHub Advisory

pkg:maven/gov.nsa.emissary:emissary

More in Java

View all
CVE-2012-4681 CRITICAL POC
9.8 Aug 28

Oracle Java SE 7 Update 6 and earlier contains multiple sandbox bypass vulnerabilities via the ClassFinder and forName m

CVE-2015-7450 CRITICAL POC
9.8 Jan 02

Remote code execution in IBM Sterling B2B Integrator, Sterling Integrator, and Tivoli Common Reporting allows unauthenti

CVE-2013-2465 CRITICAL POC
9.8 Jun 18

Java Runtime Environment sandbox bypass via incorrect image channel verification in 2D component allows remote unauthent

CVE-2011-3544 CRITICAL POC
9.8 Oct 19

Oracle Java SE JDK/JRE 7 and 6 Update 27 and earlier allows remote code execution with complete system compromise throug

CVE-2010-1871 HIGH POC
8.8 Aug 05

JBoss Seam 2 in Red Hat JBoss EAP 4.3.0 fails to sanitize JBoss Expression Language inputs, allowing remote attackers to

CVE-2012-1723 CRITICAL POC
9.8 Jun 16

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 update 4 and earlier, 6 up

CVE-2013-0422 CRITICAL POC
9.8 Jan 10

Multiple vulnerabilities in Oracle Java 7 before Update 11 allow remote attackers to execute arbitrary code by (1) using

CVE-2012-0507 CRITICAL POC
9.8 Jun 07

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 2 and earlier, 6 Up

CVE-2015-4852 CRITICAL POC
9.8 Nov 18

The WLS Security component in Oracle WebLogic Server 10.3.6.0, 12.1.2.0, 12.1.3.0, and 12.2.1.0 allows remote attackers

CVE-2012-5076 CRITICAL POC
9.8 Oct 16

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 7 and earlier allow

CVE-2017-3066 CRITICAL POC
9.8 Apr 27

Remote unauthenticated attackers can execute arbitrary code on Adobe ColdFusion servers through Java deserialization fla

CVE-2012-0391 CRITICAL POC
9.8 Jan 08

The ExceptionDelegator component in Apache Struts before 2.2.3.1 interprets parameter values as OGNL expressions during

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy