`datamodel-code- generator` resolve alvos JSON- Schema `$ref` que apontam para o sistema de arquivos local sem restringir- os ao diretório de entrada/ base e sem honrar o controle de segurança de referência remota. Na configuração padrão, um atacante que controle um esquema de entrada (um serviço "colar seu OpenAPI/JSON-Schema", uma tarefa CI que gera modelos a partir de uma especificação enviada, ou qualquer plataforma de código de vários locantes) pode ler qualquer arquivo que o usuário do processo possa ler e mapear o sistema de arquivos host. Isto funciona através de um `file://` URI absoluto ou uma referência relativa '../`- escapou, e ele tem sucesso mesmo quando `-- no- allow- remote-refs` está definido. Este é um problema de localização/ divulgação de informações não autenticado (CWE- 22 / CWE- 200 ) mais um bypass de um controle de segurança documentado. `is_url()` classifica `file://` como um URL (`reference.py: 1249 `). ```python def is_url(ref: str) -> bool: devolve ref.startswith((" " "file://")) ``` O portão de remote-ref isenta explicitamente `file://`, então `-- no- allow-remote-refs` nunca se aplica a ele (`parser/jsonschema.py`, `_get_ref_body`):.

````python if is_url(resolved_ref): se não resoluted_ref.startswith("file://") e self.http_local_ref_path é Nenhum: se self.allow_refs é Falso: surge Erro(...) # <-- sauted for file://... self._get_ref_body_from_url(resolved_ref) self._get_ref_body_from_ref) ``` Ambos os ramos do arquivo local leram o alvo com ** sem verificação de contenção**. O ramo `file://` lê qualquer caminho absoluto: ````python # _get_ref_body_from_url se ref.startswith("file://"): caminho = url 2 pathname(urlparse(ref.path) # caminho absoluto, em qualquer lugar no disco retorna self.remote_object_cache.get_or_put( ref, default_factory=lambda _: load_data_from_path(Path(path), self.encoding)) ``` e o ramo relativo simples permite que `../` escape da pasta base. ```python # _get_ref_body_from_remote full_path = self.base_path / resoluted_ref # no is_relative_to(base_path) cheque self.remote_object_cache.get_or_put( str(full_path), default_factory=lambda _: load_data_from_path(full_path, self.encoding)) ```.

Para contraste, o ramo HTTP-local-ref (`_get_ref_body_from_local_http_path`) *does* força `is_relative_to(base_path)`; estes dois ramos do sistema de arquivos não. (Isto é distinto do HTTP `$ref`/`-url` SSRF anteriormente relatado emdurecido em `http.py` estes caminhos de código nunca digitem `http.py`.) O arquivo recuperado é lido e analisado, produzindo dois impactos. 1. **Arbitrar arquivo lido + oráculo do sistema de arquivos (qualquer arquivo).** O processo abre qualquer caminho legível, e os três resultados distinguíveis estrutura do sistema de arquivos vazantes: `Dict esperado, obteve str/list` = o arquivo existe e foi lido no processo; `FileNotFoundError: ' '' = faltando; `PermissionError: ' '' = existe, mas não pode ser leído. Um atacante usa isso para sondar caminhos arbitrários e recuperar a disposição absoluta do sistema de arquivos do operador. 2 **Disclosão secreta de verbatim no código gerado.** Quando o nó referenciado é em forma de Schema JSON, valores em posições de `const`/`default`/`enum`/`descrição` são emitidos literalmente no Python gerado que é devolvido ao atacante — ou seja, exatamente o esquema interno/privado e arquivos de configuração de um servidor de código (pequenas com tokens de exemplo/default, credenciais padrão, nomes de hospedagem internos, conta de serviço JSON, k 8 s manifestos secretos). Nota de escopo (para evitar sobreestaturar): os * bytes* brutos de arquivos não estruturados, como `/etc/passwd` ou um PEM `id_rsa`, são lidos no processo, mas não são ecoados literalmente na saída, porque analisam para um único escalar e são rejeitados como "não um esquema". Para esses arquivos, o impacto é a leitura em si mesmo, além do oráculo de existência/ permissão/caminho absoluto; a divulgação de conteúdo literal aplica- se aos nós em forma de esquema.

