CVE-2017-20285 в Ubuntu: десериализация YAML в Perl вызывает DESTROY произвольных классов — механика и порядок обновления

CVE: CVE-2017-20285
Продукт: Ubuntu
Дата публикации: 05.10.2026
Критичность: CRITICAL
CVSS: 9.1 (3.1)
EPSS: 0,18%; процентиль 7,25%
CISA KEV: нет подтверждения в каталоге CISA KEV

Краткое описание​


CVE-2017-20285 — уязвимость Perl-модуля YAML версий до 1.30: загруженный YAML-документ может инициировать вызов метода DESTROY произвольных классов.

В Ubuntu затронут пакет libyaml-perl в нескольких LTS-релизах, включая 16.04 LTS, 18.04 LTS, 20.04 LTS, 22.04 LTS, 24.04 LTS и 26.04 LTS.

Оценки различаются: Ubuntu присваивает проблеме уровень medium, тогда как CVSS 3.1 от NVD даёт 9.1 (CRITICAL). Ниже разобраны механика, условия эксплуатации и порядок обновления.

Основные характеристики​


Суть риска: приложение, загружающее недоверенный YAML-документ через уязвимую версию Perl-модуля YAML, позволяет самому документу влиять на поведение объектов Perl — вплоть до удаления каталогов на диске через деструкторы уже загруженных классов.

Ключевые параметры:

  • Тип ошибки: CWE-470 (использование внешнего ввода для выбора класса/поведения) и CWE-502 (небезопасная десериализация).
  • CVSS 3.1: 9.1, CRITICAL, вектор CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N — атака по сети, без привилегий и без участия пользователя.
  • Оценка Ubuntu: medium — вендор оценивает практический риск для дистрибутива ниже базовой метрики NVD.
  • EPSS: 0,18% (0.00184) — низкая расчётная вероятность эксплуатации в ближайшие 30 дней; процентиль 7,25%.
  • CISA KEV: в каталоге известных эксплуатируемых уязвимостей подтверждения нет.
  • Статус CVE: Deferred, опубликовано 2026-10-05.

Какие продукты и версии затронуты​


Затронут компонент — Perl-модуль YAML версий до 1.30. В Ubuntu уязвимость отслеживается для исходного пакета libyaml-perl (запись UBUNTU-CVE-2017-20285, опубликована 2026-10-05).

По данным Ubuntu OSV затронуты следующие релизы и версии пакета:

  • Ubuntu 16.04 LTS — libyaml-perl 1.15-1 (xenial);
  • Ubuntu 18.04 LTS — libyaml-perl 1.24-1 (bionic);
  • Ubuntu 20.04 LTS — libyaml-perl 1.30-1 (focal);
  • Ubuntu 22.04 LTS — libyaml-perl 1.30-1 (jammy);
  • Ubuntu 24.04 LTS — libyaml-perl 1.31-1 (noble);
  • Ubuntu 26.04 LTS — libyaml-perl 1.31-1 (resolute).

Для всех перечисленных релизов диапазон указан как «introduced: 0», то есть уязвимость считается присутствующей с начала истории пакета в дистрибутиве. Поле availability в записи не заполнено, поэтому сведения о доступности исправленных сборок для конкретных релизов из переданного пакета доказательств однозначно не следуют — точный состав исправленных версий проверяйте на странице Ubuntu Security.

Причина уязвимости​


Причина — в поведении загрузчика YAML при обработке тега perl/hash:Class. Такой тег указывает загрузчику создать хеш и «bless» его в класс, имя которого задано самим документом. Поля объекта также берутся из документа.

Дальше работает семантика Perl: когда объект выходит из области видимости, интерпретатор автоматически вызывает его деструктор DESTROY. Поскольку класс объекта выбрал атакующий, вызывается DESTROY произвольного класса, уже загруженного в процессе.

Что именно произойдёт, зависит от набора классов в памяти приложения. В описании CVE приведён пример: при наличии в процессе класса File::Temp::Dir из ядра Perl вызов его деструктора приводит к удалению дерева каталогов, путь к которому задан в документе. Это нарушение границы доверия — данными документа управляет исполнение кода классов, которое должно контролироваться только приложением.

