
Injection de code dans uproot <= 5.7.4 via une génération non sécurisée de code source Python à partir des métadonnées TStreamerInfo de ROOT.
Gravité : Élevée, CVSS 4.0 8.5, CVSS 3.1 7.8 (attribuée par VulnCheck, le CNA)
Vecteur (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
Vecteur (v3.1) : CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Affecté : uproot <= 5.7.4
Corrigé dans : 5.7.5 / commit c045c28
CWE : CWE-94 (Contrôle inapproprié de la génération de code, injection de code) ; CWE-95 secondaire (injection par eval)
Découvert et signalé par : Sai Teja Erukude
Publié : 18 juillet 2026
uproot 5.7.4 et les versions antérieures génèrent dynamiquement le code source de classes Python à partir des métadonnées ROOT TStreamerInfo et le compilent à l'exécution.
Certains champs de métadonnées de streamer contrôlés par le fichier sont interpolés dans le code source Python généré sans échappement sûr. Un attaquant capable de fournir un fichier ROOT forgé peut injecter du contenu cassant les expressions Python dans les métadonnées de streamer, par exemple via un nom d'élément forgé.
Lorsqu'une application affectée ouvre le fichier ROOT forgé et qu'uproot génère puis invoque la méthode de lecture correspondante, l'expression Python injectée peut s'exécuter dans le contexte du processus hôte.
Un attaquant peut exécuter du code Python arbitraire dans les applications qui ouvrent ou traitent des fichiers ROOT contrôlés par l'attaquant via les chemins de code uproot affectés.
Selon l'application, cela peut permettre :
Le problème se situe dans le chemin de génération de code source d'uproot pour les métadonnées de streamer ROOT.
Le PoC crée un fichier ROOT contenant des métadonnées TStreamerInfo forgées pour une classe ExploitTarget. Le nom d'élément de streamer forgé sort de l'expression générée et injecte un appel pathlib bénin.
Le comportement signalé est le suivant :
TStreamerInfo issues du fichier.ExploitTarget.read_members générée exécute l'expression injectée.root_file_builder.py crée malicious_tstreamerinfo.root avec des métadonnées de streamer forgées.
run_poc.py ouvre le fichier avec uproot, force la génération de la classe ExploitTarget issue du fichier, invoque la méthode read_members générée et vérifie la présence du fichier marqueur.
À exécuter uniquement dans un environnement de test local :
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
Preuves attendues sur les versions vulnérables :
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
La charge utile est intentionnellement inoffensive. Elle écrit uniquement cette chaîne de marqueur locale :
executed through uproot generated read_members
Il ne lance pas de shell, ne se connecte pas à un service réseau, ne lit pas de secrets, ne supprime pas de données et ne modifie pas de fichiers en dehors du répertoire PoC.
Mettez à niveau vers uproot 5.7.5 ou une version ultérieure.
Si une mise à niveau immédiate n'est pas possible :
TStreamerInfo inattendues avant le traitement.| Date | Événement |
|---|---|
| 20 mai 2026 | Vulnérabilité soumise à VulnCheck |
| 20 mai 2026 | VulnCheck a initié la prise de contact ; CVE-2026-9147 attribué provisoirement |
| 5 juillet 2026 | uproot 5.7.5 publié avec le correctif |
| 18 juillet 2026 | CVE-2026-9147 publié |
Découverte et signalée par Sai Teja Erukude.
La divulgation a été coordonnée via VulnCheck.