CVE-2025-2595
Executive Summary
CVE-2025-2595 is a forced browsing vulnerability in CODESYS Visualization that allows an unauthenticated remote attacker to bypass user management and read visualization template files or static elements. The vulnerability has a CVSS score of 5.3 (Medium) and is currently unpatched. No public exploit code or proof-of-concept is available, but the attack vector is straightforward: an attacker can directly request protected file paths without authentication, leading to information disclosure of sensitive visualization assets.
This vulnerability affects industrial control systems (ICS) using CODESYS Visualization, commonly deployed in manufacturing, energy, and critical infrastructure. The lack of authentication checks on static file access enables reconnaissance and potential leakage of proprietary control logic or system topology.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
Not applicable – CODESYS Visualization is a proprietary runtime component, not an open-source package.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – exploitable remotely.
- Attack Complexity (AC): Low (L) – no special conditions required.
- Privileges Required (PR): None (N) – no authentication needed.
- User Interaction (UI): None (N) – no user action required.
- Scope (S): Unchanged (U) – impact confined to the vulnerable component.
- Confidentiality (C): Low (L) – limited disclosure of visualization files.
- Integrity (I): None (N) – no data modification.
- Availability (A): None (N) – no denial of service.
Threat Level: Medium. While the CVSS score is moderate, the attack is trivial to execute and can expose sensitive design information in ICS environments.
Deep Dive & Mechanics
The vulnerability resides in the CODESYS Visualization web server component, which serves static visualization files (e.g., .vis, .xml, .png) to authenticated users. Due to missing access control checks on certain endpoints, an unauthenticated attacker can directly request these files by guessing or enumerating file paths.
Root Cause: The web server does not enforce authentication for requests to static file directories. The user management bypass occurs because the server checks authentication only for dynamic pages (e.g., login, control actions) but not for static asset retrieval.
Attack Flow:
- Attacker identifies a CODESYS Visualization instance (e.g., via Shodan search for "CODESYS WebVisu").
- Attacker sends HTTP GET requests to known file paths, such as
/visu/visu.xml,/visu/template.vis, or/static/logo.png. - The server returns the file contents without requiring a session cookie or authentication token.
- Attacker extracts sensitive information (e.g., IP addresses, device names, control logic diagrams).
Impact: Information disclosure of visualization templates can reveal system architecture, network topology, and operational parameters, aiding further attacks.
Vulnerable vs. Patched Code
No patched version is available. The vulnerable code pattern is a missing authentication middleware for static file routes.
Vulnerable (pseudo-code):
# CODESYS Visualization web server (simplified)
def handle_request(path):
if path.startswith("/visu/"):
# No authentication check
return serve_file(path)
elif path.startswith("/api/"):
if not is_authenticated(request):
return 401
return handle_api(path)
Patched (expected):
def handle_request(path):
if path.startswith("/visu/") or path.startswith("/static/"):
if not is_authenticated(request):
return 401
return serve_file(path)
elif path.startswith("/api/"):
if not is_authenticated(request):
return 401
return handle_api(path)
Exploitation & Lab Setup
Red Team
Prerequisites:
- Target running CODESYS Visualization (e.g., CODESYS Control Win V3 or embedded device).
- Network access to the web interface (default port 8080).
Exploitation Steps:
- Enumerate the target:
curl -v http://target:8080/visu/visu.xml - If successful, download all accessible files:
wget -r -np http://target:8080/visu/ - Analyze downloaded files for sensitive data (e.g., IPs, credentials, logic).
No public exploit code is available. The attack is manual forced browsing.
Blue Team
Detection:
- Monitor HTTP logs for requests to
/visu/,/static/, or/template/without prior authentication. - Alert on repeated 200 responses to these paths from unauthenticated IPs.
Hunting:
- Search for anomalous GET requests to visualization file extensions (
.vis,.xml,.png,.svg). - Correlate with failed login attempts (if any) to identify reconnaissance.
Mitigation:
- Implement a reverse proxy (e.g., Nginx) with authentication before the CODESYS web server.
- Restrict network access to the visualization port using firewall rules.
Indicators of Compromise (IOCs)
- Network IOCs:
- HTTP GET requests to
/visu/visu.xml,/visu/template.vis,/static/* - Source IPs scanning multiple file paths in short succession
- HTTP GET requests to
- File IOCs:
- Unauthorized access to files with extensions:
.vis,.xml,.png,.svg,.css,.js
- Unauthorized access to files with extensions:
- Behavioral IOCs:
- Multiple 200 responses to unauthenticated requests for static files
- Absence of session cookies in requests that return visualization content
Detection Engineering
YARA Rule
rule CVE_2025_2595_Forced_Browsing {
meta:
description = "Detects forced browsing attempts against CODESYS Visualization"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-2595"
strings:
$visu_path = "/visu/"
$static_path = "/static/"
$template_ext = ".vis"
$xml_ext = ".xml"
condition:
any of ($visu_path, $static_path) and any of ($template_ext, $xml_ext)
}
Sigma Rule
title: CVE-2025-2595 CODESYS Visualization Forced Browsing
id: 8a3f2c1e-5d7b-4a9f-8c2e-1b3d5f7a9c0e
status: experimental
description: Detects unauthenticated access to CODESYS Visualization static files
author: Valters IT
logsource:
category: webserver
product: apache
service: access_log
detection:
selection:
cs-method: 'GET'
cs-uri-stem|startswith:
- '/visu/'
- '/static/'
cs-uri-stem|endswith:
- '.vis'
- '.xml'
- '.png'
- '.svg'
condition: selection
falsepositives:
- Legitimate authenticated users (check for session cookie)
level: medium
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-2595 CODESYS Visualization Forced Browsing Attempt"; flow:to_server; http.method; content:"GET"; http.uri; content:"/visu/"; nocase; http.uri; content:".vis"; nocase; classtype:attempted-recon; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Network Segmentation: Restrict access to the CODESYS Visualization web interface to trusted IPs only using firewall rules.
- Reverse Proxy: Deploy an Nginx or Apache reverse proxy in front of the CODESYS web server and enforce HTTP Basic Authentication or OAuth.
- Disable Unused Features: If visualization is not required, disable the web server component entirely.
Long-Term Fix:
- Await an official patch from CODESYS. Monitor their security advisory page.
- Implement application-level authentication for all static file routes in custom deployments.
Workaround:
- Modify the CODESYS application to serve visualization files only through authenticated API endpoints (if supported).
Valters IT
Senior DevSecOps & Cyber Threat Intelligence Analyst
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.