本文へ移動
English version →
重大 9.3 急ぎ度: 早めに

fastapi-code-generatorの脆弱性3件、修正版あり

fastapi-code-generatorの0.8.1より前に、OpenAPIファイルの文字列からPythonコードを注入される脆弱性が3件見つかり、CVSS v4はいずれも9.3です。外部由来の定義を扱う環境は、0.8.1へ更新し、生成済みコードも作り直してください。

CVE-2026-63470 公開 更新 執筆・監修: 佐々木 航 人が監修しながらAIを活用して執筆

同じ発表の脆弱性 3 件

画像は生成 AI で作成したイメージです

急ぎ度: 早めに

3件ともCVSS v4が9.3の深刻度で修正版0.8.1が出ており、OpenAPIファイルに外部由来の文字列が入る環境は、早めの更新が妥当です。

関係があるか

OpenAPIファイルからfastapi-code-generatorでFastAPIのコードを生成している開発チームやCI環境が対象です。定義ファイルに社外や他チームが書いた内容、自動生成された内容が混ざる場合は、とくに当てはまります。

製品影響を受ける版修正版
fastapi-code-generator 0.8.1より前のすべての版 0.8.1

確かめ方

  1. 1開発環境とCIの両方で、導入されている版を確認します。pip show fastapi-code-generator でVersionの行を見て、0.8.1未満なら対象です。
  2. 2requirements.txtやpyproject.toml、ロックファイルで、版が固定されていないか、0.8.1より前に固定されていないかを確認します。
  3. 3コード生成に使うOpenAPIファイルの出どころを洗い出します。外部から取り込む定義や、他のツールが自動生成する定義があれば、悪用の入口になりえます。

何が起きたか

fastapi-code-generatorは、OpenAPIファイルからFastAPIアプリのPythonコードを生成するツールです。0.8.1より前の版では、定義ファイルの文字列を生成コードに埋め込むとき、引用符を無害化していません。そのため、細工された文字列が通常のデータの範囲を越えて、生成コードの一部として実行される脆弱性が3件あります。埋め込み先は、パス、summary、追加の応答キーの3か所で、それぞれ別の箇所の問題として登録されています。

  • CVE-2026-63470: operationのsummaryが生成コードのdocstringに入る箇所で、細工された文字列があると、対象の経路が呼び出された時点で任意のPythonコードが実行されます(CVSS v4は9.3)
  • CVE-2026-63469: 複数の応答を持つoperationで、主たる応答以外の応答キーが細工されていると、生成されたモジュールをimportした時点で任意のPythonコードが実行されます(CVSS v4は9.3)
  • CVE-2026-63471: OpenAPIのパスが生成コードの経路定義に入る箇所で、細工された文字列があると、生成されたモジュールをimportした時点で任意のPythonコードが実行されます(CVSS v4は9.3)

3件とも0.8.1で修正されています。構文を壊す入力では生成自体が失敗するだけで、構文として成立するコードが生成されたときに限り、実行まで進みます。

攻撃の流れ

  1. 1

    定義に文字列混入

    OpenAPIファイルのパス、summary、応答キーのいずれかに、細工された文字列が入ります。

  2. 2

    コード生成

    生成ツールが文字列を無害化せずに、Pythonコードへそのまま埋め込みます。

  3. 3

    生成コードを実行

    モジュールのimport時、または経路の呼び出し時に、埋め込まれた式が評価されます。

  4. 4

    プロセス権限で動作

    アプリやCIのプロセスが持つ権限で、意図しない処理が走ります。

公開されている情報をもとにした流れの例です。

どう悪用されるか

CVSSの評価では、ネットワーク経由で、認証も利用者の操作も要らないとされています。ただし実際には、細工された文字列がコード生成に使うOpenAPIファイルの中に入っていることが前提です。自分たちだけで書いて、レビューしているファイルであれば入口は狭くなります。外部から取り込む定義や、他のツールが自動生成する定義を使っている場合は、前提を満たしやすくなります。

