Someone left the factory's control-room window unlocked, but you still have to trick a specific engineer into opening it for you
CVE-2026-63354 is one of eight XSS flaws (SSA-591731) in the integrated web server shipped with Siemens SIMATIC S7-1500 CPUs, SIMATIC Drive Controllers (CPU 1504D TF, CPU 1507D TF), ET 200SP/pro CPUs, SIPLUS variants, S7-1500 Software Controller, and S7-PLCSIM Advanced — essentially the entire S7-1500 family, all firmware versions. The bug is specifically in how the Trace page renders *visual marker data* from imported CSV trace files: marker fields are embedded into the HTML without sanitization, producing a stored-XSS condition. Once JavaScript fires in an engineer's authenticated browser session, it can call the web-server API to perform PLC operations — reading diagnostics, toggling outputs, and in some configurations modifying process data — scoped to whatever function rights the victim holds. No patch exists; Siemens says fixes are "in preparation" with no ETA.
Siemens rates this CRITICAL at CVSS 9.6 (AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H). That score leans hard on *Changed Scope* — the idea that browser-level XSS crosses into PLC-operation impact — and assumes the web server is network-reachable with no segmentation. The rating is defensible in a worst-case OT model, but it overstates the friction. The attacker cannot simply fire an HTTP request; they must craft a valid CSV trace file, social-engineer a specific engineer who holds 'Read diagnostics' rights, and that engineer must manually import the file through the Trace UI. In any facility following IEC 62443 segmentation and change-management discipline, that chain is hard to land. The three 9.6-rated CVEs in this batch (63350, 63353, 63354) all share the same delivery constraint — they differ only in *which* CSV field carries the payload. A realistic reassessment drops this to HIGH (7.5).
5 steps from start to impact.
Craft malicious CSV trace file
<script> tags or event handlers — because the web server performs zero sanitization on marker fields before DOM insertion. No specialized tooling is needed beyond a text editor and the Siemens TIA Portal trace-export format documentation.- Knowledge of SIMATIC Trace CSV schema (publicly documented in TIA Portal help)
- CSV format is product-specific; generic payloads require minor adaptation
- No public PoC or weaponized generator exists as of 2026-10-14
Deliver CSV to an authorized engineer
- Identification of a target user with 'Read diagnostics' rights
- A delivery channel that reaches the engineer's workstation
- Well-segmented OT networks restrict file transfer across IT/OT boundaries
- OT personnel in regulated sectors often follow strict file-import procedures
- Email-borne CSV attachments may be stripped or sandboxed by email gateways
Engineer imports trace file via web UI
- PLC web server is enabled and network-reachable from the engineer's workstation
- Engineer has 'Read diagnostics' function right
- Engineer actively imports the file through the Trace UI
- Web server is disabled by default in hardened deployments per Siemens guidance
- Many S7-1500 operators use TIA Portal for diagnostics rather than the web UI
- Import is a manual multi-click action, not a passive page load
Stored XSS fires in engineer's browser
- Browser does not block inline script execution (no CSP headers from PLC web server)
- Some browser extensions (NoScript, uBlock Origin) may block inline script execution
- The PLC web server's CORS and cookie policies may limit cross-origin exfiltration
PLC operations via hijacked session
- Victim's function rights include PLC-write operations (not just 'Read diagnostics')
- Web server API exposes the specific operation the attacker wants
- 'Read diagnostics' alone limits the attacker to read-only operations
- Full PLC programming (logic changes) requires TIA Portal, not the web API
- Session duration limits the attack window — closing the browser terminates access
- WAF in front of the PLC — Industrial PLCs do not sit behind web application firewalls in any standard OT architecture. Even if you could proxy the traffic, the malicious payload is in an *imported file*, not in an inbound HTTP request to the PLC.
- Antivirus scanning of CSV files — AV engines do not flag JavaScript embedded in CSV fields as malicious. The payload is plain text in a data column, not an executable or macro.
- Browser CSP headers — The PLC web server does not set Content-Security-Policy headers, and you cannot configure it to do so. You have no control over the server-side response headers on the S7-1500 firmware.
- Patching — No patch exists as of 2026-10-14. Siemens has not published a timeline. You cannot remediate by upgrading firmware today.
The supporting signals.
| In-the-Wild Exploitation | None confirmed. Not listed in CISA KEV. No campaigns targeting this specific XSS vector. However, CISA AA26-231A (August 2026) warns of active AI-assisted exploitation of S7 PLCs via S7comm protocol — a *separate* attack surface, but it means S7-1500s are under heightened adversary attention. |
|---|---|
| Proof-of-Concept | No public PoC. No repos found on GitHub matching CVE-2026-63354. No entries on pocindex.io or ExploitDB. The XSS payload itself is trivial to construct (inject <script> into a CSV field), but no weaponized trace-file generator or end-to-end exploit chain has been published. |
| EPSS Score | Not yet scored — CVE was published 2026-10-13 (yesterday). EPSS model typically ingests new CVEs within 1–2 weeks. Expected to be low given XSS class and no exploitation history. |
| KEV Status | Not listed. No CISA Known Exploited Vulnerabilities catalog entry as of 2026-10-14. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H — The Changed Scope (S:C) is the primary score inflator, reflecting cross-boundary impact from browser to PLC. UI:R correctly captures the social-engineering requirement. PR:N is accurate — the *attacker* needs no PLC auth, but the *victim* does. |
| Affected Versions | All firmware versions across 60+ product SKUs: SIMATIC S7-1500 CPU family (1511 through 1518, all F/T/TF/MFP/ODK variants), Drive Controller CPU 1504D TF and 1507D TF, ET 200SP CPUs (1510SP through 1515SP), ET 200pro CPUs, SIPLUS ruggedized variants, S7-1500 Software Controller V2/V3/V4, and S7-PLCSIM Advanced. |
| Fixed Version | No fix available. Siemens states fixes are "in preparation" with no published timeline. Advisory SSA-591731, dated 2026-10-13. |
| Internet Exposure | Modat research (August 2026) identified 265 S7-1500 devices internet-exposed on TCP/102 across 77 countries. Web-server exposure on ports 80/443 is unquantified but expected to be lower — most internet-exposed PLCs serve S7comm, not HTTP. Shodan product:"Siemens S7-1500" queries confirm a small but non-zero web-facing population. |
| Disclosure & Advisory | Disclosed 2026-10-13 via Siemens ProductCERT advisory SSA-591731. CISA ICS advisory ICSA-26-134-15 covers the same batch. Part of an 8-CVE cluster (CVE-2026-63350 through 63357). |
| Reporting Researcher | Credited to Do Son, founder of SecurityOnline.info, per the SecurityOnline disclosure article dated 2026-10-13. |
Sources.
- Siemens ProductCERT Advisory SSA-591731
- CISA ICS Advisory ICSA-26-134-15
- SecurityOnline — Siemens S7-1500 Eight Unpatched Flaws
- 1898 & Co. — Critical Stored XSS in S7-1500 PLCs
- Modat — Thousands of Siemens PLCs Are Listening
- CISA/NSA/FBI Joint Advisory AA26-231A — Active Threat to Siemens S7 PLCs
- Strix.ai — CVE-2026-63354 Detail
- OffSeq Radar — CVE-2026-63354 Analysis
Why this verdict
- Social-engineering gate: The entire chain hinges on tricking a specific engineer with 'Read diagnostics' rights into manually importing a CSV through the Trace UI. This is not a fire-and-forget network exploit — it requires targeted delivery and active victim participation, which compounds friction significantly in OT environments with change-management procedures.
- Web API blast radius is bounded: The XSS executes in a browser session, not on the PLC firmware. The S7-1500 web API exposes a *subset* of PLC operations — diagnostics, operating-mode toggling, tag read/write — but does not allow safety-PLC logic uploads or firmware modification, which require TIA Portal over a separate channel. This caps the worst-case outcome below full PLC compromise.
- Network position narrows the population: In IEC 62443-compliant deployments, the PLC web server sits inside the OT zone behind a DMZ. External attackers must first breach the IT/OT boundary. Only ~265 S7-1500 units are internet-exposed (port 102), and web-server exposure on 80/443 is unquantified but lower. The practical reachable population for a remote attacker is a fraction of the installed base.
- No exploitation ecosystem: Zero public PoCs, no weaponized tooling, no known campaigns targeting this XSS vector. The broader AA26-231A threat targets S7comm protocol, not the web server. This reduces near-term exploitation probability.
- Role multiplier: The S7-1500 is a canonical OT/ICS controller — 100% of installs occupy the high-value role. The chain *does* succeed in this role: XSS → web API → PLC operations (tag writes, mode changes) → potential process disruption. The blast radius in a worst case is *operational impact* at the single-PLC or process-line level, not fleet-scale or supply-chain-scale. Safety-PLC logic is not modifiable through the web API, limiting the safety-impact ceiling. This floors the verdict at HIGH per the role-multiplier rule, but the friction analysis (social engineering, no PoC, bounded web API) prevents elevation to CRITICAL. To break the CRITICAL floor: the web API does not expose safety-logic modification, and the social-engineering delivery constraint means <5% of real-world S7-1500 deployments are plausibly reachable by this chain without prior OT-network access.
Why not higher?
CRITICAL would require either a directly exploitable network attack (no social engineering), a blast radius reaching safety-PLC logic or fleet-scale impact, or active exploitation. None of these conditions are met. The Changed Scope in the CVSS vector inflates the score by treating browser-to-PLC impact as equivalent to full PLC compromise, but the web API's limited operation set caps real impact below that threshold.
Why not lower?
MEDIUM would undercount the OT context. Even a bounded XSS on a PLC web server can toggle CPU RUN/STOP state, write process-data tags, and disrupt production lines. The S7-1500 is deployed in water treatment, chemical processing, and energy — sectors where even temporary process disruption has safety and regulatory consequences. The no-patch status and active S7 threat landscape (AA26-231A) further support HIGH.
Crowdsourced verification payload.
Run this script from any Linux/macOS workstation on the OT network (or an auditor jumpbox with OT-zone access). It probes a target PLC's web server on ports 80 and 443 to determine if the SIMATIC web interface is active and therefore exposed to CVE-2026-63354. No authentication is required. Usage: chmod +x check_s7_web.sh && ./check_s7_web.sh 10.0.100.50
#!/usr/bin/env bash
# check_s7_web.sh — CVE-2026-63354 exposure check for Siemens S7-1500 web server
# Tests whether the PLC web server is enabled and serving the SIMATIC Trace UI.
# All firmware versions are affected; if the web server responds, the device is VULNERABLE.
# Exit codes: 0 = VULNERABLE, 1 = PATCHED/NOT EXPOSED, 2 = UNKNOWN
set -euo pipefail
if [ $# -lt 1 ]; then
echo "Usage: $0 <PLC_IP_OR_HOSTNAME>"
exit 2
fi
TARGET="$1"
TIMEOUT=5
RESULT="UNKNOWN"
echo "[*] CVE-2026-63354 — Siemens S7-1500 Web Server Exposure Check"
echo "[*] Target: ${TARGET}"
echo "[*] Date: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
echo ""
# Try HTTPS first, fall back to HTTP
for PROTO in https http; do
PORT=443
[ "$PROTO" = "http" ] && PORT=80
echo "[*] Probing ${PROTO}://${TARGET}:${PORT} ..."
RESPONSE=$(curl -sk --connect-timeout "${TIMEOUT}" --max-time 10 \
-o /dev/null -w "%{http_code}" \
"${PROTO}://${TARGET}:${PORT}/" 2>/dev/null || echo "000")
if [ "$RESPONSE" != "000" ]; then
echo "[+] Web server responded on port ${PORT} (HTTP ${RESPONSE})"
# Check for SIMATIC signature in response headers or body
BODY=$(curl -sk --connect-timeout "${TIMEOUT}" --max-time 10 \
"${PROTO}://${TARGET}:${PORT}/" 2>/dev/null || true)
if echo "$BODY" | grep -qi -e "simatic" -e "S7-1500" -e "siemens" -e "plc" -e "webserver"; then
echo "[+] SIMATIC web interface signature detected."
echo ""
echo "=== VULNERABLE ==="
echo "The S7-1500 web server is enabled and serves the SIMATIC interface."
echo "All firmware versions are affected by CVE-2026-63354 (no patch available)."
echo "Mitigation: Disable the web server or restrict ports 80/443 to trusted IPs."
exit 0
else
echo "[-] Web server responded but no SIMATIC signature found."
RESULT="UNKNOWN"
fi
else
echo "[-] No response on port ${PORT}."
fi
done
# If we reach here, no SIMATIC web server was detected
if [ "$RESULT" = "UNKNOWN" ]; then
echo ""
echo "=== UNKNOWN ==="
echo "A web server responded but could not be confirmed as SIMATIC S7-1500."
echo "Manually verify the device identity and web server configuration."
exit 2
fi
echo ""
echo "=== PATCHED ==="
echo "No web server detected on ports 80/443. The PLC web server appears disabled."
echo "If the web server is confirmed disabled, CVE-2026-63354 is not exploitable."
exit 1