В понедельник команда RubyGems — пакета программных инструментов для установки, обновления и настройки библиотек и программ Ruby — объявила об устранении критической уязвимости.

Злоумышленники могли использовать уязвимость — небезопасную десериализацию объектов — для расширения своих прав и удаленного выполнения кода. По словам команды RubyGems, для этого злоумышленникам нужно было ввести экземпляр объекта в уязвимую систему таким образом, чтобы обеспечить выполнение кода.

«Команда RubyGems проверила все инструменты Gems, и на основании доступных нам данных мы можем с уверенностью сказать, что ни один из недавно опубликованных инструментов Gems не затронут. Однако принимая во внимание то долгое время, в течение которого ошибка сохранялась в производственном процессе, мы не можем с такой же уверенностью утверждать, что ни один Gems не затронут», — написал технический специалист компании Аарон Паттерсон (Aaron Patterson) в опубликованном в понедельник бюллетене. Он добавил, что ошибка появилась в 2012 году. Видимо, инструменты RubyGems были уязвимы в течение минимум пяти лет.

Из бюллетеня:

«В этом конкретном случае дело в способе хранения контрольных сумм в Gem-файлах, предусмотренном в RubyGems. Контрольные суммы хранятся в YAML внутри Gem, и до этого исправления их можно было читать с помощью простого YAML.load. YAML, как и Marshal, предназначен для сериализации и десериализации произвольных объектов Ruby. Когда RubyGems.org обрабатывает загрузку Gem, сначала считывается спецификация Gem, которая, в свою очередь, считывает контрольные суммы в Gem. Умелый злоумышленник мог записать файл с контрольными суммами в Gem, который содержит YAML, отформатированный таким образом, чтобы можно было ввести произвольный объект Ruby и использовать этот объект в качестве точки расширения атаки».

Ошибку обнаружил исследователь Макс Юштич (Max Justicz). Он сообщил о ней в прошлую пятницу и опубликовал описание уязвимости в субботу, за два дня до выхода исправления.

Юштич пишет, что файлы YAML, находящиеся в Gem, содержат все, включая имя, автора, версию, исходный код и криптографические хеши.

«Я с удивлением узнал, что разбор недоверенного YAML опасен, — написал Юштич. — Я всегда считал, что это безвредный формат обмена, как JSON. По сути, YAML позволяет шифровать произвольные объекты, примерно как модуль pickle в Python».

По словам Юштича, когда Gem загружается на сайт rubygems.org, он использует небезопасные вызовы для загрузки файлов YAML в Gem. Исследователь предположил, что авторы rubygems.org знали об этом и разрабатывали исправления аналитических библиотек, используемых YAML и Gem для парсинга, с тем чтобы обеспечить десериализацию классов по белому списку.

В своем бюллетене Юштич также подробно рассматривает PoC-эксплойт.

«Для меня один из выводов заключается в том, что YAML — очень мощный инструмент, который иногда используется в контекстах, где стоило бы задействовать менее впечатляющие, но более надежные форматы обмена вроде JSON, — пишет исследователь. — Возможно, в будущем YAML.load будет модифицирован и начнет принимать белый список классов как опциональный параметр, и десериализация сложных объектов станет поведением opt-in».

По словам Паттерсона, проблему можно было решить добавлением кода и осуществить партизанское латание RubyGems, то есть разрешить только десериализацию безопасных типов.

«Так как этот партизанский патч исправил быт только RubyGems, но не RubyGems.org, мы решили, что будет лучше выпустить патч для всего пакета, — поясняет Паттерсон. — Вот почему для RubyGems был выпущен список CVE и разработано исправление».

Категории: Аналитика, Кибероборона, Уязвимости