В современном мире программного обеспечения атаки на цепочки поставок становятся все более частыми и опасными. В сентябре 2025 года произошел инцидент, связанный с атакой на один из популярных пакетов в экосистеме npm - @ctrl/tinycolor, который скачивается более 2 миллионов раз в неделю. Это событие выявило значимые уязвимости в процессах публикации и управления разрешениями в совместных репозиториях, а также подчеркнуло важность координации между разработчиками и платформами для оперативного реагирования на угрозы. Причины инцидента и как произошла атака Инцидент возник в результате злоумышленного внедрения вредоносного GitHub Actions workflow в общий репозиторий, где несколько разработчиков имели административные права. В частности, в проекте angulartics2 один из соавторов, обладавший соответствующими административными полномочиями, добавил новую ветку с названием Shai-Hulud и включил в неё вредоносный Workflow.
Этот инструмент автоматически запускался при пуше изменений без необходимости проверки через Pull Request, что позволило сразу выполнить нежелательные действия. Главным элементом атаки стало похищение npm токена с широкими правами публикации. Этот токен был сохранен как секрет в GitHub Actions, что сделало его уязвимым для кражи через внедренный Workflow. Злоумышленник использовал данный токен для выпуска злонамеренных версий сразу двадцати различных пакетов, включая @ctrl/tinycolor. Многие из этих пакетов не являются широко известными, однако влияние атаки распространялось из-за популярности Tinycolor.
Расследование и обнаружение проблемы Об инциденте разработчик узнал благодаря информации от сообщества и коллег. Вечером 15 сентября 2025 года разработчик Scott Cooper получил сообщение от известного специалиста по безопасности Весса Тодда, который уже сигнализировал в службы безопасности GitHub и npm. Это позволило начать оперативное реагирование и проактивные меры по обнаружению и удалению вредоносных версий пакетов. Особенность этого инцидента заключается в том, что для атаки не потребовалось фишинга, неправомерного доступа к аккаунту или установки вредоносного ПО на локальные машины разработчиков. Поскольку публикация была автоматизирована через GitHub Actions, уязвимость заключалась именно в наличии широких прав у токена, используемого в workflow.
Меры реагирования и результаты устранения ущерба При получении сообщения службы безопасности GitHub и npm незамедлительно приступили к удалению вредоносных версий из реестра. Параллельно авторы уязвимых пакетов выпустили чистые версии с целью очистить кэш и восстановить доверие пользователей. Также были отозваны все существующие токены, включена обязательная двухфакторная аутентификация для публикаций и усилен контроль прав доступа к репозиториям. Для обеспечения более безопасного процесса публикации команда Scott Cooper планирует перейти на использование Trusted Publishing с применением OpenID Connect (OIDC) вместо статических токенов. Данная технология устранит необходимость хранения статичных секретов в репозиториях и обеспечит более прозрачную и надежную систему проверки подлинности.
Важное значение имеют и управленческие решения: ограничения на добавление новых контрибьюторов, создание токенов с ограниченными правами конкретно на публикацию выделенных пакетов и использование инструментов для предупреждения запуска нежелательных postinstall скриптов. Уроки безопасности из инцидента Инцидент с Tinycolor очевидно демонстрирует, что безопасность цепочки поставок требует комплексного подхода. Компании и отдельные разработчики должны постоянно анализировать свои процессы публикации и контроля доступа, чтобы минимизировать риски злоупотребления полномочиями. Использование статичных токенов для публикации пакетов сопряжено с высоким риском, особенно в совместных репозиториях с несколькими администраторами. Переход на цифровые сертификаты с ограниченным сроком действия и доверенным подтверждением личности, как это реализуется в Trusted Publishing, значительно повышает защиту от подобных атак.
Кроме того, важно внимательно следить за управлением секретами в GitHub Actions и других системах автоматизации. Рекомендуется регулярно пересматривать права доступа и удалять лишние или устаревшие токены. Обеспечение прозрачности и информированности сообщества об инцидентах также играет большую роль в быстром реагировании и минимизации ущерба. В данном случае своевременное сотрудничество с OpenJS Foundation, GitHub и npm помогло быстро идентифицировать затронутые пакеты и спрогнозировать масштабы атаки. Рекомендации для разработчиков и организаций В первую очередь, необходимо отказаться от практики использования одного npm токена с широкими правами для нескольких проектов и контрибьюторов.
Для каждого проекта стоит создавать отдельные токены с минимально необходимыми правами. Обязательное включение двухфакторной аутентификации при публикации пакетов существенно повышает уровень безопасности и снижает вероятность компрометации учетной записи. Для автоматизации публикаций лучше выбирать системы, поддерживающие использование OIDC и динамических токенов, а также тщательно контролировать запуск workflows, ограничивая права на их изменение и автоматическую активацию. Разработчикам также рекомендуется использовать пакетные менеджеры, такие как pnpm, которые по умолчанию блокируют запуск несанкционированных postinstall скриптов, что уменьшает потенциальные векторы атак. Не менее важно регулярно обновлять зависимости, следить за всеми экосистемными рекомендациями и быть в курсе актуальных угроз, чтобы своевременно реагировать на возможные инциденты.
Перспективы и будущее безопасности экосистем Этот инцидент подчеркивает растущую сложность и уязвимость экосистемы JavaScript и npm в частности с учетом многочисленных публичных и частных пакетов, которые взаимозависимы. Внедрение стандартов, таких как npm Provenance и Trusted Publishing, а также интеграция безопасных механизмов публикации напрямую с GitHub UI станет важным шагом вперед. Наличие централизованных, легко управляемых настроек безопасности позволит разработчикам сконцентрироваться на создании кода, не беспокоясь о тонкостях защиты инфраструктуры публикации. При этом важным остаётся и просветительский аспект - повышение осведомленности среди сообщества о возможных угрозах, регулярные тренинги и чёткие рекомендации помогут предотвратить повторение подобных инцидентов. Заключение Атака на цепочку поставок пакета @ctrl/tinycolor стала тревожным сигналом для всего сообщества разработчиков и подчеркнула необходимость пересмотра подходов к безопасности в процессах публикации и управления пакетами.
Опыт этого инцидента демонстрирует, что успешная защита требует сочетания технических мер, ответственного управления доступом и эффективного взаимодействия с платформами и сообществом. Применение современных стандартов цифровой аутентификации, более строгие политики доступа и автоматизация безопасных рабочих процессов - это основные направления, которые помогут снизить риски и обеспечить устойчивую экосистему программного обеспечения в будущем. Для каждой команды и отдельного разработчика важно взять уроки этого инцидента на вооружение, пересмотреть свои текущие практики и внедрять надежные меры защиты, чтобы предотвратить попадание вредоносного кода в критически важные проекты, на которые полагаются миллионы пользователей по всему миру. .