在 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("祝您有美好的一天!");
您可以建立如下的替換
String localVarPath = "/foo";System.out.println("祝您有美好的一天!");;
或更清楚地說
String localVarPath = "/foo";
System.out.println("祝您有美好的一天!");;
這顯然會在您的程式碼中產生不良影響。請注意,從預期的範本邏輯中逸出的能力與上述範例一樣是人為的 —— 您需要故意希望使用設計不良的 OpenAPI 定義來破壞範本邏輯。
此解決方案很簡單,並且已應用於 swagger-codegen 專案,該專案正在發佈前進行最後測試。如果您擔心此問題,可以隨時從 `master` 分支提取最新程式碼,或者您可以等待發佈公告。
我們始終歡迎在我們的開源專案中識別和修復問題!
https://github.com/swagger-api
Swagger 團隊