
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
CNA: VulnCheck
Опубликовано: 27 августа 2026 г.
SpeechBrain до версии использует небезопасный загрузчик PyYAML при парсинге метаданных во время восстановления контрольных точек.
1.1.1CKPT.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
содержит полезную нагрузку PyYAML object-apply.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 появляются вместе. Это показывает, что вредоносная
более старая контрольная точка не была выбрана для восстановления, но её метаданные всё равно были распарсены
и выполнены, пока SpeechBrain перечислял кандидатов контрольных точек.
Полезная нагрузка намеренно безвредна. Она только записывает эту локальную строку-маркер:
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