CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-XW4P-PW82-HQR7

GHSA-xw4p-pw82-hqr7: Path Traversal in OpenClaw Skill Mirroring

Amit Schendel
Amit Schendel
Senior Security Researcher

Mar 2, 2026·5 min read·7 visits

Executive Summary (TL;DR)

OpenClaw's skill syncing logic fails to sanitize skill names, allowing malicious skills to write files outside the sandbox directory via path traversal characters.

A critical path traversal vulnerability exists in the OpenClaw (Moltbot) AI agent framework within its skill mirroring mechanism. The vulnerability allows a malicious actor to escape the intended sandbox environment by manipulating skill metadata. Specifically, the `syncSkillsToWorkspace` function improperly constructs file destination paths using unvalidated user input, enabling arbitrary file writes to the host filesystem.

Vulnerability Overview

The OpenClaw framework (also known as Moltbot) creates sandbox environments to safely execute AI "skills"—modular capabilities defined by users or third parties. A core component of this architecture is the skill mirroring mechanism, specifically the syncSkillsToWorkspace function, which copies skill source files from a repository into a designated workspace directory for execution.

A path traversal vulnerability (CWE-22) was identified in how this function handles destination paths. When syncing a skill, the system determines the target directory using metadata provided within the skill itself (specifically the name field in SKILL.md). Because this input was not validated or sanitized, a malicious skill definition could manipulate the destination path, effectively breaking out of the sandbox confinement. This flaw allows an attacker to write arbitrary files to the host system with the privileges of the OpenClaw process.

Root Cause Analysis

The root cause lies in the insecure concatenation of user-controlled input with a filesystem path without prior validation. The vulnerable code used the standard Node.js path.join() function to construct the destination directory for a skill. While path.join normalizes paths, it does not prevent directory traversal if the segments themselves contain traversal sequences like ../.

In the vulnerable implementation, the code extracted the name property directly from the skill's frontmatter configuration and appended it to the targetSkillsDir. A malicious actor could define a skill name such as ../../../etc/cron.d/, causing the subsequent copy operation (fsp.cp) to write files outside the intended targetSkillsDir. The application implicitly trusted that the metadata name would be a safe, valid directory name, rather than treating it as untrusted input.

Crucially, the system lacked a boundary check—such as resolving the final path and ensuring it starts with the expected root path—before performing the file operation.

Code Analysis

The following analysis contrasts the vulnerable logic with the remediated code in src/agents/skills/workspace.ts.

Vulnerable Code: The original implementation directly joined the target directory with the potentially malicious skill name.

// src/agents/skills/workspace.ts (Pre-patch)
for (const entry of entries) {
  // VULNERABILITY: entry.skill.name is user-controlled and unsanitized.
  // If name is "../../escaped", dest becomes outside targetSkillsDir.
  const dest = path.join(targetSkillsDir, entry.skill.name);
  
  try {
    // Recursive copy writes files to the traversal path
    await fsp.cp(entry.skill.baseDir, dest, { recursive: true });
    // ...
  } catch (error) {
    // ...
  }
}

Fixed Code: The patch abandons the use of the user-defined name for filesystem operations. Instead, it derives the directory name from the source path's basename (which is local and trusted in this context) and employs a strict path resolution utility.

// src/agents/skills/workspace.ts (Patched)
function resolveSyncedSkillDestinationPath(params: { 
  targetSkillsDir: string; 
  entry: SkillEntry; 
  usedDirNames: Set<string>; 
}): string | null {
  // 1. Use filesystem basename instead of arbitrary metadata name
  const sourceDirName = path.basename(params.entry.skill.baseDir).trim();
  
  // 2. Reject suspicious directory names explicitly
  if (!sourceDirName || sourceDirName === "." || sourceDirName === "..") {
    return null;
  }
 
  // 3. Resolve a unique name to prevent collisions
  const uniqueDirName = resolveUniqueSyncedSkillDirName(sourceDirName, params.usedDirNames);
 
  // 4. SECURITY CHECK: resolveSandboxPath ensures the path stays inside root
  // If the resulting path escapes targetSkillsDir, this throws or returns null
  return resolveSandboxPath({
    filePath: uniqueDirName,
    cwd: params.targetSkillsDir,
    root: params.targetSkillsDir,
  }).resolved;
}

Exploitation Scenario

To exploit this vulnerability, an attacker requires the ability to introduce a new skill to the OpenClaw instance. This could occur in scenarios where the agent pulls skills from a public repository or processes a user-submitted skill bundle.

Attack Steps:

  1. Craft Malicious Skill: The attacker creates a skill directory containing a SKILL.md file. In the frontmatter of this file, they set the name field to a traversal payload, e.g., name: "../../../.ssh".
  2. Trigger Sync: The attacker instructs the OpenClaw agent to load or sync this skill. This invokes the syncSkillsToWorkspace function.
  3. File Write: The agent calculates the destination path. Due to the vulnerability, the path resolves to [sandbox_root]/../../../.ssh (effectively ~/.ssh on the host).
  4. Payload Execution: The agent copies the skill's contents (which could include a malicious authorized_keys file) to the target directory. The attacker now has SSH access to the host machine.

This vector is particularly dangerous because it bypasses the primary security mechanism of the agent—the sandbox—allowing for immediate escalation from agent control to host compromise.