Как работает атака​


Путь данных выглядит так: недоверенный YAML-документ поступает в приложение (например, из файла, сетевого ответа или конфигурации) и передаётся функции загрузки модуля YAML уязвимой версии.

При разборе документа тег perl/hash:Class заставляет загрузчик создать объект указанного класса с полями из документа. Атакующий выбирает класс и содержимое объекта, не исполняя произвольный код напрямую.

Когда объект покидает область видимости, Perl вызывает его метод DESTROY. Если выбранный класс имеет деструктор с побочными эффектами, эти эффекты выполняются в контексте и с привилегиями приложения. В подтверждённом примере деструктор File::Temp::Dir удаляет дерево каталогов, имя которого контролирует документ.

Итоговый эффект зависит от окружения: от отсутствия последствий (если подходящих классов нет) до разрушения данных на диске. Вектор CVSS предполагает сетевой вектор атаки без привилегий и взаимодействия с пользователем, однако конкретные последствия определяются классами, загруженными в целевом процессе.

Условия успешной эксплуатации​


Из описания CVE и метрики CVSS следуют такие условия:

  • приложение использует Perl-модуль YAML версии до 1.30;
  • приложение загружает YAML-документ, контролируемый атакующим;
  • в процессе уже загружен класс, чей метод DESTROY выполняет опасные действия (например, File::Temp::Dir из ядра Perl);
  • по вектору CVSS атака сетевая (AV:N), без привилегий (PR:N) и без участия пользователя (UI:N) — достаточно возможности доставить документ в уязвимый загрузчик.

Наличие подходящего загруженного класса — ключевое ограничение: без него документ может лишь создать объект безвредного класса.

Возможный сценарий атаки​


Разумный сценарий (вывод на основе описанной механики, а не зафиксированный инцидент): сервис на Perl принимает YAML-документы от пользователей или из внешнего источника — например, конфигурации, задания или данные API.

Атакующий формирует документ с тегом perl/hash:Class, указывающим на класс с «опасным» деструктором, и передаёт его сервису. При загрузке документа создаётся объект выбранного класса с заданными полями.

Когда объект уничтожается сборщиком мусора Perl, вызывается DESTROY, и деструктор выполняет заложенное документом действие — в описанном примере удаляет дерево каталогов. Это приводит к разрушению данных или отказу в обслуживании с привилегиями уязвимого приложения. Иные последствия возможны при наличии других классов с деструкторами, но конкретные сценарии кроме удаления каталогов источниками не подтверждены.

Есть ли публичный эксплойт​


В переданном пакете доказательств нет сведений о публичном PoC-коде, готовом эксплойте или подтверждённых случаях эксплуатации в реальных атаках. Запись отсутствует в каталоге CISA KEV, а EPSS низкий (0,18%).

При этом в ссылках CVE присутствуют патчи в репозитории yaml-pm, обсуждение issue и публикация в списке oss-security — это указывает на публичное техническое описание проблемы, но не подтверждает наличие рабочего эксплойта. Отсутствие сведений об эксплойте не означает его отсутствия: обновление не следует откладывать из-за низкой видимости.

Признаки эксплуатации​


Специфичные IOC для этой уязвимости в доступных источниках не опубликованы. Признаки эксплуатации приходится искать по общим, неспецифичным точкам контроля:

  • неожиданные удаления файлов или каталогов в журналах файловой системы и системах мониторинга, особенно если процесс на Perl обслуживает YAML-документы;
  • журналы приложений на Perl с записями о загрузке YAML-документов, содержащих теги вида perl/hash:...;
  • аномальные ошибки или аварийные завершения Perl-процессов после приёма внешних YAML-документов.

Эти признаки не являются подтверждёнными индикаторами компрометации — они лишь указывают направления проверки.

Как обнаружить атаку​


Обнаружение строится на двух уровнях: поиск уязвимых версий и поиск следов аномального поведения.

Для инвентаризации проверьте, какие системы используют пакет libyaml-perl, и сопоставьте версии с разделом «Какие продукты и версии затронуты». Команды проверки приведены ниже.

