Для успешной эксплуатации уязвимости необходимо выполнения трёх условий:
- Атака может быть совершена только на пакеты, в имени которых используется символ тире.
- Атакующий должен иметь возможность разместить gem-пакет с частью имени до символа тире. Например, если атака производится на пакет «rails-html-sanitizer», атакующий должен разместить в репозитории собственный пакет «rails-html».
- Пакет, на который совершается атака, должен быть создан в последние 30 дней или не обновляться в течение 100 дней.
Уязвимость вызвана ошибкой в обработчике действия «yank», трактующего часть имени после тире как название платформы, что позволяло инициировать удаление чужих пакетов, совпадающих в части имени до символа тире. В частности, в коде обработчика операции «yank» для поиска пакетов использовался вызов ‘find_by!(full_name: «#{rubygem.name}-#{slug}»)’, при том, что параметр «slug» передавался владельцем пакета для определения удаляемой версии. Владелец пакета «rails-html» вместо версии «1.2.3» мог указать «sanitizer-1.2.3», что привело бы к применению операции к чужому пакету «rails-html-sanitizer-1.2.3».
Проблема была выявлена исследователем безопасности в рамках действующей на HackerOne программы выплаты вознаграждений за поиск проблем с безопасностью в известных открытых проектах. Проблема устранена в RubyGems.org 5 мая и по заявлению разработчиков они пока не выявили следов эксплуатации уязвимости в логах за последние 18 месяцев. При этом пока проведён лишь поверхностный аудит и в дальнейшем планируется проведение более глубокой проверки.
Для проверки своих проектов рекомендуется проанализировать историю операций в файле Gemfile.lock, вредоносная активность выражается в наличии изменений с сохранением имени и версии или сменой платформы (например, когда пакт gemname-1.2.3 обновлён до gemname-1.2.3-java). В качестве обходного метода защиты от скрытой подмены пакетов в системах непрерывной интеграции или при публикации проектов разработчикам рекомендовано использовать Bundler с опциями «—frozen» или «—deployment» для фиксации зависимостей.
Источник: http://www.opennet.ru/opennews/art.shtml?num=57155