Привет, Хабр! Меня зовут Владимир Исабеков, я работаю в Swordfish Security, где занимаюсь динамическим анализом приложений. Сегодня мы поговорим о таком явлении, как Protestware, когда вредоносный код встраивается в открытые программные компоненты. В статье разберем нюансы «протестного ПО» и как от него защититься с помощью безопасной разработки.
Что такое Protestware?
Термин произошел от слов protest (протест) и software (ПО). Он возник, когда по политическим причинам разработчики стали внедрять в программное обеспечение зловредный код. Россия столкнулась с этим явлением в начале 2022 года, проблема затронула как приложения, так и пользователей.
Protestware встречается в пакетах с открытым исходным кодом в виде закладок, в которых можно встретить различные протестные лозунги и призывы. Этим явление, к сожалению, не ограничивается, есть и другие неприятные атаки:
Malware – вредоносная программа, которая несанкционированно проникает в технику с целью нанесения вреда компьютеру и его владельцу
DDOS – способ заблокировать работу сайта путем подачи большого количества запросов, превышающих пропускную способность сети
блокировка доступа к сервису клиентов с определенным IP-адресом
Чем опасны «протестные ПО»?
В первую очередь тем, что они действуют не только в момент работы или сборки приложения, но и во время инсталляции пакета.
Пользователь может наткнуться на Protestware, даже не подозревая об этом. Рассмотрим популярный пакет «es5-ext» на GitHub, который имеет порядка 6 млн. скачиваний. Он может быть использован для улучшения функциональности и производительности вашего кода на JavaScript. Обычно «es5-ext» включается в проект через менеджер пакетов NPM (от Node.js) или YARN (от Facebook) и используется в коде через директиву Import или Require(). В одном из коммитов обнаружили, что пакет определяет тайм-зону, в которой он работает.
Как только он понимает, что попал в российский часовой пояс, то начинает выводить слоганы политического характера.
В поисках Protestware
И вот перед нами стоит два основных вопроса: как и где искать Protestware? Если в компании налажен процесс безопасной разработки, то всегда будет проще понять, какие зависимости используются в проекте. С этим поможет SCA (Software Composition Analysis). Это сканирование исходного кода или скомпилированных бинарных файлов приложения, позволяющее отслеживать и идентифицировать компоненты с известными уязвимостями и проблемами безопасности. Для России эта практика особенно актуальна, поэтому, если ваша компания еще не использует SCA-анализ, стоит провести инвентаризацию всех имеющихся OpenSource-пакетов.
Здесь на помощь приходит SBOM (Software Bill Of Materials). Это спецификация, содержащая информацию о компонентах программного обеспечения: названия, версии, лицензии и другие элементы, необходимые для создания и использования ПО. С помощью этого списка можно получить все зависимости с версиями пакетов, что упрощает анализ используемых файлов с открытым исходным кодом. Существует несколько стандартов SBOM, одни из самых известных – SPDX и CycloneDX.
Разведка по открытым источникам
После того, как мы определились что искать, встает вопрос, как же обнаружить пакеты с Protestware. В первую очередь нужно использовать OSINT (Open Source Intelligence) – это сбор информации из открытых источников: интернет, книги, газеты и журналы и др. Можно найти используемые пакеты в списках известных Protestware. Есть даже сообщество, которое собирает все известные файлы, содержащие вредоносный код протеста. Также можно изучить страницу пакета на GitHub и проверить, нет ли на ней каких-либо лозунгов и призывов.
Стоит обратить внимание также и на мейнтенеров, которые поддерживают зависимости вашего приложения: не размещают ли они баннеры и посты политического характера в своих профилях в GitHub или соцсетях? Для этого можно использовать API или парсинг страницы на слова-триггеры, автоматизировав таким образом проверки. На основании всех этих данных можно оценить уровень вредоносности пакета и принять решение о его использовании в разработке. Например, если на странице разработчика присутствует баннер, то следует обратить более пристальное внимание на сам пакет.
SAST
Следующий этап поиска – SAST (Static Application Security Testing). Это метод тестирования безопасности приложений с целью обнаружения уязвимостей в коде без его запуска. Если код содержит функции определения используемой языковой локали, IP- или тайм-зоны, необходим статический анализ. Для каждого языка можно выделить функции и написать определенные кастомные правила – пользовательские настройки, позволяющие направить работу анализатора на конкретные задачи проекта. Пример таких правил:
IP
(if)((?=.*(\w+)\((ip|ip_.*|.*_ip)\))|.*(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}).*
TIME ZONE
(.*)(?=.*(if))(?=.*((\w+)\((.*ZONE*.|.*zone.*|.*timezone*.|.*TIMEZONES*.|.*TIMEZONE*.)))(?=.*(RU_|ru|SAMT|YEKT|IRKT|SAKT|OMST|KRAT|NOVT|EET|MSK|YAKT|VLAT|MAGT|SRET|ANAT|PETT|samt|yekt|irkt|sakt|omst|krat|novt|eet|msk|yakt|vlat|magt|sret|anat|pett)).*
LOCALE
(.*)(?=.*(if))(?=.*((\w+)\(.*\)))(?=.*(ru_|RU_)).*
Можно выделить два бесплатных хороших решения для написания подобных правил: CodeQL и Semgrep. Платные инструменты мы подробно разберем в следующей статье. Практика SAST также хорошо автоматизируется и легко встраивается в CI/CD, его результаты также можно рассматривать в рамках общего анализа пакета на вредоносность.
Песочница
Песочница (Sandbox) – это механизм для безопасного исполнения программ. Есть, опять же, отличные бесплатные решения для проверки компонентов на наличие недекларированных возможностей, Malware и других проблем: Cuckoo Sandbox и Package Analysis. Данные песочницы ориентированы и для поиска Protestware. С их помощью в изолированную среду можно скачать пакет и анализировать:
Какие команды запускаются
Какие файлы необходимы для анализа
Какие запросы направляются вне системы По результатам мониторинга мы получаем отчет со всеми подозрительными действиями пакета.
Анализ результатов
В ходе всех проверок формируется скоринг, на основании которого принимается решение о допустимости использования отдельного пакета в разработке.
На основании описанных методик можно сформировать пайплайн для поиска Protestware или внедрить проверки в уже существующий. Далее, в зависимости от инцидента, нужно действовать в соответствии с правилами безопасности. Например, если мейнтейнер конкретного пакета также сопровождает файлы из списка Protestware, требуется уделить особое внимание безопасности. Мы подготовили для вас несколько примеров по защите от «протестного ПО»:
Политика |
Действие |
---|---|
Пакет из списка известных Protestware |
Поместить в карантин |
Найдены сигнатурные срабатывания SAST |
Триаж AppSec-инженером |
Найдены недекларированные возможности |
Анализ поведения AppSec-инженером |
Вывод
В заключение хотелось бы сказать, что проблема Protestware в России спустя два года также актуальна. Но ставить «на паузу» все обновления пакетов, как сделали некоторые компании в 2022 году, не выход. Есть практики безопасной разработки, которые позволяют настроить, добавить или видоизменить несколько правил для анализа используемых пакетов. Можно проводить анализ на любом уровне зрелости компаний, начиная с проверки на Protestware по запросу от разработчиков и заканчивая внедрением в CI/CD. Если раньше вы не занимались этим вопросом, самое время начать, для этого есть все возможности.
Комментарии (27)
funca
28.11.2023 09:27+17Например, если на странице разработчика присутствует баннер, то следует обратить более пристальное внимание на сам пакет.
Я считаю, что добавлять закладки в софт это неприемлемо. Но ставить в один ряд ребят просто за то, что они обозначили свою позицию, это слишком неоднозначно для статьи на публичном ресурсе. Больше похоже на пропаганду. В плане конкретно безопасности такой совет вообще ни о чем - подавляющая масса всякого malware идёт безо всяких банеров.
olartamonov
28.11.2023 09:27Совершенно обычный скоринг рисков. Если люди склонны к громкому высказыванию своей политической позиции, особенно в непредназначенных для этого местах (а бизнесовый сайт или репа гитхаба — не предназначенные для этого места), то и вероятность реализации действий в соответствии с этой позицией для них выше среднего по населению.
На официальном языке совет называется «проявление должной осмотрительности по отношению к контрагенту».
phoenixbk
28.11.2023 09:27+17Да, высказывайте свою позицию только в специально огороженном для этого месте. Где-то мы уже это слышали...
dartraiden
28.11.2023 09:27+4На официальном языке совет называется
А на бытовом языке это называется анекдотом "у него есть член, значит, он потенциальный насильник".
репа гитхаба — не предназначенные для этого места
То, для чего не предназначена репа гитхаба, написано в правилах гитхаба.
MiraclePtr
28.11.2023 09:27+3Автор, не позорьтесь, скройте статью в черновики.
В первом же комментарии все правильно сказано, даже добавить нечего.
Magimir
28.11.2023 09:27+1Не понимаю возмущение некоторых пользователей. Данная статья описывает сам факт наличия дополнительных функций не относящихся напрямую к заявленному функционалу. Замените, условно, указанные в статье банеры на банеры с изображением частей тела. Ментейнер выразил позицию бодипозитива, что в этом такого? От этого проблема станет меньше? Хотите использовать такие пакеты - ваше право. Но знать об их наличии необходимо.
GRaAL
Ой, а шо случилось?
Типичное "If I ignore it maybe it will go away"
Вообще мне не передать словами как стало мерзко от статьи.
Всё, что вы подсветили - это не политические слоганы. Это обычные человеческие призывы. И я не увидел ничего вредоносного.
Пользуйтесь исконно русскими библиотеками, раз вам так неприятно, сделайте себе белый список хороших либ.
0mogol0
Речь о другом. Если ПО работает некорректно из-за установленного часового пояса или IP, это проблема. Её надо детектировать на раннем этапе.
И не важно, является ли это protestware, malware или чем-то ещё. Не работает, как должно - находим на раннем этапе и не допускаем до использования.
SemmZemm
А почему вы считаете, что оно работает некорректно. Я вот на хабр захожу не на рекламу VPS-серверов посмотреть, однако же вижу ее. Больше того, то, что я вижу, скорее всего зависит от моего IP. Человек из примера рассказывает о дате начала полномасштабного вторжения тоже вполне себе целевой аудитории.
0mogol0
На мой взгляд возможны три варианта:
1. Разработчик библиотеки объявляет, что начиная с такой-то версии библиотека не может быть использована пользователями из России / Израиля / Папуа Новой-Гвинеи итп. Дальше дело пользователя заметить это в changelog, и самостоятельно решать что делать - заморозить версию, сделать форк (если условия позволяют), перейти на другую библиотеку. Детектор таких изменений будет полезным для пользователя.
2. Разработчик молча реализует функционал, когда библиотека для "неправильных" пользователей выдаёт лозунги или возвращает 2*2=7, короче делает не то, что объявлено в документации. С моей т.з. это типичное malware, и оно должно детектиться не только внутренней системой конкретного пользователя, но и всеми открытыми системами. Так как нет никакой гарантии, что через полгода запрет не расширят, например, на Судан или США.
3. Разработчик ничего не меняет в логике работы, но помещает в своем профиле картинку / флаг / лозунг в поддержку одной из сторон конфликта. Здесь нет и не может быть никаких претензий к разработчику, но может быть использованно во внутренней системе сканирования, как фактор риска, что в дальнейшем разработчик может перейти к п.1 или 2.
Поэтому отвечая на ваш вопрос, если о изменившейся логике работы не сказано ясно в документации, то это значит, что библиотека работает некорректно (п.2) со всеми вытекающими.
SemmZemm
Тот код в es5-ext при установке пакета выдает статистику о смертях с обеих сторон. Пользователи конечного продукта, использующего пакет, ничего не увидят. Так что я не вижу тут изменения функционала.
Итого имеем одного разработчика из Украины с украинским флагом в профиле гитхаба и другого разработчика из Польши, который добавил довольно нейтральный текст, выводимый при установке пакета в определенных часовых поясах. И то, и другое ужас-ужас. Swordfish на страже безопасности.
Selenum Автор
Это были просто примеры. Зайдите на https://toxic-repos.ru/ и посмотрите, какие бывают последствия использования таких пакетов. Конструктивной критики подхода я не увидел ни в одном комментарии.
dartraiden
Конструктивная критика: разделять тех, кто выполняет вредоносные действия и тех, кто лишь обозначает свою позицию по какому-либо вопросу.
Посмотрел. Дварфы из Вархаммера с их Великой Книгой Гномьих Обид.
Selenum Автор
Так я и разделяю. Я говорю о том, что нужно обратить внимание на пакеты, мейнтейнеры которых выражают свою позицию. Никто ни на кого ярлыков не вешает. Вы бы лучше подумали о том, как все эти лозунги и позиции вредят OSS, нарушая базовые принципы находиться вне политики.
dartraiden
Я выражаю свою позицию на Хабре, моё ПО от этого стало опаснее? (кстати, если бы я хотел сделать кому-то очень больно, я бы не стал его об этом предупреждать баннерами и лозунгами, а встроил бы подлянку максимально незаметно, срабатывающую максимально случайным образом и максимально разрушительно).
Найти ПО от разработчика, не имеющего позиции, боюсь, станет практически невыполнимым квестом. Люди, негодяи такие, имеют мнение почти по любому вопросу...
Selenum Автор
Появился повод более внимательно изучать ваши коммиты. Я говорю здесь о минимизации рисков для людей, которые будут пользоваться пакетами, которые писали любители повыражать свои политические наклонности. А не о самих этих людях которые постят себе банеры и так делее - пусть делают что хотят. Но им постить это можно, а мне проверять их коммиты вы считаете не правильным. Я считаю неправильным дискриминировать людей по любым параметрам. За сим считаю полемику с вами законченной.
Заминусить мне карму за мнение, и кто получается тогда более обидчивый? Их борьба...
MiraclePtr
Я приложил свою руку к софту, которым в той или иной мере пользуется подавляющее большинство жителей России, пользователей Хабра и даже скорее всего вы. При этом я открыто выражаю свою политическую позицию и отношение к происходящим событиям, в том числе здесь, на Хабре. Срочно удалите всё ПО со своей машины (вы же не знаете, про что именно я говорю, да) и замените на православно-самописное. А то риски же, сами понимаете :)
0mogol0
честно говоря мне кажется разговор сместился не туда.
Т.е. читая я себе представлял это как аналог доработки системы скоринга банка. Ну т.е. у нас есть возможность добавить в скоринг информацию играет ли потенциальный заёмщик в казино и как активно - и собственно вопрос, как это сделать и что надо учесть (часто ли, на большие ли суммы).
Но дальше обсуждение пошло по принципу: а Вася имеет право играть в казино! да с этим как бы никто не спорит, более того, я лично считаю, что даже в самом факте игры в казино нет ничего, что запрещало бы Васе получить кредит в банке.
Но вот при совпадении нескольких факторов (играет часто, по крупному, регулярно проигрывается, заложил дом и машину) его игра может стать фактором ужесточения условий кредитования или отказа в кредите.
И вопрос в том, стоит ли добавлять такой компонент в скоринг систему, поможет он сделать выдачу кредитов более надёжной?
Xop
А коммиты турбопатриотов постящих баннеры с z-свастикой вы тоже более подробно изучаете? А то по статье ощущение, что вы фокусируетесь исключительно на любителях желто-голубого, и вот это уже выглядит как предвзятость.
pythe
"Всё, что вы подсветили - это не политические слоганы. Это обычные человеческие призывы."
Ой, а просветите, плиз, в каких ещё конфликтах отметились эти обычные человеческие призывы? Сербия? Ирак? Афганистан? Сирия? Газа? Конфликтов-то много, вроде есть где приложиться...
MiraclePtr
Что значит "в каких еще конфликтах отметились призывы"? Вы можете сформировать вопрос четко и на русском языке?
pythe
О, интеллект детектед... искусственный. Русского языка не понимает, но требует формулировок.
Поясняю. Людям действительно свойственно против чего-нибудь протестовать. Это понятно. Например - против войны. Это даже похвально. За последние десять лет в мире произошла целая куча войн. Внимание, вопрос: какой ещё войне отметился protestware?
Ну или в каком другом движе?
MiraclePtr
А, ну то есть вопрос с первого раза внятно сформулировать не можете вы, а искуственный интеллект тут почему-то я, окей.
"В каком еще другом движе" - ну, например, в текущем израильско-палестинском конфликте. На том же гитхабе в довольно большом количестве репов появились всякие "Stand with Palestine" (пример), люди даже специально баннеры для удобной вставки в гитхабовские файлы разработали. Некоторые проекты явно запрещают в лицензии использовать их софт людям, находящимся в или связанным с Израилем. Есть специальные npm-пакеты, который любой желающий может добавить к себе в зависимости, который при определении геолокации Израиля по IP выводит призывы, например https://www.npmjs.com/package/e2eakarev?activeTab=code
Ну и тут, само собой, надо делать поправку на статистику. Сильно подозреваю, что в Палестине, Косово, Иране и Афганистане все-таки гораздо меньше программистов - разработчиков сверхпопулярных библиотек, чем в Украине, России и соседних с ней странах. А людей всегда гораздо больше заботит то что происходит рядом с ними, а не где-то там на другом конце земного шара.
garwall
Сдается мне, если такие призывы выскочат за внутренний периметр и вылезут где-то, скажем, на сайте, то вполне можно получить дело по стуку от озабоченных граждан или конкурентов.
SemmZemm
Во-первых, Вам не кажется, что в описанной Вами ситуации проблема не в npm-пакете, а в законах и правоприменении? Я уж не говорю про внешнюю политику.
Во-вторых, оно не вылезает в данном конкретном случае.
В-третьих, была не так давно волна дефейсов. Даже при имеющем мало общего со здравым смыслом нынешним законодательством посадок и штрафов за них не было. Блокировали до устранения неугодной государству информации с сайтов.