Атака на цепочку поставок в пакетах Keyv/Cacheable: скомпрометирована учётная запись разработчика

Атака на цепочку поставок NPM

Атака на цепочку поставок в мире открытого кода затронула популярные пакеты Keyv и Cacheable, которые применяются для кэширования данных в среде Node.js. Многие веб-проекты используют эти библиотеки как часть своей инфраструктуры. Пакеты входят в число наиболее востребованных решений для кэширования, поэтому затронутая аудитория огромна: от небольших стартапов до крупных корпоративных систем. Учитывая широкую распространённость библиотек, атака способна затронуть не только разработчиков, но и конечных пользователей продуктов, которые зависят от этих библиотек. В результате инцидента злоумышленники опубликовали вредоносные версии пакетов, что создало риск для тысяч программных продуктов.

Описание

События развивались стремительно. Злоумышленник получил контроль над учётной записью одного из разработчиков проекта на GitHub. Сначала он внёс в репозиторий keyv изменения для закрепления в системе, а затем выпустил обновлённую версию пакета. Все вышедшие в короткий промежуток времени версии содержали один и тот же вредоносный код. Атакующие, как правило, выбирают именно такие инструменты, потому что они дают доступ к множеству проектов сразу. Такой сценарий типичен для атак на цепочки поставок, когда злоумышленник действует быстро, используя доверие к официальным источникам.

По данным Wiz Research, этот код принадлежит семейству вредоносных программ Mini Shai-Hulud. Ранее злоумышленники уже использовали подобные угрозы в кампаниях TeamPCP и antv, также направленных против цепочек поставок. Вредоносное ПО такого типа обычно работает тихо, не проявляя себя до тех пор, пока не соберёт достаточно данных. Появление хорошо известных инструментов в новой атаке говорит о том, что злоумышленники не изобретают новые методы, а переиспользуют уже проверенные и доработанные.

Вредоносная программа охватывает широкий спектр чувствительной информации. Среди целей - облачные учётные данные, ключи доступа к серверам, SSH-ключи, конфигурации Kubernetes и Terraform. Также в фокусе оказываются файлы настроек систем искусственного интеллекта и файлы криптовалютных кошельков. Код нацелен на локальные файлы, которые могут содержать пароли, ключи и историю командной строки. Дополнительно он пытается добыть секреты из конвейеров непрерывной интеграции, определить тип используемого сборщика и изучить облачное окружение жертвы. Всё это позволяет получить доступ к основным компонентам инфраструктуры, а не только к одному приложению.

Похищенные данные злоумышленники вывозят через специально созданные репозитории на GitHub. Они используют для этого скомпрометированные учётные записи и указывают в описании репозитория строку Shai-Hulud: Here We Go Again - отсылку к ранее открыто опубликованному коду. Злоумышленники размещают в первоначальных коммитах устрашающее сообщение. Его суть в том, что блокировка одного из ключей доступа вызовет сбой всех сторонних клиентов, работающих с сервисами жертвы. Этот приём служит для того, чтобы задержать процесс реагирования и выиграть время для вывода данных. Автоматизация процесса эксфильтрации позволяет вывести большой объём информации за короткое время. Использование GitHub в качестве канала передачи затрудняет обнаружение, потому что трафик выглядит естественно для активного разработчика.

Последствия такой атаки выходят далеко за пределы одного проекта. Если злоумышленники получили облачные ключи, открывается доступ к базам данных, виртуальным машинам и внутренним сервисам. Это может привести к утечке конфиденциальной информации, длительному простою и финансовым потерям. Стоимость инцидента для компаний может измеряться миллионами долларов, если учесть затраты на расследование и восстановление. При компрометации рабочих станций разработчиков существует риск кражи исходного кода и внедрения в него дополнительных закладок. Особую опасность представляет сбор данных из систем непрерывной интеграции, где часто хранятся ключи от всех окружений, включая производственные.

