Swagger Codegen 漏洞已解决

  2016 年 6 月 29 日

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 团队