标签 Orval 下的文章

Orval MCP Code Injection 逃逸导致 RCE 分析 漏洞描述

Orval 是一个可以从 OpenAPI v3 或 Swagger v2 规范生成类型安全 JavaScript 客户端(TypeScript)的工具。在 7.18.0 版本之前,MCP 服务器生成逻辑在处理 OpenAPI 规范中的 summary 字段时,没有进行适当的验证或转义,直接将其拼接到生成的代码中。 这使得攻击者可以通过精心构造的 OpenAPI 规范文件,在 summary 字段中注入恶意代码,"跳出"字符串字面量并执行任意 JavaScript 代码。 环境搭建

$ cd orval-7.17.2

$ yarn install


$ yarn build

$ node ./packages/orval/dist/bin/orval.js --version

漏洞复现 验证 Orval 版本 确保你的是漏洞版本

命令:

创建恶意 OpenAPI 规范 文件: poc/real-malicious.yaml

summary 字段包含恶意 payload 开头的单引号 ' 用于闭合前面的字符串字面量 + require('child_process').execSync(...) 是注入的恶意代码 结尾的 ' 开始新的字符串字面量 因为生成逻辑是一个拼接的过程

创建 Orval 配置 文件: poc/real-poc.config.mjs

文件生成

然后就会生成对应的文件

恶意文件是在 server.ts

成功的拼接并闭合了

修复版本生成文件 使用相同的恶意输入,修复版本 (7.18.0) 会生成:

区别: 所有单引号被转义为 \',注入被阻止。 恶意文件触发 只要 MCP 服务器加载脚本,就会立马触发 AI 写个代码

代码分析 OpenAPI 规范加载

Operation 对象提取

operation 对象包含 summarydescription 等字段

字段提取

generateServer 函数/文件拼接点

所以文件的内容如下

漏洞修复 修复方案 packages/mcp/src/index.ts 中引入 jsStringEscape 函数对所有用户控制的输入进行转义。 修复说明 修复 Commit: 80b5fe73b94f120a3a5561952d6d4b0f8d7e928d Orval 7.18.0 (已修复) - packages/mcp/src/index.ts:

jsStringEscape 函数实现 - packages/core/src/utils/string.ts:

如果存在这些字符,那么我们的内容就会被转义,就和防止 sql 注入一样

输入字符
转义后
'
\'
"
\"
\
\\
换行符
\n

参考资料 GHSA-mwr6-3gp8-9jmj 修复 Commit Orval 官方仓库 Model Context Protocol (MCP) 免责声明 本漏洞分析报告仅用于安全研究和教育目的。所有测试均在授权的环境中进行。 请勿将此信息用于任何非法目的。作者不对因滥用此信息而导致的任何损害负责。