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,其 `path` 为 `/foo`

路径

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

© . All rights reserved.