Уязвимость в YAML для Perl до 1.27_001 позволяет выполнить произвольный код (CVE-2019-25777)
В библиотеке YAML для Perl (версии до 1.27_001) обнаружена уязвимость, позволяющая через специально сформированный документ perl/glob перезаписывать произвольные переменные пакета, включая @INC и внутренние опции загрузчика. Это открывает путь к выполнению произвольного Perl-кода. Проблема затрагивает приложения, обрабатывающие недоверенный YAML.
Подробности
Уязвимость затрагивает модуль YAML для Perl во всех версиях до 1.27_001. Её суть — в неограниченной возможности узла perl/glob задавать имя пакета и символа, а также присваиваемое значение. Поскольку имя никак не ограничивается, атакующий может через YAML-документ перезаписать любую переменную пакета, включая @INC или собственные опции загрузчика YAML. Особую опасность представляет сценарий с двумя отдельными вызовами Load() в рамках одного процесса. Первый документ типа perl/glob может установить переменные $YAML::LoadCode или $YAML::UseCode, которые по умолчанию выключены. Это активирует загрузку кода для всех последующих вызовов Load() в данном процессе. Затем второй документ типа perl/code передаётся в string eval — и приводит к выполнению произвольного Perl-кода. Таким образом, атакующему достаточно иметь возможность дважды передать данные на вход приложению, использующему уязвимую версию библиотеки. Тип уязвимости — CWE-94 (Improper Control of Generation of Code, внедрение кода). Значение CVSS в официальной записи не указано, однако характер проблемы подразумевает высокий уровень риска: успешная эксплуатация ведёт к полной компрометации процесса, в котором выполняется разбор YAML.Что делать
Основная рекомендация — обновить модуль YAML для Perl до версии 1.27_001 или более поздней. В этой версии проблема устранена. Если обновление невозможно в короткие сроки, следует рассмотреть следующие меры:- Исключить обработку YAML из недоверенных источников — как файлов, так и сетевых запросов.
- По возможности использовать безопасные альтернативы и режимы разбора, не допускающие создания объектов и выполнения кода (например, YAML::Tiny или YAML::XS с ограниченными настройками, если они применимы в вашем окружении).
- Проверить, не передаются ли в приложение несколько YAML-документов последовательно в рамках одного процесса, и изолировать такие вызовы.
- Ограничить права процесса, выполняющего разбор YAML, чтобы снизить последствия возможной эксплуатации.
Источник: CVE Project (cvelistV5)
