
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.
Severidade: Alta, CVSS 4.0 8.5, CVSS 3.1 7.8 (atribuído 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
Afetado: uproot <= 5.7.4
Corrigido em: 5.7.5 / commit c045c28
CWE: CWE-94 (Controle Impróprio da Geração de Código, Injeção de Código); CWE-95 secundária (Injeção de Eval)
Descoberto e reportado por: Sai Teja Erukude
Publicado: 18 de julho de 2026
O uproot 5.7.4 e versões anteriores geram dinamicamente o código-fonte de classes Python a partir dos metadados TStreamerInfo do ROOT e o compilam em tempo de execução.
Alguns campos de metadados de streamer controlados pelo arquivo são interpolados no código-fonte Python gerado sem aspas seguras. Um atacante que consiga fornecer um arquivo ROOT especialmente construído pode injetar conteúdo que quebra expressões Python nos metadados do streamer, como um nome de elemento especialmente construído.
Quando uma aplicação afetada abre o arquivo ROOT especialmente construído e o uproot gera e invoca o método leitor 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 por meio dos caminhos de código afetados do uproot.
Dependendo da aplicação, isso pode permitir:
O problema está no caminho de geração de código-fonte do uproot para metadados de streamer do ROOT.
O PoC cria um arquivo ROOT contendo metadados TStreamerInfo especialmente construídos para uma classe ExploitTarget. O nome do elemento de streamer especialmente construído escapa da expressão gerada e injeta uma chamada benigna de pathlib.
O comportamento relatado é:
TStreamerInfo armazenados no arquivo.ExploitTarget.read_members gerado executa a expressão injetada.root_file_builder.py cria malicious_tstreamerinfo.root com metadados de streamer especialmente construídos.
run_poc.py abre o arquivo com o uproot, força a geração da classe ExploitTarget armazenada no arquivo, invoca o método read_members gerado e verifica a evidência do arquivo 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
O payload é intencionalmente inofensivo. Ele apenas escreve esta string de marcador local:
executed through uproot generated read_members
Ele não abre um shell, conecta-se a um serviço de rede, lê segredos, exclui dados ou modifica arquivos fora do diretório do PoC.
Atualize para o 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 enviada ao 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.
A divulgação foi coordenada pelo VulnCheck.