В популярной Ruby-библитеке bootstrap-sass (вариант Bootstrap 3 с поддержкой Sass), насчитывающей около 28 млн загрузок, выявлен бэкдор (CVE-2019-10842), позволяющий злоумышленникам выполнить свой код на серверах, на которых выполняются проекты, использующие bootstrap-sass. Бэкдор был добавлен в состав выпуска 3.2.0.3, опубликованного 26 марта в репозитории RubyGems. Проблема устранена в выпуске 3.2.0.4, предложенном 3 апреля.
Бэкдор был скрыто добавлен в файл lib/active-controller/middleware.rb, в котором появился код для вызова eval со значением, передаваемым через Cookie «___cfduid=». Для атаки достаточно было отправить запрос на сервер, выставив Cookie «___cfduid» и передав в качестве аргумента команды, закодированные в формате Base64. Имя Cookie «___cfduid» было выбрано для камуфлирования под Cookie «__cfduid», выставляемый CDN Cloudflare и отличающийся наличием двух символов подчёркивания вместо трёх.
Примечательно, что вредоносный код был опубликован только в финальном пакете, опубликованном в репозитории RubyGems, но не был внесён в исходные тексты в Git-репозитории. Исходный код библиотеки оставался корректным и не вызывал подозрения у разработчиков, что подчёркивает важность применения повторяемых сборок и внедрения процесса проверки соответствия публикуемых пакетов с эталонными исходными текстами.
Судя по всему, атака была проведена через захват параметров учётной записи к RubyGems у одного из двух мэйнтейнеров библиотеки (официально утечка учётных данных пока не подтверждена).
Атаковавшие проявили осмотрительность и встроили бэкдор не в самую свежую ветку 3.4.x, последний выпуск которой насчитывает более 217 тысяч загрузок, а как обновление для прошлой ветки 3.2.x, рассчитывая на то, что корректирующее обновление зависимости не вызовет подозрений. По приблизительной оценке 1670 репозиториев на GitHub используют bootstrap-sass в качестве зависимости и связанные с этими репозиториями приложения потенциально могут быть скомпрометированы. Разработчикам рекомендуется проследить использование библиотеки bootstrap-sass среди косвенных зависимостей и проверить не было ли выполнено автоматическое обновление до версии с бэкдором. Судя по статистике RubyGems пакет с бэкдором был загружен около 1500 раз.
Информация о возможном бэкдоре была опубликована в системе отслеживания ошибок спустя несколько часов после размещения проблемного выпуска 3.2.0.3, после чего примерно через час мэйнтейнеры удалили проблемный выпуск из RubyGems и поменяли пароли для входа, но не учли, что удалённые версии ещё несколько дней могут оставаться доступными на зеркалах. 3 апреля был дополнительно сформирован выпуск 3.2.0.4, полностью аналогичный версии 3.2.0.2, который позволял избавиться от версии с бэкдором без перехода на новую ветку 3.4.