
uproot <= 5.7.4: внедрение кода через небезопасную генерацию исходного кода Python из метаданных ROOT TStreamerInfo.
Уровень серьёзности: высокий, CVSS 4.0 8.5, CVSS 3.1 7.8 (присвоено VulnCheck, CNA)
Вектор (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
Вектор (v3.1): CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Затронуто: uproot <= 5.7.4
Исправлено в: 5.7.5 / коммит c045c28
CWE: CWE-94 (некорректный контроль генерации кода, внедрение кода); вторичный CWE-95 (внедрение через eval)
Обнаружено и описано: Sai Teja Erukude
Опубликовано: 18 июля 2026 г.
uproot 5.7.4 и более ранние версии динамически генерируют исходный код классов Python из метаданных ROOT TStreamerInfo и компилируют его во время выполнения.
Некоторые поля метаданных streamer, контролируемые файлом, подставляются в генерируемый исходный код Python без безопасного экранирования. Злоумышленник, способный предоставить специально сформированный ROOT-файл, может внедрить в метаданные streamer содержимое, нарушающее синтаксис Python-выражения, например специально сформированное имя элемента.
Когда уязвимое приложение открывает специально сформированный ROOT-файл, а uproot генерирует и вызывает соответствующий метод чтения, внедрённое Python-выражение может выполниться в контексте принимающего процесса.
Злоумышленник может выполнить произвольный код Python в приложениях, которые открывают или обрабатывают контролируемые злоумышленником ROOT-файлы через уязвимые пути кода uproot.
В зависимости от приложения это может позволить:
Проблема находится в пути генерации исходного кода uproot для метаданных streamer ROOT.
PoC создаёт ROOT-файл, содержащий специально сформированные метаданные TStreamerInfo для класса ExploitTarget. Специально сформированное имя элемента streamer выходит за пределы генерируемого выражения и внедряет безвредный вызов pathlib.
Сообщаемое поведение:
TStreamerInfo, хранящиеся в файле.ExploitTarget.read_members выполняет внедрённое выражение.root_file_builder.py создаёт malicious_tstreamerinfo.root со специально сформированными метаданными streamer.
run_poc.py открывает файл с помощью uproot, принудительно инициирует генерацию класса ExploitTarget, хранящегося в файле, вызывает сгенерированный метод read_members и проверяет наличие файла-маркера.
Запускайте только в локальной тестовой среде:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
Ожидаемые признаки на уязвимых версиях:
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
Полезная нагрузка намеренно безвредна. Она лишь записывает эту локальную маркерную строку:
executed through uproot generated read_members
Он не запускает оболочку, не подключается к сетевому сервису, не читает секреты, не удаляет данные и не изменяет файлы за пределами каталога PoC.
Обновитесь до uproot 5.7.5 или более поздней версии.
Если немедленное обновление невозможно:
TStreamerInfo перед обработкой.| Дата | Событие |
|---|---|
| 20 мая 2026 г. | Уязвимость отправлена в VulnCheck |
| 20 мая 2026 г. | VulnCheck инициировал взаимодействие; предварительно назначен CVE-2026-9147 |
| 5 июля 2026 г. | Выпущен uproot 5.7.5 с исправлением |
| 18 июля 2026 г. | Опубликован CVE-2026-9147 |
Обнаружено и сообщено Sai Teja Erukude.
Раскрытие координировалось через VulnCheck.