NVIDIA закрыла пять уязвимостей в NeMo Speech, наборе инструментов для работы с речевыми данными и обучения моделей распознавания речи. Проблема затрагивает все платформы и версии с 0.0 по 2.9, исправление вошло в версию 3.0. Каждая из пяти уязвимостей ведёт к выполнению произвольного кода, а вместе с ним открывается путь к подмене данных, раскрытию информации и отказам в обслуживании. Бюллетень опубликован во второй половине сентября 2026 года, все пять проблем отнесли к высокому уровню опасности. В группе риска прежде всего команды, которые собирают речевые наборы из внешних источников или запускают обучение на чужих конфигурациях.
Детали уязвимостей
Причина четырёх уязвимостей одна - небезопасная десериализация, в каталоге CWE она описана как CWE-502. Так называют случай, когда библиотека превращает внешние данные в объекты программы, не проверяя, кто их подготовил. Самая заметная брешь, CVE-2026-65179, сидит в классе TabularTokenizer: он читает файл .pkl через pickle.load() и не проверяет содержимое. Формат pickle (способ сериализации объектов языка Python) умеет восстанавливать не только данные, но и вызовы функций. Подделанный файл при загрузке исполняет код на машине жертвы, искажает табличные данные и роняет процессы. Атака идёт по сети, однако требует, чтобы пользователь открыл вредоносный файл.
Остальные четыре уязвимости рассчитаны на локальный доступ. В компоненте speech data explorer, инструменте просмотра и разметки речевых записей, вредоносные данные приводят к выполнению кода и повышению привилегий. Похожая проблема есть в самом механизме обработки речевых данных: подделанный файл исполняет код, читает информацию и меняет содержимое наборов. Ещё одна уязвимость - внедрение команд (CWE-77) при разборе входных данных. Здесь участие пользователя не требуется, но нужны права локального пользователя. Пятая кроется в загрузке наборов данных: подделанный файл конфигурации model_config.yaml протаскивает небезопасные параметры и тоже ведёт к выполнению кода.
Круг пользователей NeMo Speech шире, чем принято думать. Набор применяют в контакт-центрах для расшифровки звонков, в медицинских сервисах для диктовки, в голосовых ассистентах и в научных проектах по обработке речи. Часть таких систем живёт в закрытых сетях, и именно поэтому локальные уязвимости с низкими требованиями к правам выглядят опаснее, чем кажется на первый взгляд. Внешний доступ злоумышленнику не нужен: достаточно занести один файл на носителе или подложить его в общий каталог.
Конвейеры машинного обучения почти всегда работают с чужими артефактами: наборами данных, разметкой, сохранёнными весами моделей, чужими конфигурациями. Один отравленный файл в общем хранилище или на странице загрузки открывает доступ к среде обучения, где лежат учётные данные, ключи и результаты экспериментов. Атака на цепочку поставок моделей давно перестала быть теоретической: исследователи регулярно показывают, как подмена весов или данных меняет поведение готовой модели. Публичных сообщений об эксплуатации этих уязвимостей в реальных атаках нет. О находках рассказали независимые исследователи, среди них Руслан Семченко и Hwang JUNHA.
Последствия для бизнеса выходят за пределы одной машины. Речевые данные часто содержат записи разговоров клиентов, а голос относится к биометрии, поэтому раскрытие информации здесь упирается в требования законов о персональных данных. Захват узла обучения позволяет внедрить в модель скрытые триггеры либо незаметно исказить выдачу. Отказ в обслуживании останавливает весь конвейер обработки звонков, а не отдельную задачу. Медицинские сервисы и банковские контакт-центры пострадают сильнее прочих, поскольку потеря расшифровки разговоров означает потерю доказательной базы и рост числа жалоб.
Защититься от небезопасной десериализации сложнее, чем от переполнения буфера или внедрения SQL-кода. Проблема не в конкретной строке кода, а в самом формате: pickle не разделяет данные и исполняемые инструкции, поэтому проверка на входе почти всегда запаздывает. Ограничение списка разрешённых типов помогает, но требует правок в каждом месте загрузки. NVIDIA пошла по пути обновления: версия 3.0 меняет обработку файлов целиком, а не предлагает настройку, которую можно включить отдельно от основного кода.
Обновить пакет можно через менеджер пакетов или заново клонировать репозиторий NVIDIA-NeMo/Speech на GitHub. Обходных путей бюллетень не предлагает, поэтому откладывать установку смысла нет: уязвимости закрыты только в новой версии. Тем, кто не может обновиться сразу, разумно изолировать обработку сторонних данных. Запускать её стоит в отдельной среде без сетевого доступа и без прав на рабочие ресурсы. Проверять происхождение файлов .pkl и model_config.yaml полезно и после обновления, поскольку наборы данных и веса моделей приходят из тех же источников, что и раньше.
Небезопасная десериализация держится в инструментах машинного обучения годами. Формат pickle удобен для передачи объектов между этапами конвейера, и эта же удобность превращает любой внешний файл в потенциальный исполняемый код. Пока наборы данных и модели ходят между командами без проверки источника, похожие уязвимости будут появляться снова. Обновление до версии 3.0 закрывает конкретные дыры, но привычка доверять чужому файлу остаётся главным риском для тех, кто обучает модели на чужих данных.
Ссылки