Impact Assessment

The impact of this vulnerability is rated High due to the potential for arbitrary file write leading to Remote Code Execution (RCE).

  • Confidentiality: Low direct impact, as this is primarily a write primitive. However, overwriting configuration files could disable security logging or access controls.
  • Integrity: High. Attackers can overwrite system binaries, application code, or user configuration files. This allows for persistent compromise.
  • Availability: High. An attacker could overwrite critical system files, causing the host or the application to crash or become unbootable.

The vulnerability is an "Arbitrary File Write via Path Traversal" (CWE-22). In containerized environments, this might allow escaping the application directory to the container root. In non-containerized deployments, it could lead to full host compromise.

Fix Analysis (1)

Technical Appendix

CVSS Score
High/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:H

Affected Systems

OpenClaw (Moltbot) FrameworkApplications consuming the `openclaw` npm package

Affected Versions Detail

Product
Affected Versions
Fixed Version
openclaw
openclaw
< 2026.2.132026.2.13
AttributeDetail
CWE IDCWE-22
Vulnerability TypePath Traversal
SeverityHigh
Attack VectorNetwork / File Input
ImpactArbitrary File Write / Sandbox Escape
Patch Date2026-02-13

MITRE ATT&CK Mapping

T1006Direct Volume Access
Defense Evasion
T1203Exploitation for Client Execution
Execution
CWE-22
Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')

Vulnerability Timeline

Vulnerability Discovered
2026-02-13
Patch Committed
2026-02-13
Fix Released
2026-02-13

References & Sources

  • [1]Fix Commit on GitHub
  • [2]OpenClaw Repository

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 7 hours ago•GHSA-PW6J-QG29-8W7F
5.9

GHSA-pw6j-qg29-8w7f: State Persistence and Sensitive Credential Leakage in Tornado CurlAsyncHTTPClient

A state persistence vulnerability exists in Tornado's CurlAsyncHTTPClient component where pooled pycurl.Curl handles are reused across asynchronous requests without a complete state reset. Consequently, sensitive per-request configurations, such as client TLS certificates or proxy basic authentication credentials, persist on the shared handle. This behavior leads to subsequent requests leaking these credentials to unauthorized remote servers.

Amit Schendel
Amit Schendel
5 views•7 min read
•about 8 hours ago•CVE-2026-48748
7.5

CVE-2026-48748: Netty HTTP/3 QPACK Blocked Streams Memory Exhaustion

CVE-2026-48748 is a denial-of-service vulnerability in Netty's HTTP/3 codec (netty-codec-http3) occurring when QPACK dynamic tables are enabled but the blocked streams limit is not explicitly configured. A bug in limit checking and a memory leak in stream tracking allow unauthenticated remote attackers to exhaust the JVM heap memory and crash the server.

Amit Schendel
Amit Schendel
7 views•6 min read
•about 8 hours ago•CVE-2026-50009
4.8

CVE-2026-50009: Stateless Reset Token Exposure in Netty QUIC

CVE-2026-50009 is a cryptographic design vulnerability in the Netty network application framework. Prior to version 4.2.15.Final, the framework's QUIC protocol implementation fails to cryptographically segregate the generated Connection IDs and the associated Stateless Reset Tokens. An on-path network attacker who sniffs traffic during a Connection ID rotation can extract secret token material from cleartext headers, enabling them to inject spoofed reset packets and terminate active connections.

Alon Barad
Alon Barad
6 views•6 min read
•about 9 hours ago•CVE-2026-50010
7.5

CVE-2026-50010: Hostname Verification Bypass in Netty TLS Client

A critical hostname verification bypass vulnerability exists in the Netty network application framework when configured as a TLS client. When a developer registers a custom plain X509TrustManager, Netty wraps it inside an X509TrustManagerWrapper to adapt it to the X509ExtendedTrustManager API. However, this wrapper discards the SSLEngine context, bypassing critical hostname checks. Because the wrapper is identified as an X509ExtendedTrustManager, standard cryptographic engines and Netty's OpenSSL wrappers do not re-wrap it, failing to execute any hostname validation. Consequently, clients silently accept certificates for any host, enabling unauthenticated Man-in-the-Middle (MitM) attacks.

Amit Schendel
Amit Schendel
6 views•8 min read
•about 9 hours ago•CVE-2026-50011
7.5

CVE-2026-50011: Unbounded Resource Pre-Allocation in Netty Redis Codec

An uncontrolled resource pre-allocation flaw in the Netty Redis codec module allows remote unauthenticated attackers to cause a denial of service (OutOfMemoryError) by sending a crafted Redis Serialization Protocol (RESP) array header.

Amit Schendel
Amit Schendel
4 views•7 min read
•about 10 hours ago•CVE-2026-50020
5.3

CVE-2026-50020: HTTP Request Smuggling in Netty HttpObjectDecoder via Arbitrary Leading Control Bytes

CVE-2026-50020 is a medium-severity HTTP Request Smuggling/Response Smuggling vulnerability (CWE-444) within the Netty asynchronous network application framework. The flaw resides in Netty's HTTP codec implementation, specifically the HttpObjectDecoder class, which silently consumes arbitrary ISO control bytes preceding the first request line.

Alon Barad
Alon Barad
4 views•7 min read