
SpeechBrain < 1.1.1 — удалённое выполнение кода через метаданные контрольных точек из-за небезопасного разбора CKPT.yaml в PyYAML.
Уровень опасности: Высокий, CVSS 4.0 8.7, CVSS 3.1 8.8 (присвоен VulnCheck, CNA)
Вектор (v4.0): CVSS:4.0/AV:N/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:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Затронуто: SpeechBrain < 1.1.1
Исправлено в: 1.1.1 / коммит 22a6166
CWE: CWE-502 (Десериализация недоверенных данных)
Обнаружено и сообщено: Sai Teja Erukude
Опубликовано: 27 августа 2026 г.
SpeechBrain до версии 1.1.1 использует небезопасный загрузчик PyYAML при парсинге
метаданных контрольной точки CKPT.yaml во время восстановления контрольной точки.
Злоумышленник, имеющий возможность предоставить или изменить каталог контрольной точки
SpeechBrain, может разместить вредоносный файл CKPT.yaml внутри каталога контрольной
точки CKPT*. Когда жертва вызывает Checkpointer.recover_if_possible(), SpeechBrain
перечисляет кандидаты контрольных точек и парсит файл метаданных каждого кандидата с помощью:
yaml.load(fi, Loader=yaml.Loader)
Поскольку yaml.Loader поддерживает теги конструирования объектов Python, такие как
!!python/object/apply, контролируемые злоумышленником метаданные контрольной точки могут выполнять
код Python во время обнаружения контрольных точек.
Вредоносная контрольная точка не обязательно должна быть выбрана или восстановлена. Выполнение кода происходит, пока SpeechBrain перечисляет кандидатов контрольных точек.
Злоумышленник может выполнить произвольный код Python в контексте процесса Python, запускающего SpeechBrain.
Это может затронуть рабочие процессы, в которых пользователи скачивают, распаковывают, возобновляют или запускают обучение/инференс из недоверенных каталогов контрольных точек, артефактов моделей или архивов.
В зависимости от хост-процесса это может позволить:
Затронутый компонент — это поток восстановления/перечисления контрольных точек SpeechBrain:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
При перечислении контрольных точек SpeechBrain сканирует дочерние каталоги с именами CKPT*, которые содержат CKPT.yaml. Каждый файл метаданных-кандидат анализируется перед окончательным выбором контрольной точки.
Небезопасный разбор происходит в speechbrain.utils.checkpoints.checkpoints.py:
meta = yaml.load(fi, Loader=yaml.Loader)
PoC создаёт две контрольные точки:
CKPT+poisoned-metadata: более старая вредоносная контрольная точка, чей CKPT.yaml
содержит payload применения объекта PyYAML.CKPT+benign-newer: более новая безопасная контрольная точка, которая должна быть выбрана по
давности.Выбирается безопасная контрольная точка, но метаданные вредоносной контрольной точки всё ещё выполняются во время перечисления кандидатов. Это демонстрирует выполнение кода во время разбора метаданных, независимо от восстановления контрольной точки.
package_builder.py создаёт контролируемую злоумышленником
структуру контрольной точки.
run_poc.py запускает валидацию, вызывает
Checkpointer.recover_if_possible() и выводит доказательства выполнения.
Запускать только в локальной тестовой среде:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
Ожидаемые доказательства на уязвимых версиях:
speechbrain_version: 1.1.0
installed_package: True
recovery_error: None
benign_checkpoint_selected: True
marker_before_recovery: False
marker_after_recovery: True
marker_contents:
speechbrain_checkpoint_yaml_loader_rce_triggered
success: True
Важное доказательство состоит в том, что benign_checkpoint_selected: True и
marker_after_recovery: True появляются вместе. Это показывает, что вредоносный
более старый checkpoint не был выбран для восстановления, но его метаданные всё равно были разобраны
и выполнены, пока SpeechBrain перечислял кандидатов в checkpoint.
Полезная нагрузка намеренно безвредна. Она лишь записывает эту локальную строку-маркер:
speechbrain_checkpoint_yaml_loader_rce_triggered
Он не запускает оболочку, не подключается к сетевому сервису, не читает секреты, не удаляет данные и не изменяет файлы за пределами каталога PoC.
Обновитесь до SpeechBrain 1.1.1 или более поздней версии.
Надёжное исправление кода — использовать безопасный загрузчик PyYAML для метаданных контрольной точки:
yaml.safe_load(fi)
или:
yaml.load(fi, Loader=yaml.SafeLoader)
Метаданным контрольной точки нужны только скалярные значения, такие как unixtime и
end-of-epoch, поэтому создание объектов Python не должно быть включено для этого
пути разбора.
Если немедленный патч или обновление недоступны:
CKPT.yaml.Обнаружено и сообщено Sai Teja Erukude.
Раскрытие координировалось через VulnCheck.
exploit_walkthrough.md