Для поведенческого контроля:

  • аудит журналов Perl-приложений, обрабатывающих внешние YAML, на теги perl/hash:Class и подобные;
  • мониторинг массовых удалений каталогов процессами на Perl;
  • сверка времени инцидентов удаления данных с моментами приёма YAML-документов.

Специфичных сигнатур и IOC источники не предоставляют, поэтому результаты таких проверок следует трактовать осторожно.

Как проверить свою версию​


Проверьте версию дистрибутива и пакета:

bash
cat /etc/os-release
uname -r
apt-cache policy libyaml-perl
ubuntu-security-status

apt-cache policy libyaml-perl покажет установленную и доступную версии пакета. ubuntu-security-status поможет оценить статус безопасности пакетов в системе. Дополнительно версию самого модуля можно узнать командой Perl, например perl -MYAML -e 'print $YAML::VERSION' — это общепринятый способ, не специфичный для Ubuntu.

Исправление​


Основная мера — обновить пакет libyaml-perl до версии, в которой проблема устранена. Уязвимость исправлена в YAML 1.30 для Perl; в Ubuntu для части релизов в записи OSV указаны версии 1.30-1 и 1.31-1, при этом все перечисленные релизы помечены как затронутые с «introduced: 0».

Порядок действий:

  • обновите список пакетов: sudo apt update;
  • установите обновление: sudo apt install --only-upgrade libyaml-perl (или sudo apt upgrade libyaml-perl);
  • перезапустите Perl-приложения, использующие модуль YAML, чтобы в памяти не оставался старый код.

Точный состав исправленных пакетов по релизам проверяйте на странице Ubuntu Security CVE-2017-20285 — в переданных данных поле availability не заполнено, и утверждать наличие опубликованных исправлений для каждого релиза из них нельзя.

Временные меры защиты​


Если обновление сразу недоступно, снизить риск можно организационными и архитектурными мерами. Это защитные выводы, а не подтверждённые рекомендации вендора:

  • не загружать YAML-документы из недоверенных источников уязвимой версией модуля;
  • по возможности перейти на безопасный формат обмена для внешних данных, например YAML без Perl-тегов;
  • ограничить привилегии Perl-процессов, обрабатывающих YAML, чтобы деструкторы не могли разрушать важные данные;
  • фильтровать входные документы на наличие тегов perl/hash:... до передачи загрузчику.

Эффективность таких мер зависит от приложения; полной защитой остаётся обновление.

Как проверить устранение уязвимости​


После обновления убедитесь, что уязвимая версия заменена:

bash
apt-cache policy libyaml-perl
perl -MYAML -e 'print $YAML::VERSION'

Версия модуля должна быть не ниже 1.30. Также проверьте:

  • что ubuntu-security-status не помечает libyaml-perl как уязвимый;
  • что Perl-приложения, использующие YAML, перезапущены и работают с новой библиотекой;
  • что в журналах после обновления нет новых инцидентов неожиданного удаления каталогов.

Если версия модуля в системе ниже 1.30, обновление не завершено.

Вывод​


CVE-2017-20285 показывает, как особенность семантики Perl — автоматический вызов DESTROY — превращает безобидную на вид десериализацию YAML в инструмент разрушения данных. Для Ubuntu затронут пакет libyaml-perl во всех актуальных LTS-релизах, включая 16.04 LTS и новее.

Оценка Ubuntu (medium) ниже базовой CVSS 9.1, а EPSS составляет 0,18%, однако это не основание откладывать обновление: последствия зависят от классов, загруженных в конкретном приложении, и могут включать удаление деревьев каталогов. Проверьте версию libyaml-perl, установите исправление и перезапустите зависимые сервисы; актуальные данные — на Ubuntu Security и NVD.

Официальные источники​


  1. NVD — CVE-2017-20285
  2. Ubuntu OSV — CVE-2017-20285
  3. FIRST EPSS — CVE-2017-20285

История обновлений статьи​


  • 07.10.2026 — Опубликована первая версия материала.
 
Назад
Верх Низ