Modern Frontend CVEs

対象CVE: CVE-2026-54661

[緊急対応] swagger-typescript-apiのAxiosクライアントに高深刻度のRCE脆弱性 (GHSA-38c3-wv3c-v3xj)

OpenAPI仕様からTypeScriptクライアントを生成する`swagger-typescript-api`において、Axiosクライアント生成時のコードインジェクション脆弱性が発見されました。悪意のあるOpenAPI仕様が与えられた場合、任意のコードが実行される危険性があります。

はじめに

フロントエンド開発において、OpenAPI (Swagger) 仕様からTypeScriptのAPIクライアントを自動生成するツールは、開発効率を大幅に向上させる重要な役割を担っています。その中でも広く利用されているツールの一つに`swagger-typescript-api`があります。

しかし、この`swagger-typescript-api`の特定のバージョンにおいて、高深刻度のコードインジェクション脆弱性(GHSA-38c3-wv3c-v3xj / CVE-2026-54661)が報告されました。この脆弱性は、特に`axios`をHTTPクライアントとして利用しているプロジェクトに影響を与え、最悪の場合、任意のコード実行(RCE)につながる可能性があります。本記事では、この脆弱性の詳細、影響、そして対策について、日本のフロントエンドエンジニア向けに解説します。

脆弱性の概要 (GHSA-38c3-wv3c-v3xj / CVE-2026-54661)

`swagger-typescript-api`は、OpenAPI仕様からTypeScriptのAPIクライアントコードを生成する際に、OpenAPI仕様内の`servers[0].url`フィールドの値を、生成される`axios`ベースのHTTPクライアントのTypeScriptコードに直接挿入していました。この際、適切にエスケープ処理が行われていなかったことが根本的な原因です。

悪意のあるOpenAPI仕様を`swagger-typescript-api`に読み込ませると、攻撃者は`servers[0].url`を巧妙に細工することで、生成されるクライアントコード内に任意のJavaScript/TypeScriptコードを注入できます。この注入されたコードは、生成されたクライアントがアプリケーション内でインスタンス化される際に実行されます。

この脆弱性は、以前報告された`fetch`クライアント向けのRCE脆弱性と類似しており、根本原因は同じく、OpenAPI仕様から取得した文字列がエスケープされずにテンプレートに直接展開されることにあります。

技術的な詳細:なぜコードが注入されるのか?

`swagger-typescript-api`の内部では、`templates/base/http-clients/axios-http-client.ejs`というEJSテンプレートファイルが`axios`クライアントのコード生成に使われています。このテンプレートの71行目付近に、以下のようなコードがあります。

```ejs this.instance = axios.create({ ...axiosConfig, baseURL: axiosConfig.baseURL || "<%~ apiConfig.baseUrl %>" }) ```

ここで注目すべきは`<%- %>`ではなく`<%-~ %>`という記法が使われている点です。EJSテンプレートにおける`<%-~ %>`は、変数を生のまま(エスケープせずに)展開することを意味します。そして、`apiConfig.baseUrl`はOpenAPI仕様の`servers[0].url`から直接値が渡されていました。

攻撃者は、`servers[0].url`に例えば以下のような文字列を設定します。

``` https://api.example.com", [(async () => { /* 任意のコード */ })()]: 0, dummy: " ```

この文字列がテンプレートに展開されると、生成されるTypeScriptコードの`baseURL`プロパティが閉じられ、代わりにオブジェクトリテラル内に**計算プロパティキー (Computed Property Key)** として即時実行関数式(IIFE)が挿入されます。`dummy: "`は、元のテンプレートの残りの文字列が構文エラーにならないようにするためのものです。

結果として、生成されるコードは以下のようになります。

```typescript this.instance = axios.create({ ...axiosConfig, baseURL: axiosConfig.baseURL || "https://api.example.com", [(async () => { /* 攻撃者の任意のコード */ })()]: 0, dummy: "" }); ```

このIIFEは、`axios.create({...})`の引数であるオブジェクトリテラルが構築される際、つまり`new HttpClient()`(またはそれを継承する`new Api()`)がインスタンス化されるたびに即座に実行されます。PoCでは、`/etc/passwd`を読み取り、その内容を`/tmp/sta_canary`に書き出すといった悪意のある操作が示されています。

考えられる影響とリスクシナリオ

この脆弱性の影響は非常に大きく、任意のコード実行 (RCE) につながります。

対策と推奨事項

この高深刻度な脆弱性に対し、速やかな対応が求められます。

最も推奨される対策は、脆弱性が修正された最新バージョンへ`swagger-typescript-api`をアップデートすることです。公式のアドバイザリを常に確認し、パッチが適用されたバージョンがリリースされ次第、速やかに適用してください。

この脆弱性の根本原因は、`apiConfig.baseUrl`がエスケープされずにテンプレートに渡されることです。理想的な修正は、`src/code-gen-process.ts`内の`createApiConfig`関数(591行目付近)で`baseUrl`を設定する際に、適切なエスケープ処理を施すことです。

例えば、JavaScript文字列リテラルとして安全に扱えるよう`JSON.stringify(serverUrl).slice(1, -1)`のような方法でエスケープするのが有効です。この一箇所の修正で、AxiosクライアントとFetchクライアントの両方に存在する類似の脆弱性が同時に解決されます。

当面のリスク軽減策として、OpenAPI仕様の信頼性を常に確認してください。特に、外部から提供されるOpenAPI仕様や、Gitリポジトリなどの共同作業環境で不特定多数が変更できる仕様については、その内容(特に`servers[0].url`フィールド)を厳重にレビューすることが重要です。

可能であれば、`swagger-typescript-api`によって生成されたクライアントコードもセキュリティレビューの対象とすることをお勧めします。特に、不審なIIFEや評価されるコードが含まれていないかを確認することで、潜在的なリスクを早期に発見できる可能性があります。

まとめ

`swagger-typescript-api`のAxiosクライアント利用者は、本脆弱性(GHSA-38c3-wv3c-v3xj / CVE-2026-54661)について認識し、速やかに対策を講じる必要があります。特にCI/CD環境で自動生成を行っている場合や、信頼できないOpenAPI仕様を扱う可能性のある場合は、深刻な被害につながる前に対応してください。

セキュリティは継続的なプロセスです。利用しているライブラリやツールに脆弱性が発見された際には、迅速な情報収集と対応が求められます。常に最新のセキュリティ情報をチェックし、開発環境と本番環境の安全を確保しましょう。

← ブログ一覧に戻る