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コミュニティのおかげでパッチが適用されました。
この脆弱性がどのようにトリガーされるかの例をお探しなら、こちらをご覧ください。
例えば、`/foo`のような`path`を持つAPIがあるとします。
paths
/foo
例えばJavaで生成されたクライアントは、テンプレートで次のようなことをします。
String localVarPath = "";
したがって、置換後の生成されたコードは次のようになります。
String localVarPath = "/foo";
もしあなたがひどい人物で、次のようなことをしたかったとします。
paths
/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チーム