### Sumário `datamodel-code- generator` honra uma extensão custom 'x-python-type` JSON- Schema que permite que um autor do esquema sobrepasse o tipo Python gerado para um campo. O valor é encaminhado textual para a fonte Python gerada como anotação de campo, com um único passe de desinfectação que é trivial para contornar. Um atacante que controla um esquema JSON alimentado com o `datamodel- codegen` pode, portanto, incorporar uma instrução Python arbitrária no módulo gerado, que executa no momento da definição de classe no momento em que o desenvolvedor importa o arquivo. Não são necessários `-- dados extra- template ' e não são necessárias bandeiras especiais; o código vulnerável é alcançável com configurações padrão. ### Detalhes Lavatório: `src/datamodel_code_generator/parser/jsonschema.py`, `_get_python_type_override` (linhas 2055 – 2096, na etiqueta ` 0.60.1 ` / commit ` a 321547 e`: ```python def _get_python_type_override(self, obj: JsonSchemaObject) -> DataType. Nenhum: x_python_type = obj.extras.get("x-python-type") se não x_python_type ou não isistance(x_python_type, str): devolve nenhum schema_type = obj.type se isistance(obj.type, str) outra Nole se self._is_compatible_python_type(schema_type, x_python_type): devolve nenhum base_type = self._get_python_type_base(x_python_type) import_ = self._resolve_type_import(base_type) type_str = x_python_type prefixo = x_python_type = x_type_type_type_type.split([[split=split=split=split=self. 1 )[ 0 ] se "." no prefixo: # somente tipo_str = base_tipo + x_python_type[len(prefix):]...... resultado = self.data_type(type=type_str, import_=import_)... resultado de retorno ```.

`DataType.type` flui sem escapulação para `{{ campo.type_hint }}` em cada modelo (` model/ template/pydantic_v 2 / BaseModel.jinja 2 `, ` modelo/ template/ dataclass.jinja 2 `, ` modelo/ template/ tipo de classe de dict.jinja 2 `, ` modelo/ template/ msgspec.jinja 2 `, …). O único sanitário — o ponto- reescrever na linha marcada — dispara somente quando `. ' está na substância ** antes do primeiro `[`** no valor. Colocando `[` cedo (por exemplo, `X[ 1 ]; `) mantém `prefixo == "X"` para que a reescrita seja ignorada e o valor inteiro se aterra na anotação gerada. ` from __future__ import anotations` (emitido por padrão) torna o `X[ 1 ]` porção uma string preguiçosa, assim `X` não precisa se resolver no tempo de execução. Tudo depois de `;` é analisado como uma declaração real no corpo da classe e é executado quando a classe é construída durante `importar`.

Os tipos de modelos de saída confirmadas vulneráveis no teste: `pydantic_v 2.BaseModel`, `dataclasses.dataclass`, `typing.TypedDict`. ` msgspec.Struct` emite código estruturalmente idêntico. ### PoC Um PoC auto-contido está disponível em: 1 xintomia/ 1 a 7 ff 2561 a 581074 c 49785230 b 2 c 5700.

### Execução arbitrária de código de impacto no corredor de interprete/ CI do desenvolvedor assim que o módulo gerado for importado. Alcançable a partir de qualquer fluxo de trabalho que ingere um esquema JSON não confiável: - Documentos OpenAPI / JSON-Schema coletados de serviços de terceiros ou registros públicos. - Esquemas fornecidos pelo cliente em B 2 Plataformas B que geram automaticamente SDKs de clientes a partir da entrada do usuário. - Arquivos de esquema adicionados por um commit malicioso em um repositório de poliglota que ativa a geração de código CI.

O compromisso é silencioso: o esquema é válido JSON, o gerador emite Python sintáticamente limpo (a instrução trojan é uma única linha indentada no corpo da classe), e somente o * uso* do arquivo gerado ativa a carga útil. Qualquer pessoa que executa o 'datamodel- codegen' contra um esquema fornecido pelo atacante é afetado. Os corredores de CI e as estações de trabalho de desenvolvedores são o raio de explosão primário.

A correção valida `x-python- type' antes de construir a anotação de tipo gerada. O valor é analisado com `ast.parse(..., mode="eval")` e aceito somente quando o AST tem forma de anotação tipo Python, incluindo nomes, atributos, subscritos, argumentos de anotação tuple/list, sindicatos `.` e valores literais seguros onde a sintaxe de anotação permite- os. As declarações, chamadas e outras expressões executáveis são rejeitadas antes da geração de código. O validador é armazenado em cache para evitar análises AST repetidas para valores repetidos. Atualizar para `generador de código- modelo de dados` ` 0.60.2 ` ou mais tarde.

Esta questão afeta versões `datamodel-code-generator` `>= 0.51.0, <= 0.60.1 ` e está corrigido em ` 0.60.2 `. Enviado por: Hamza Haroon (thegr 1 xintose). Registro de aconselhamento: GHSA- m 34 r-v 34 r-rf 9 q. Identificadores relacionados: CVE- 2026 - 54655.

Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 28 T 21: 33: 57.000 Z e lista a sua última modificação como 2026 - 07 - 28 T 21: 33: 57.000 Z. Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:L/AC:L/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.51.0, corrigido 0.60.2. Classificação e evidência: identificadores de fraqueza CWE- 94. O registro contém 4 suporte de referências nestes tipos: WEB, PACKAGE.