Всем привет! Меня зовут Руслан, я инженер в отделе развития процессов безопасности в YADRO. В прошлой статье я рассказывал о рисках транзитивных зависимостей в open source: один неблагонадежный пакет во всей цепочке — и продуктовая сборка скомпрометирована. Таким пакетом может быть protestware — это вид ПО или библиотек, в которые разработчики (мейнтейнеры) намеренно внедряют деструктивный, изменяющий логику работы или политизированный код. Он так же опасен, как уязвимости в зависимостях, компрометации репозиториев и атаки класса Dependency Confusion.
В отличие от «традиционного» вредоносного ПО, в основе protestware — не получение финансовой выгоды, а идеологическая мотивация: выражение социальных, политических или идеологических взглядов, привлечение внимания к каким-либо событиям в мире, влияние на пользователей, связанных с определенными регионами, организациями или государствами и так далее. С точки зрения безопасности это такой же риск для цепочки поставок ПО, как и другие вредоносные компоненты.
Ниже разберемся, как эта функциональность попадает в инфраструктуру и open source, как ее обнаружить и какие меры предпринять, чтобы защитить свой проект.
Чем protestware угрожает проекту
Начнем с главного: protestware — это не «идейный» баннер или сообщения, которые всплывают на экране и раздражают пользователей (хотя и это неприятно). Код злоумышленников может заблокировать работу всего приложения, а заодно:
повредить или удалить данные;
саботировать бизнес-процессы;
ограничить работу пользователей из определенных регионов;
распространить несогласованные сообщения.
Что делает protestware таким хитрым? Во-первых, он часто маскируется под обычный, проверенный код. Антивирусы его не видят, потому что он от известного автора и кажется легитимным. Во-вторых, вредоносный код может «спать» долгое время и активироваться только по определенному условию — например, в конкретную дату или при выполнении определенного действия (логические и временные бомбы). В-третьих, такие атаки могут быть направлены специально на кого-то — например, на жителей определенных стран или даже на конкретные компании.
Выше я упомянул баннер, поэтому сделаю уточнение. Вывод безвредного баннера, сообщения в консоли, ссылки на петицию или отображение своей позиции на главной странице репозитория на GitHub сложно отнести к protestware, так как фактически в этом нет вредоносной составляющей. С другой стороны, все перечисленное может повлечь репутационные потери, и с точки зрения развития продукта это нужно оценивать.
Несколько известных инцидентов:
node-ipc и peacenotwar
Пакеты: node-ipc — библиотека межпроцессного взаимодействия, peacenotwar — специально созданный вредоносный модуль.
Механизм: библиотека node-ipc добавляла модуль peacenotwar как зависимость. Модуль peacenotwar при установке проверял исходящий IP-адрес через сервисы геолокации и определял страну. Если это была Россия или Беларусь, он заменял все файлы на диске на «символы мира» — сердца. Для этого модуль использовал обфусцированный код с execSync для вызова команды cp или echo, создавая новый файл с содержимым сердца, а оригинал перезаписывал. Также создавался файл WITH-LOVE-FROM-AMERICA.txt на рабочем столе.
Воздействие: нарушилась целостность файловой системы в определенных географических условиях (гео-IP). Вредоносный код был спрятан в хуках postinstall и в основном коде библиотеки, использующем require('peacenotwar') с динамическим импортом.
colors.js и faker.js
Пакет: colors — популярная библиотека для цветного вывода в терминал.
Механизм: бесконечный цикл с выводом не-ASCII символов в lib/index.js, который активировался при любом require('colors').
Воздействие: отказ в обслуживании (DoS) для CLI-приложений и серверов, использующих пакет на старте. Код запускался в основном потоке, блокируя event loop Node.js.
Детали: этот случай можно также отнести к саботажу сопровождения open source-проекта, ведь изменения внес один из его мейнтейнеров. Ситуация показала риски чрезмерной зависимости от отдельных мейнтейнеров и недостаток контроля за критически важными компонентами.
es5-ext
Пакет: es5-ext — низкоуровневые утилиты ECMAScript 5, используется в webpack.
Механизм: мейнтейнер добавил проверку времени и региональных настроек. Если системное время между 22:00 и 06:00 или локаль ru_RU, функция require('es5-ext') вызывает 100% загрузку CPU в бесконечном цикле с while(Date.now() < ...).
Воздействие: отказ в обслуживании (DoS).
Размещение и триггеры
В protestware вредоносная логика может размещаться:
в коде времени исполнения — активируется при вызове функции;
хуках жизненного цикла npm — запускаются при установке пакета;
скриптах сборки;
тестах (тест-скриптах);
метаданных пакета (загрузка из package.json и динамическое получение инструкций с удаленного сервера).
А вот что запускает активацию:
геолокация по IP: запросы к ipinfo.io, ip-api.com, geoip-базы;
системная локаль, часовой пояс, язык клавиатуры;
переменные окружения: process.env.USER, process.env.HOME, NODE_ENV, внедренные CI-переменные типа GITLAB_CI;
hostname, домен сети, username OS;
дата и время.
Многие организации рассматривают protestware как риск, который может затронуть только отдельные страны и категории пользователей. На самом деле серьезные последствия могут быть для продукта в целом — например, это отказ критических сервисов, нарушение работы CI/CD-конвейеров, повреждение или удаление данных, остановка бизнес-процессов, в том числе нарушение SLA. Сюда же репутационные потери и дополнительные затраты на расследование инцидента и восстановление систем.
Если хотите проектировать и разрабатывать телеком-решения, ждем вас в нашей команде. Сейчас ищем:
— инженера по тестированию на проникновение;
— инженера по сетевой безопасности;
— инженера по внедрению и обслуживанию СЗИ.Все открытые вакансии можно посмотреть на карьерном сайте.
Как protestware попадает в контур разработки
Распространенный сценарий — обновление уже используемого пакета. Новая версия одной из транзитивных зависимостей может автоматически попасть в сборку через механизмы управления пакетами — npm, pip, get, а в результате вредоносный код окажется внутри без участия разработчиков. То же самое может произойти во время обновления или установки инструментов разработки (плагинов, линтеров) и инструментов для CI/CD-конвейеров.
В Open Source protestware может попасть при компрометации аккаунта мейнтейнера проекта: получив доступ к репозиторию или реестру пакетов, злоумышленник может опубликовать новую версию библиотеки с вредоносным кодом. Еще вариант — успешная атака Dependency Confusion: злоумышленник публикует пакет с именем, совпадающим с названием внутренней зависимости. При определенных настройках менеджера пакетов или репозитория зависимостей система может предпочесть внешний пакет внутреннему — тогда код будет взят из непроверенного источника.
Как обнаружить
По этим действиям можно заподозрить, что вредоносный компонент попал в ваш продукт:
Подозрительные проверки географического расположения пользователя. Если вы видите такие проверки в коде, это еще не доказывает, что вы столкнулись с protestware, но вам точно нужен дополнительный анализ.
Необъяснимые сетевые запросы: обращения к неизвестным API, геолокационным сервисам или внешним ресурсам, не связанным с функциональностью библиотеки. Здесь тоже нужен анализ.
Неожиданные операции с файловой системой. Любые операции удаления или модификации пользовательских данных должны соответствовать назначению компонента.
Обфускация кода. Для большинства библиотек обфусцированный код можно рассматривать как дополнительный фактор риска.
Универсального способа выявления protestware нет — зато есть инструменты для анализа цепочки поставок программного обеспечения. С их помощью легко выявить индикаторы, которые могут указывать на protestware.
Вот некоторые из них:
Анализ используемого open source (OSA). Предварительный анализ open source, который планируется использовать в продукте, позволяет снизить возможные риски для продукта. Так, можно проверить, что выбранного open source нет в списках «токсичных» репозиториев на github. Авторы таких репозиториев могут быть хактивистами.
Композиционный анализ (SCA) и формирование Software Bill of Materials (SBOM). Позволяют получить полный перечень компонентов, входящих в состав программного продукта, провести анализ состава зависимостей, отслеживать новые версии компонентов, выявлять известные вредоносные пакеты и анализировать возможные риски цепочки поставок.
Статический анализ исходного кода. Поиск конструкций, связанных с геолокацией или региональными настройками (например, geoip, country, locale, ip-api), удалением данных (например, rm -rf, delete, destroy, wipe, overwrite), выполнением внешних команд или динамической загрузкой кода. Ориентирован на типичные признаки protestware и помогает определить участки, где нужен глубокий анализ.
Динамический анализ. Контроль файловой активности, создаваемых сетевых соединений и процессов, обращений к системным ресурсам. Во время динамического анализа приложения рекомендуется запускать в изолированной среде (контейнерах, виртуальных машинах, специализированных sandbox-решениях) — один этот шаг уже снижает риск проникновения protestware.
Мониторинг изменений в репозиториях. Такими изменениями могут быть смена владельцев, новые мейнтейнеры, необычно крупные коммиты перед релизом, массовые изменения в зависимостях и так далее.
Что делать, если обнаружили
Первый шаг — изолировать подозрительный пакет. Для этого нужно остановить автоматические обновления, зафиксировать текущую конфигурацию, проанализировать влияние на систему и понять, откуда появилась проблема.
Второй шаг — заблокировать скомпрометированную версию, чтобы она не использовалась. Если не успели и версия уже используется, нужно исключить ее из продукта.
Третий шаг — откатить версию к более ранней. Обычно это самый быстрый способ устранить проблему, но важно убедиться, что в предыдущей версии нет аналогичной функциональности.
Что потом? Если компонент критически важен, можно создать форк и сопровождать его в дальнейшем. Для такого подхода потребуются дополнительные ресурсы, зато вы будете меньше зависеть от внешних участников проекта. Если такой вариант не подходит, можно задуматься о полной замене компонента с protestware.
Как защитить проект от угрозы
Эти действия помогут защитить ваш продукт от protestware:
Принципы Zero Trust для зависимостей. Подтверждайте происхождение и безопасность любого внешнего компонента независимо от его популярности и репутации.
Регулярный аудит зависимостей. Регулярно удаляйте неиспользуемые зависимости и неподдерживаемые библиотеки, ведь каждая из них может стать вектором атаки.
Контроль версий. Старайтесь использовать фиксированные версии зависимостей — это снизит вероятность неожиданных изменений во время сборки.
Изоляция сборки. Так вы защитите продуктовую среду от компрометации цепочки поставок и хост-систему от нежелательных изменений, которые могут внести сборочные скрипты, другие сборки от вмешательства текущей — то есть вредоносный код из одной сборки не распространится на следующую.
Подписание артефактов. Это поможет подтвердить происхождение программных компонентов и усложнит распространение поддельных пакетов.
Использование внутренних репозиториев артефактов. В этом случае новые версии пакетов предварительно проверяются до того, как попасть в производственную среду. Можно ввести ручное утверждение обновлений, автоматизированное сканирование, контроль происхождения артефактов и аудит изменений.
Выстраивая процессы защиты, рекомендую ориентироваться на такие документы и фреймворки:
NIST Secure Software Development Framework (SSDF) — описывает набор практик безопасной разработки, включая управление зависимостями, контроль происхождения компонентов, защиту процесса сборки и управление уязвимостями.
SLSA (Supply-chain Levels for Software Artifacts) — предлагает модель зрелости безопасности цепочки поставок и позволяет постепенно повышать уровень доверия к процессам разработки и сборки программного обеспечения. Ключевые направления: защита конвейера сборки, контроль происхождения артефактов, воспроизведение сборки и криптографическая верификация компонентов.
OpenSSF (Open Source Security Foundation) — объединяет крупнейших участников open source-сообщества и разрабатывает рекомендации по повышению безопасности программного обеспечения. Фреймворк OpenSSF Scorecard оценивает практики безопасности репозитория: Code Review, подпись коммитов, защиту веток и так далее.
Очевидно, что популярность проекта, количество звезд в репозитории или размер сообщества — не гарантии безопасности. Чтобы защититься от protestware и других угроз на цепочку поставок программного обеспечения, контролировать нужно весь сторонний код, независимо от его известности и происхождения. Причем подход должен быть комплексным: анализ open source, композиционный, статический и динамический анализ, контроль происхождения артефактов, организационные меры по управлению зависимостями.
Несложно проследить, что вредоносная функциональность может появляться в доверенных open source компонентах, которые используются разными компаниями в разных странах. Это еще одно напоминание о том, как сильно безопасность современного ПО связана с используемыми зависимостями.