Командам безопасности следует действовать немедленно. Нужно найти и удалить затронутые версии пакетов из всех сред разработки, систем сборки и конвейеров развёртывания. Если код уже установлен, системы стоит рассматривать как скомпрометированные и пересобирать их. Важно помнить, что просто удаление пакета не решает проблему, если секреты уже скомпрометированы. Затем необходимо перевыпустить все потенциально раскрытые ключи: токены GitHub, SSH-ключи, облачные пароли, конфигурации Kubernetes и Terraform. Обязательно проверить облачные среды и хранилища кода на признаки несанкционированных действий. Полезно сохранить логи и артефакты для последующего анализа инцидента.

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

Атака на Keyv и Cacheable демонстрирует, насколько хрупкой бывает экосистема открытого кода. Проекты часто зависят от нескольких библиотек, а их поддержкой занимаются немногочисленные мейнтейнеры. Поэтому даже одиночная компрометация аккаунта способна привести к массовому заражению. Инцидент получил широкий резонанс в профессиональном сообществе, и ожидается, что появятся дополнительные аналитические материалы. Wiz Research продолжает расследование и обещает дополнить отчёт новыми данными по мере их появления. Пострадавшим компаниям рекомендуется обратиться к специалистам по реагированию на инциденты, чтобы провести полноценный анализ и восстановить доверие к процессу разработки.

Индикаторы компрометации

Package

  • @cacheable/utils 2.5.1
  • @hubsync/web-sdk-react 6.3.7
  • @nebula.js/nucleus 0.5.1
  • @ornikar/babel-preset-base 6.0.3
  • @ornikar/babel-preset-kitt-universal 8.0.3
  • @ornikar/babel-preset-react 6.1.4
  • @ornikar/browserslist-config 8.0.3
  • @ornikar/commitlint-config 8.3.2
  • @ornikar/eslint-config-babel 24.0.1
  • @ornikar/eslint-config-react 24.0.1
  • @ornikar/eslint-config-typescript 24.0.1
  • @ornikar/eslint-config-typescript-react 24.0.1
  • @ornikar/eslint-plugin-neverthrow 1.3.1
  • @ornikar/eslint-plugin-ornikar 24.0.1
  • @ornikar/graphql-config 1.1.1
  • @ornikar/intl-config 10.0.2
  • @ornikar/kitt2 1.0.1
  • @ornikar/monorepo-config 14.3.2
  • @ornikar/postcss-config 9.1.2
  • @ornikar/prettier-config 9.0.3
  • @ornikar/prismic-components 0.0.2
  • @ornikar/react-modern-calendar-datepicker 3.2.1
  • @ornikar/react-native-svg-transformer 1.0.6
  • @ornikar/renovate-config 9.0.2
  • @ornikar/repo-config-react 13.0.8
  • @ornikar/repo-config-react-legacy-css 15.1.2
  • @ornikar/rollup-plugin-postcss 2.0.5
  • @ornikar/stylelint-config 14.0.3
  • @ornikar/typed-css-modules-loader 0.8.2
  • @qlik/embed-react 2.5.3
  • @qlik/embed-runtime 1.6.4
  • @qlik/embed-web-components 1.7.3
  • @qlik/runtime-module-loader 1.5.1
  • @thiennq/docs-viewer 1.6.2
  • babel-plugin-linaria-css-to-undefined 0.3.1
  • cache-manager 7.2.10
  • cacheable-request 13.0.20
  • http-metrics-middleware 2.2.2
  • keyv 6.0.0
  • picasso-plugin-hammer 2.11.6
  • picasso-plugin-q 2.11.6
  • pob-test-package-in-monorepo 5.2.1

Domain

  • eth.llamarpc.com
  • eth-mainnet.nodereal.io
  • go.getblock.io
  • npm-cache.com

SHA1

  • 35a672cf34b996b91f3e1c28cbf3a05a37e036e4
  • 686aa40d0fc22c8d569494543a0f891f359f2f99
  • f525d52ceb966516686b482d3dc0137028cc6a63

Комментарии: 0