GRASSMARLIN XML External Entity (XXE) Out-of-Band File Exfiltration (CVE-2026-6807)
by SecTestAnnaQuinn · 2026-07-05
- Severity
- High
- CVE
- CVE-2026-6807
- Category
- network
- Affected product
- GRASSMARLIN (CISA/ICS-CERT network visualization tool)
- Affected versions
- Not specified in source
- Disclosed
- 2026-07-05
- Patch status
- unpatched
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-06 |
| Author / Researcher | SecTestAnnaQuinn |
| CVE / Advisory | CVE-2026-6807 |
| Category | network |
| Severity | High |
| CVSS Score | Not specified in source (CISA disclosure, 2026-04-28) |
| Status | Weaponized |
| Tags | grassmarlin, xxe, ics-scada, xml-external-entity, oob-exfiltration, cwe-611 |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | GRASSMARLIN (CISA/ICS-CERT network visualization tool) |
| Versions Affected | Not specified in source |
| Language / Platform | Python PoC (payload generator + OOB listener/relay) |
| Authentication Required | Local (ability to have GRASSMARLIN open a crafted stored session XML file) |
| Network Access Required | Yes (for OOB exfiltration channel) |
Summary
GRASSMARLIN’s handling of XML files ingested when opening stored sessions is vulnerable to XML External Entity (XXE) injection. A crafted session XML referencing an external DTD/entity allows out-of-band exfiltration of arbitrary local files from the analyst’s machine, even though direct in-band error output is stripped from GRASSMARLIN’s logs/console. Content is base64-encoded and sent across multiple message chunks to work around input-size/error handling quirks in the bundled Java runtime.
Vulnerability Details
Root Cause
GRASSMARLIN’s XML parser for stored session files resolves external entities/DTDs without restriction, allowing an XXE payload to read local files and exfiltrate their contents via an attacker-controlled out-of-band channel.
Attack Vector
- Craft a malicious GRASSMARLIN session XML file containing an XXE payload that references an external DTD hosted on an attacker-controlled server.
- Have the victim analyst open the crafted session file in GRASSMARLIN.
- The XML parser resolves the external entity, reads a target local file, base64-encodes it, and exfiltrates it in chunks to the attacker’s out-of-band listener.
Impact
Arbitrary local file disclosure from the machine running GRASSMARLIN, via a crafted session file opened by the victim analyst.
Environment / Lab Setup
Target: A machine running GRASSMARLIN with the bundled/required Java runtime, opening a malicious stored session file
Attacker: Python 3 (gen_payload.py to build the malicious session XML, listener_relay.py as the OOB exfil listener)
Proof of Concept
PoC Script
See
gen_payload.pyandlistener_relay.pyin this folder.
| |
gen_payload.py builds a malicious GRASSMARLIN session XML with an XXE payload targeting a specified local file; listener_relay.py receives the base64-encoded, chunked exfiltrated content out-of-band.
Detection & Indicators of Compromise
Signs of compromise:
- GRASSMARLIN process making unexpected outbound network connections when loading a session file
- Session XML files containing external entity declarations
Remediation
| Action | Detail |
|---|---|
| Primary fix | Apply the CISA-referenced GRASSMARLIN fix disabling external entity resolution in the session XML parser |
| Interim mitigation | Do not open untrusted GRASSMARLIN session files; disable external entity processing at the XML parser/Java runtime level if configurable |
References
Notes
Mirrored from https://github.com/SecTestAnnaQuinn/Grassmarlin-CVE-2026-6807-XXE-POC on 2026-07-05.
| |