2016 年 6 月 22 日,一份关于 Swagger Codegen 漏洞的报告公开,该漏洞允许“通过 Swagger 参数注入执行远程代码”。此特定问题允许使用恶意和精心制作的 OpenAPI 定义,通过 Swagger Codegen 项目创建无效甚至有害的代码。问题不在于 OpenAPI 定义本身,而在于在生成某些客户端和服务器时,在 Swagger Codegen 项目中使用该定义的方式。
@sdavis-r7 的修复已在 swagger-codegen 项目中完成,并在 Swagger Codegen 核心贡献者 William Cheng(@wing328)测试后合并。Swagger Codegen 的新版本正在等待测试,以及 Swagger Codegen 核心团队 对边缘情况的额外测试和支持。
与任何漏洞披露一样,快速行动并解释其严重性和在现实世界中的适用性非常重要。在这种情况下,问题是一些非常精心制作的恶意 OpenAPI 定义_可能_会触发代码生成中的问题。本质上,一些变量替换未被检查,并且取决于变量在模板中的使用方式,可能会暴露问题。
实际上,这不仅被触发的可能性极小,而且生成一个基于 PHP 的服务器,然后以 ROOT 身份未经修改地运行它,而不查看代码,这将是一个非常奇怪的工作流程。为什么?因为无论 Swagger Codegen 项目多么强大,它都无法为您编写业务逻辑,并且几乎总是需要涉及一些编码方面。
然而,查找和解决常见和不常见的问题是任何项目(开源与否)演变过程中非常重要的一部分。因此,得益于 Swagger 社区,已修补报告的漏洞。
如果您正在寻找如何触发此漏洞的示例,请看这里
假设您的 API 具有类似于 `/foo` 的 `path`
路径
/foo
例如,在 Java 中生成的客户端会在模板中执行类似的操作
String localVarPath = "";
因此,替换后生成的代码将变为
String localVarPath = "/foo";
所以,如果你是一个很糟糕的人,并且想做类似的事情
路径
/foo\";System.out.println("have a nice day!");
您可以创建如下替换
String localVarPath = "/foo";System.out.println("have a nice day!");;
或更清楚地说
String localVarPath = "/foo";
System.out.println("have a nice day!");;
这显然会在您的代码中产生不良影响。请注意,从预期模板逻辑中转义的能力与上述示例一样人为——您需要故意使用您精心制作的 OpenAPI 定义来破坏模板逻辑。
这个问题的解决方案很简单,并且已应用于 swagger-codegen 项目,该项目正在发布前进行最终测试。如果您担心此问题,可以始终从 `master` 分支中提取最新代码,或者您可以等待发布公告。
我们始终欢迎在我们的开源项目中进行问题识别和修复!
https://github.com/swagger-api
Swagger 团队