Mar 4, 2026·5 min read·17 visits
OpenClaw versions before 2026.1.29 are vulnerable to a 'Zip Slip' variant involving symbolic links. Attackers can overwrite arbitrary files on the host system if the extraction directory contains a symlink pointing to a sensitive location.
A critical path traversal vulnerability exists in the OpenClaw AI assistant platform's archive extraction logic. The flaw allows attackers to bypass directory confinement by leveraging pre-existing symbolic links within the destination directory. This facilitates arbitrary file writes outside the intended extraction root, potentially leading to Remote Code Execution (RCE) by overwriting sensitive system files or application code.
A path traversal vulnerability was identified in the openclaw package, specifically within the module responsible for extracting ZIP archives. The vulnerability is a variant of the "Zip Slip" attack (CWE-22) but relies specifically on the mishandling of symbolic links (CWE-59) rather than standard parent directory traversal sequences (../).
The affected component is the archive extraction utility used by OpenClaw to process user-uploaded content, such as third-party skills, plugins, or avatar assets. When extracting a compressed archive, the application failed to validate whether the resolved path of a file entry effectively traversed outside the intended destination directory due to symbolic links already present on the filesystem. This oversight allows an attacker to write files to arbitrary locations on the server, provided they can influence the contents of the extraction directory prior to the malicious extraction event.
The root cause of the vulnerability lies in the reliance on lexical path validation rather than canonical path resolution. The extraction logic constructed the output path using path.join(destination, entryName) and subsequently verified if the resulting string began with the destination directory string.
This approach is insufficient because it ignores the filesystem state. While path.join resolves ../ sequences, it does not resolve symbolic links. If the destination directory contains a symbolic link (e.g., link -> /etc), a file entry named link/passwd would result in a path string that lexically appears safe (e.g., /tmp/extract/link/passwd starts with /tmp/extract). However, when the operating system performs the write operation, it follows the symlink, redirecting the write to /etc/passwd.
The vulnerability highlights a Time-of-Check Time-of-Use (TOCTOU) discrepancy where the application validates the abstract path string but the operating system acts on the concrete inode structure.
The remediation introduces a defense-in-depth strategy that validates path segments against symbolic links and enforces strict file open flags. The fix is located in src/infra/archive.ts.
Vulnerable Logic (Conceptual): The original code performed a simple prefix check:
const outPath = path.join(destDir, entry.name);
if (!outPath.startsWith(destDir)) throw new Error("Invalid path");
// Proceed to write to outPathPatched Logic:
The fix introduces assertNoSymlinkTraversal, which iterates through every segment of the relative path to ensure no component is a symbolic link. It also employs O_NOFOLLOW during file creation to prevent following symlinks at the final path component.
// From src/infra/archive.ts
async function assertNoSymlinkTraversal(params: { rootDir: string; relPath: string; }) {
const parts = params.relPath.split("/").filter(Boolean);
let current = path.resolve(params.rootDir);
// Iteratively check every path segment
for (const part of parts) {
current = path.join(current, part);
// Explicitly check for symlinks
let stat = await fs.lstat(current).catch(() => null);
if (stat && stat.isSymbolicLink()) {
throw new Error(`archive entry traverses symlink: ${params.originalPath}`);
}
}
}Additionally, the patch resolves the real path of the destination directory before extraction begins (assertDestinationDirReady) to ensure the root itself is not a redirection.
Exploiting this vulnerability requires a "pivot" strategy where the attacker leverages the state of the filesystem. The attack proceeds in two phases:
Pre-seeding (The Pivot): The attacker must ensure a symbolic link exists in the target extraction directory. This might be achieved through a prior legitimate extraction (if the extractor allows symlinks but doesn't follow them), or via another vulnerability that allows creating symlinks (e.g., a lesser file upload bug).
exploit_dir/target_link pointing to /root/.ssh.Traversal (The Trigger): The attacker uploads a malicious ZIP file containing an entry named target_link/authorized_keys.
Execution: OpenClaw constructs the path exploit_dir/target_link/authorized_keys. The lexical check passes. The file write operation follows target_link to /root/.ssh and overwrites authorized_keys with the attacker's public key.
This vector is particularly dangerous in environments where users can install "skills" or plugins, as these often involve unpacking archives into a dedicated workspace.
The impact of this vulnerability is critical, potentially resulting in full system compromise.
~/.ssh/authorized_keys, crontabs, or application scripts (e.g., replacing index.js), an attacker can gain persistent shell access or execute arbitrary commands.The severity is mitigated slightly by the requirement for a pre-existing symlink, but in automated environments or shared hosting scenarios, this condition is often satisfiable.
The vulnerability is patched in OpenClaw version 2026.1.29 and later. The fix involves strict validation of path components and the use of safe file system flags.
Immediate Actions:
openclaw package to version 2026.1.29 or higher immediately./etc, /usr, /root).ELOOP (Too many symbolic links) or security exceptions related to path traversal, which may indicate attempted exploitation against patched systems.CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
openclaw openclaw | < 2026.1.29 | 2026.1.29 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-59 |
| Attack Vector | Network / Local |
| CVSS Score | 8.8 |
| Impact | Arbitrary File Write / RCE |
| Patch Status | Available |
| Exploit Maturity | Proof of Concept |
Improper Link Resolution Before File Access ('Link Following')
An uncontrolled resource consumption vulnerability exists in the Scala-based http4s-blaze-server package of the http4s/blaze library. The vulnerability allows remote, unauthenticated attackers to cause an Out of Memory Error (OOM) and JVM crash by streaming a continuous sequence of small or empty WebSocket continuation frames with the FIN bit set to 0. This bypasses typical payload size checks because of the JVM's per-object allocation overhead, leading to rapid heap exhaustion with minimal network bandwidth.
A critical path traversal vulnerability has been identified in the OpenList Go-based backend package. The vulnerability exists within the batch rename handler because the application does not validate the source filename parameter before constructing filesystems paths. This omission allows authenticated users to escape their designated directory and rename files in sibling paths.
OpenList version 4.2.3 and prior is vulnerable to an authorization bypass and metadata leakage. When configured with the Bleve search engine backend, OpenList fails to perform separator-aware path matching when validating tenant containment. This allows authenticated users to access sibling directories sharing similar name prefixes. Furthermore, the search backend returns unfiltered global result counts, leaking existence verification data of unauthorized files via side-channel analysis.
An authorization bypass vulnerability in OpenList version 4.2.3 and below allows authenticated users to read arbitrary files outside of their designated base directories due to an insecure path prefix check using Go's standard strings.HasPrefix function.
A security policy bypass vulnerability exists in the AWS API MCP Server (awslabs-aws-api-mcp-server) from version 0.2.13 through 1.3.46. When the server fails to load the read-only operations index during startup (due to transient network failures, file permission issues, or other exceptions), it logs a warning but continues running in an insecure, degraded state. Under this condition, the security policy engine fails open, silently skipping all subsequent security checks and consent prompts for the lifetime of the process. This permits unauthorized mutating AWS CLI commands to execute via indirect prompt injection attacks.
An incomplete escaping vulnerability in the npm package 'shescape' allows unauthenticated users to trigger dynamic shell expansions, absolute path disclosure, and command block break-outs on Unix and Windows systems.