
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
CNA: VulnCheck
Опубликовано: 18 июля 2026 г.
uproot 5.7.4 и более ранние версии динамически генерируют исходный код классов Python из метаданных ROOT и компилируют его во время выполнения.
TStreamerInfoНекоторые поля метаданных стримера, управляемые файлом, подставляются в генерируемый исходный код Python без безопасного экранирования. Злоумышленник, способный предоставить специально созданный ROOT-файл, может внедрить в метаданные стримера содержимое, нарушающее выражения Python, например, специально сформированное имя элемента.
Когда затронутое приложение открывает специально созданный ROOT-файл, а uproot генерирует и вызывает соответствующий метод чтения, внедрённое выражение Python может выполниться в контексте процесса хоста.
Злоумышленник может выполнить произвольный код Python в приложениях, которые открывают или обрабатывают контролируемые злоумышленником ROOT-файлы с использованием затронутых путей кода uproot.
В зависимости от приложения это может позволить:
Проблема находится в пути генерации исходного кода uproot для метаданных стримера ROOT.
PoC создаёт ROOT-файл, содержащий специально сформированные метаданные TStreamerInfo для класса ExploitTarget. Специально сформированное имя элемента стримера выходит за пределы генерируемого выражения и внедряет безвредный вызов pathlib.
Наблюдаемое поведение:
TStreamerInfo, хранящиеся в файле.ExploitTarget.read_members выполняет внедрённое выражение.root_file_builder.py создаёт malicious_tstreamerinfo.root со специально сформированными метаданными стримера.
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.