[解説] swagger-typescript-apiの深刻なコードインジェクション脆弱性 (GHSA-5f94-x226-ccpm)
はじめに:`swagger-typescript-api` とは?
`swagger-typescript-api` は、OpenAPI Spec (旧Swagger) の定義からTypeScriptの型定義やAPIクライアントコードを自動生成するための便利なツールです。これにより、手動での型定義作成の手間を省き、APIとフロントエンド間の型安全な連携を実現できるため、多くのフロントエンド開発プロジェクトで採用されています。
脆弱性の概要:何が問題なのか?
今回解説する脆弱性 (GHSA-5f94-x226-ccpm / CVE-2026-54664) は、`swagger-typescript-api` のenum生成ロジックに起因する深刻度「High」のコードインジェクション脆弱性です。OpenAPI Specに細工されたenum文字列が記述されていると、生成されるTypeScriptファイルに悪意のあるコードが挿入され、そのモジュールが`import`されるだけで、挿入されたコードが実行されてしまいます。
技術的な詳細:なぜコードインジェクションが発生するのか?
根本原因は、`swagger-typescript-api` がTypeScriptのenum宣言に文字列値を埋め込む際に、特殊文字を適切にエスケープせずに直接挿入してしまう点にあります。具体的には、`src/configuration.ts` に定義されている `Ts.StringValue` 関数が、入力値を単に二重引用符で囲むだけで、内部の `"` や改行などの特殊文字に対するエスケープ処理を行っていません。
攻撃者は、OpenAPI Specの `components.schemas.*.enum` フィールドに、以下のような悪意のある文字列を挿入します。
`blue";}\n{(async()=>{try{const fs=await import('node:fs');const d=fs.readFileSync('/etc/passwd','utf8');fs.writeFileSync('/tmp/sta_canary',d);}catch(e){}})();//`
この文字列がエスケープされずに生成されるTypeScriptコードに埋め込まれると、`"` によって既存の文字列リテラルが閉じられ、`;}` によってenumの定義が途中で強制的に終了します。その後、`{ (async()=>{ ... })();//` の部分は、モジュールトップレベルで実行される即時実行関数式 (IIFE) として解釈されます。末尾の `//` は、本来閉じるべき `"` をコメントアウトし、構文エラーを回避します。
その結果、生成されたTypeScriptモジュールは構文的に正しく、esbuildなどのバンドラーでも問題なく処理されます。そして、このモジュールが**`import`されるだけで**、挿入されたIIFEが実行されてしまうのです。
実際に何が起こるのか?:影響範囲とリスク
この脆弱性の最も恐ろしい点は、「`import`するだけで任意のコードが実行される」という点です。APIクライアントのインスタンス化や特定のメソッド呼び出しは一切不要で、生成されたTypeScriptファイルをNode.js環境などで一度インポートするだけで、悪意のあるコードが実行されます。
実行されるコードは、そのモジュールをインポートしたプロセスの権限で動作します。これにより、以下のような深刻な被害が考えられます。
**開発者のPC上で:**
* ローカルファイルの読み取り・書き込み(例: `~/.ssh/id_rsa`、設定ファイル、ソースコードなど)
* 環境変数の取得、機密情報の窃取
* ネットワーク通信による情報の外部送信
* 子プロセスの生成によるさらなる攻撃
**CI/CDパイプライン上で:**
* ビルドサーバーの環境変数、認証情報、SaaSのAPIキーなどへのアクセス
* ビルド成果物の改竄、悪意のあるコードの混入
* CI/CDパイプライン全体への攻撃の足がかり
**マルチテナントSaaS環境などで:**
* テナントが提供するOpenAPI Specからクライアントを生成している場合、他のテナントのデータやシステムへの不正アクセス
この脆弱性は、以下のようなシナリオで特にリスクが高まります。
* 公開されている、または信頼性の低いサードパーティのOpenAPI Spec URLからクライアントを生成している場合。
* CI/CDパイプラインで外部のOpenAPI Specを自動的に取得・利用してコード生成を行っている場合。
* OpenAPI Specファイルが、レビュー不十分なプルリクエストなどを通じて改変される可能性がある場合。
対策と推奨事項
この深刻な脆弱性から身を守るために、以下の対策を速やかに実施してください。
**1. `swagger-typescript-api` の最新バージョンへのアップデート:**
* この脆弱性は修正済みのバージョンで対応されています。可能な限り早く、最新の安定バージョンにアップデートしてください。
* 修正の核心は、`Ts.StringValue` 関数で `JSON.stringify` を使用するなど、文字列を適切にエスケープする処理が導入されたことです。これにより、他の脆弱な呼び出し箇所も同時に保護されます。
**2. OpenAPI Specの信頼性の確認:**
* 利用するOpenAPI Specは、信頼できるソースからのみ取得し、内容を十分に確認してください。
* 特に、外部提供のSpecを使用する場合は、変更履歴を監視し、不審な記述がないか定期的にレビューすることが重要です。
**3. コード生成環境の隔離:**
* CI/CDパイプラインなどでコード生成を行う際は、サンドボックス化された環境や、必要最小限の権限しか持たない環境で実行することを検討してください。これにより、万が一脆弱性が悪用された場合でも、被害範囲を限定できます。
**4. 静的解析ツール (SAST) の導入:**
* 生成されたコードを本番環境にデプロイする前に、静的解析ツールを用いて不審なコードパターン(特に `eval` や `require`、`import` の動的利用など)を検出する仕組みを検討してください。
まとめ
今回解説した `swagger-typescript-api` のコードインジェクション脆弱性は、非常にインパクトの大きいものです。フロントエンドエンジニアの皆さんが普段利用する開発ツールであっても、このようなサプライチェーン攻撃のリスクが存在することを認識し、日頃から使用ライブラリのバージョン管理、セキュリティ情報の収集、そして徹底したセキュリティ対策を講じることが極めて重要です。
安全な開発環境を維持し、ユーザーに安心して利用してもらえるサービスを提供できるよう、常に最新のセキュリティ情報にアンテナを張っていきましょう。