Reprodutor autónomo: 1 xintomia/ 2 a 87 e 81 f 985883 acesso 30 d 0118 c 52 da 4 d 3 / (`poc.py` cria tudo em um dir temporal, executa o gerador, afirma leitura + vazamento + bypass do portão, e limpa). Reprodução manual mínima da leitura arbitrária (qualquer caminho funciona): ````bash printf '{"tipo:"objeto","propriedades":{"x":{"$ref":"file:///etc/passwd"}}}' > sonde.json datamodèle-codegen --input sonde.json --input-file-type jsonschema --output o.py # -> "TypeError: esperada dict, obteve str" == /etc/passwd foi aberto e analisado completamente. # Troque o $ref para um caminho faltante/ não legível para ver o oráculo existência/ permissão. ``` Arquivo local arbitrário leitura / caminho transversal (CWE- 22 ) → divulgação de informações (CWE- 200 ), além de '-- no- allow- remote-refs'. Qualquer aplicativo, conduto CI ou serviço multi- locante que executa "datamodel- code- generator" em um esquema não confiável e expõe (retornes, logs, commits, renderizes) o código gerado é afetado. O atacante pode: abrir e ler qualquer arquivo que o usuário do processo possa ler (demonstrado: `/etc/passwd`, um PEM `id_rsa`, caminhos em baixo de `/ root/`); mapear o sistema de arquivos hospedeiro e recuperar caminhos absolutos; e exfiltrar valores secretos literalmente a partir de qualquer nó em forma de esquema. O atacante controla apenas o esquema de entrada; não é necessária nenhuma autenticação ou privilégios especiais. ### Remediação sugerida. 1. Não isenta `file://` do portão `allow_remote_refs`, trate- o como um esquema externo. 2. Em ambos os casos `_get_ref_body_from_url` (o 'file://`) e `_get_ref_body_from_remote`, rejeitar alvos que não sejam `resolvidos.is_relative_to(self.base_path)`, refletindo a verificação existente em `_get_ref_body_from_local_http_path`.

### Estado do mantenedor. Confirmado por revisão de mantenedor e testes de regressão. O RP de correção privada foi fundido e lançado em ` 0.62.0 `: 8359 - h 9 fx- j 6 v 9 / ull/ 1 Resumo: aplique o portão de remote- ref para `file://` refs e refs locais do esquema JSON fora do caminho de base de entrada. Em ` 0.62.0 `, `--- no- allow- remote-refs` bloqueia estas referências; o modo de compatibilidade padrão emite um `FutureWarning` e os usuários que intencionalmente confiam em refs locais externos confiáveis podem passar `-- allow- remote-refs`. Estado de lançamento: corrigido em ` 0.62.0 ` para o bypass documentado `-- no- allow- remote-refs`, com um aviso de compatibilidade para o comportamento padrão.

Validação: ` uv run --group test -- extra http pytest test/main/jsonschema/test_main_jsonschema.py` passou localmente; ` uv run --group corrige 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- 8359 - h 9 fx- j 6 v 9. Identificadores relacionados: CVE- 2026 - 55389. Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 28 T 21: 49: 34.000 Z e lista a sua última modificação como 2026 - 07 - 28 T 21: 49: 34.000 Z.

Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N. Software afetado e informações de versão: PyPI pacote de dados-modelo-code-generator — ECOSYSTEM: introduzido 0, corrigido 0.62.0. Classificação e evidência: identificadores de fraqueza CWE- 200, CWE- 22, CWE- 610. O registro contém 4 suporte de referências nestes tipos: WEB, PACKAGE.