Разработчики RubyGems заявили, что большинство атак на цепочку поставок использует узкий временной промежуток после взлома учётной записи, чтобы опубликовать вредоносный пакет. В связи с этим Bundler 4.0.13 вводит фильтр cooldown для новых пакетов, чтобы ограничить их инсталляции в течение нескольких дней после публикации.

Функция является необязательной и дополняет, а не заменяет существующие средства защиты, такие как обязательная двухфакторная аутентификация и доверенная публикация.

Cooldown считывает временную метку created_at для каждой версии, которую теперь предоставляет индекс v2 на rubygems.org. Версия, источник которой не раскрывает created_at, например, старые серверы гемов, исторические записи до перехода на v2 или частные реестры, всё ещё использующие формат v1, рассматривается как находящаяся за пределами временного окна и остаётся доступной. 

Cooldown входит в состав Bundler 4.0.13. Тем, кто использует более раннюю версию, нужно обновить её и зафиксировать в файле блокировки, чтобы всё работало согласованно: 

$ gem update --system          # or: gem install bundler -v 4.0.13
$ bundle update --bundler=4.0.13

Затем требуется установить небольшое ограничение по времени для исходного кода в Gemfile. Это правильная настройка для большинства команд: она фиксируется вместе с кодом, поэтому каждый разработчик и запуск CI обеспечивают один и тот же временной интервал без дополнительной настройки. 

source "https://rubygems.org", cooldown: 7

gem "rails"
gem "puma"

Поскольку Cooldown не установлен по умолчанию, проект без него продолжает разрешать самые новые версии.

Помимо ключевого слова per-source, параметр cooldown применяет одно значение ко всем источникам, в рамках проекта, глобально или через окружение:

$ bundle config set cooldown 7          # stored in .bundle/config for this project
$ bundle config set --global cooldown 7 # applies to every project for this user
$ BUNDLE_COOLDOWN=7 bundle install      # no lockfile yet, e.g. a fresh CI checkout
$ BUNDLE_COOLDOWN=7 bundle update       # re-resolve when a lockfile already exists

Для одноразового запуска нужно ввести --cooldown для install, update, add или outdated:

$ bundle install --cooldown 7
$ bundle update --cooldown 7
$ bundle add rails --cooldown 7
$ bundle outdated --cooldown 7

Если присутствует более одного из этих параметров, они разрешаются в фиксированном порядке приоритета: флаг командной строки > параметр конфигурации > per-source cooldown: в Gemfile. Флаг --cooldown переопределяет параметр cooldown (конфигурация пакета или BUNDLE_COOLDOWN), который, в свою очередь, переопределяет cooldown для источника. Значение всегда является неотрицательным целым числом дней; строка, число с плавающей запятой, отрицательное число или массив отклоняются с ошибкой InvalidOption.

Поскольку флаг и настройка применяются единообразно ко всем источникам, ключевое слово per-source используется, когда политика различается в зависимости от реестра, например, для охлаждения общедоступных гемов при доверии внутреннему реестру:

source "https://rubygems.org", cooldown: 7

source "https://gems.internal.example.com", cooldown: 0 do
  gem "internal-tool"
end

Команда --cooldown N в командной строке переопределяет все источники для этого запуска, включая тот, который освобождён от ограничений.

Передача значения 0 отключает период охлаждения. Это наиболее важно, когда появляется исправление для активно используемой уязвимости нулевого дня или сообщение об уязвимости указывает на необходимость немедленного обновления. В этих случаях значение --cooldown 0 позволяет получить свежий релиз, не снимая политику ограничений для всех остальных: 

$ bundle install --cooldown 0
$ BUNDLE_COOLDOWN=0 bundle update rails   # ignore any configured cooldown this time

bundle outdated учитывает задержку. Он аннотирует версии, которые новее, но всё ещё находятся в пределах временного окна, указывая количество дней, оставшихся до того, как их можно будет исправить. 

$ bundle outdated --cooldown 7
Gem             Current   Latest                  Requested   Groups
aws-partitions  1.1251.0  1.1256.0 (cooldown 3d)  = 1.1251.0  default

Реестр также теперь проверяет содержимое гемов во время отправки и проверяет авторизацию на Have I Been Pwned, чтобы скомпрометированные пароли не могли быть использованы повторно. Специальная команда проводит сканирование уязвимостей с помощью ИИ для наиболее важных гемов при поддержке Alpha Omega и Anthropic.

Ранее в GitHub сообщили, что хакеры, взломавшие 3800 внутренних репозиториев платформы, получили доступ к ним через вредоносную версию расширения Nx Console для VS Code. Она была скомпрометирована за неделю до этого в результате атаки на цепочку поставок npm от TanStack.

Между тем исследователи кибербезопасности обнаружили более 30 пакетов npm из пространства имен Red Hat ‘@redhat-cloud-services’, которые были скомпрометированы в результате атаки на цепочку поставок. В ходе неё хакеры распространили новый вариант вредоносного ПО Shai-Hulud «Miasma», предназначенного для кражи учётных данных.