3件のあいだで、コードが実行されるタイミングと権限が違います。CVE-2026-63470は、生成された経路のハンドラが呼び出されたときに、サーバープロセスの権限で動きます。CVE-2026-63469とCVE-2026-63471は、生成されたモジュールがimportされた時点で動くため、アプリの起動時やテスト、CIの実行中にも起こりえます。CVE-2026-63469は、複数の応答を持つoperationで、主たる応答以外のキーが細工されている場合に限ります。

悪用が成立すると、任意のPythonコードがプロセスの権限で動き、機密性、完全性、可用性のすべてに高い影響が出ます。CIで起きれば、そこに置かれた認証情報やソースコードが影響範囲に入ります。

今すぐやること

  1. 1

    導入している版を確認する

    開発者のパソコン、ビルド用の環境、CIのイメージのそれぞれで、fastapi-code-generatorの版を調べます。複数の環境に入っていることが多いので、見落としに注意します。

    pip show fastapi-code-generator
  2. 2

    修正版に更新する

    fastapi-code-generatorを修正版に更新し、requirements.txtやロックファイルの固定版も書き換えます。更新の内容と詳細は、開発元のGitHubのセキュリティアドバイザリとリリースの告知で確認できます。

  3. 3

    生成済みコードを作り直して差分を見る

    ツールを更新しても、すでに生成されたファイルは直りません。修正版で再生成し、経路のデコレーター、docstring、responsesの辞書に、見慣れない式が混ざっていないかを差分で確認します。

  4. 4

    定義ファイルの出どころとCIの権限を見直す

    外部由来のOpenAPIファイルをそのままコード生成に渡していないかを確認します。渡している場合は、取り込み時の確認を入れます。CIの生成ジョブには、必要以上の認証情報を持たせないようにします。

すぐ更新できないとき

すぐに更新できない間は、信頼できない出どころのOpenAPIファイルでコードを生成しないでください。やむを得ない場合は、パス、summary、応答のキーに引用符などの不審な文字が含まれていないか、生成前に確認します。生成したコードの実行や、importを伴うテストは、認証情報を持たない隔離した環境で行うと、被害を抑えられます。

背景

fastapi-code-generatorは、OpenAPIで書いたAPI仕様から、FastAPIアプリのひな形になるPythonコードを自動で作るツールです。開発チームでは、仕様書を先に決めてコードを生成する流れや、CIで毎回生成する流れで使われます。仕様書の文字列がそのままソースコードになるため、ツールが出力時に引用符を無害化しているかどうかが、そのまま安全性に直結します。

今回の3件は、パス、summary、応答キーという別々の埋め込み先に、同じ種類の無害化漏れがあったものです。開発元は、実行されるタイミングが違うこの3つを別の問題として登録しています。import時に動くものは、アプリの起動やテストで、呼び出し時に動くものは、実際のリクエスト処理で、それぞれ発動します。

よくある質問

Q.OpenAPIファイルは自社だけで書いています。それでも更新は必要ですか。
A.細工された文字列が入る余地は小さいものの、他のチームのファイルや、別のツールが出力した定義を取り込んでいないかは、一度確認してください。入口が自社に閉じていると確認できれば、緊急性は下がります。それでも、修正版は出ているため、通常の更新の流れで0.8.1以降へ上げておくのが無難です。
Q.CIでコードを生成しているだけで、本番にはこのツールを入れていません。影響はありますか。
A.あります。import時に動く2件は、アプリの本番環境でなくても、生成したモジュールをCIで読み込んだ時点で動くためです。その場合の権限はCIのプロセスのものになり、CIに置かれた認証情報の扱いが論点になります。

この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。

原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。

fastapi-code-generator creates FastAPI applications from OpenAPI files. Prior to 0.8.1, the generator inserts Operation.summary into a generated route-handler docstring as a triple-double-quoted string without escaping embedded triple quotes. An attacker-controlled or attacker-influenced operation summary can close the docstring and inject a valid Python expression statement into the handler body. Syntax-breaking input only causes generation to fail, but syntactically valid generated code executes with the server process's privileges when the affected route handler is called. This call-time route-handler docstring sink is distinct from the project's separate import-time route-path and additional-response-key sinks. This issue is fixed in version 0.8.1.

出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory

参照URL

当サイトでは、アクセス解析と広告の効果測定のために Cookie を使います。株式会社Game のサイト共通の設定です。 詳しく