
uproot <= 5.7.4 injeção de código via geração insegura de código-fonte Python a partir dos metadados TStreamerInfo do ROOT.
Gravidade: Alta, CVSS 4.0 8.5, CVSS 3.1 7.8 (atribuída pela VulnCheck, a CNA)
Vetor (v4.0): CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Vetor (v3.1): CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Afetados: uproot <= 5.7.4
Corrigido em: 5.7.5 / commit c045c28
CWE: CWE-94 (Controle inadequado da geração de código, injeção de código); CWE-95 secundária (injeção de eval)
Reportado por: Sai Teja Erukude
CNA: VulnCheck
Publicado: 18 de julho de 2026
O uproot 5.7.4 e versões anteriores geram dinamicamente código-fonte de classes Python a partir dos metadados do ROOT e o compilam em tempo de execução.
TStreamerInfoAlguns campos de metadados do streamer controlados por arquivo são interpolados no código-fonte Python gerado sem aspas ou escape seguros. Um atacante que possa fornecer um arquivo ROOT malicioso pode injetar conteúdo que quebra expressões Python nos metadados do streamer, como um nome de elemento malicioso.
Quando um aplicativo afetado abre o arquivo ROOT malicioso e o uproot gera e invoca o método de leitura correspondente, a expressão Python injetada pode ser executada no contexto do processo hospedeiro.
Um atacante pode executar código Python arbitrário em aplicações que abrem ou processam arquivos ROOT controlados pelo atacante usando as rotas de código afetadas do uproot.
Dependendo da aplicação, isso pode permitir:
O problema está no caminho de código-fonte gerado do uproot para metadados de streamer do ROOT.
O PoC cria um arquivo ROOT contendo metadados TStreamerInfo maliciosos para uma classe ExploitTarget. O nome do elemento do streamer malicioso rompe a expressão gerada e injeta uma chamada benigna a pathlib.
O comportamento relatado é:
TStreamerInfo baseados em arquivo.ExploitTarget.read_members gerado executa a expressão injetada.root_file_builder.py cria malicious_tstreamerinfo.root com metadados de streamer maliciosos.
run_poc.py abre o arquivo com o uproot, força a geração da classe ExploitTarget baseada em arquivo, invoca o método read_members gerado e verifica a evidência do arquivo de marcador.
Execute apenas em um ambiente de teste local:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
Evidência esperada em versões vulneráveis:
uproot_version: 5.7.4
file_backed_element_name_contains_payload: True
class_code_contains_injected_pathlib_call: True
expected_exception: True
exception_type: DeserializationError
marker_exists: True
marker_contents:
executed through uproot generated read_members
success: True
A carga útil é intencionalmente inofensiva. Ela apenas grava esta string de marcador local:
executed through uproot generated read_members
Ela não abre um shell, não se conecta a um serviço de rede, não lê segredos, não exclui dados nem modifica arquivos fora do diretório do PoC.
Atualize para uproot 5.7.5 ou posterior.
Se a atualização imediata não for possível:
TStreamerInfo inesperados antes do processamento.| Data | Evento |
|---|---|
| 20 de maio de 2026 | Vulnerabilidade submetida à VulnCheck |
| 20 de maio de 2026 | VulnCheck iniciou o contato; CVE-2026-9147 alocado provisoriamente |
| 5 de julho de 2026 | uproot 5.7.5 lançado com a correção |
| 18 de julho de 2026 | CVE-2026-9147 publicado |
Descoberto e reportado por Sai Teja Erukude, coordenado por meio da VulnCheck.