Доверие к популярному открытому проекту превратилось в канал заражения. Злоумышленники скомпрометировали Deep-Live-Cam, приложение для замены лиц в реальном времени с 96,6 тыс. звёзд на GitHub, и незаметно добавили в его зависимости вредоносный код для кражи криптовалюты.
Атака началась 8 сентября, когда в основную ветку проекта попал коммит, изменивший сразу 18 записей в requirements.txt. Среди них появилась поддельная версия популярной библиотеки Requests, загружавшаяся не из обычного каталога Python, а из репозитория злоумышленников. Подобные атаки на цепочку поставок особенно опасны тем, что вредонос получает доверие вместе с легитимным проектом.
Поддельный пакет сохранил название requests и метаданные настоящего проекта, поэтому при поверхностной проверке зависимость выглядела привычно. В setup.py злоумышленники спрятали код после 434 пробелов, фактически убрав вредоносную часть за пределы видимой области многих редакторов и инструментов просмотра изменений. Дополнительный визуальный шум создавали переменные с китайскими и японскими символами.
Опасный код запускался уже во время установки зависимости через setuptools. Пользователю даже не требовалось запускать Deep-Live-Cam после установки. Похожая схема с внедрением кода в популярные Python-проекты уже встречалась в кампании ForceMemo, где злоумышленники также получали контроль над аккаунтами разработчиков и меняли файлы в доверенных репозиториях.
Загрузчик определял операционную систему и продолжал работу на Windows и macOS. Следующий этап хакеры спрятали внутри страницы Telegraph, откуда скрипт извлекал несколько слоёв закодированного Python-кода. Финальная нагрузка постоянно проверяла буфер обмена и распознавала адреса Bitcoin, Ethereum, Tron и Solana.
При обнаружении криптовалютного адреса программа незаметно заменяла его реквизитами злоумышленников. Пользователь мог скопировать правильный адрес, вставить уже подменённый и самостоятельно подтвердить перевод. Аналогичная подмена буфера стала настолько распространённой угрозой, что Opera летом добавила отдельный механизм Hijack Protection для отслеживания подобных манипуляций.
Вредонос также пытался пережить перезагрузку компьютера. В Windows программа добавляла запись SysHelper в раздел автозапуска реестра, а на macOS создавала LaunchAgent com.user.syshelper.plist. Поэтому простого отката заражённого requirements.txt недостаточно. Если вредонос успел выполниться, загруженные файлы и механизм автозапуска могли остаться в системе.
Вредоносный коммит находился в основной ветке около 9 часов 39 минут. Разработчик Deep-Live-Cam сообщил о необычном доступе к аккаунту даже при включённой двухфакторной аутентификации, после чего сменил пароль и ключи. По имеющимся данным нельзя определить, воспользовались ли атакующие украденным токеном, SSH-ключом или активной сессией.
Команда SafeDep в разборе атаки подчёркивает, что найденные артефакты подтверждают вредоносное поведение, но не позволяют оценить число заражённых компьютеров или размер возможных потерь. Факт наличия адресов злоумышленников в коде также не доказывает, что на них действительно поступали похищенные средства.
Весной похожий сценарий затронул открытый сканер Checkmarx KICS. Злоумышленники подменили инструмент и использовали доверенный проект для кражи паролей и ключей из рабочих сред разработчиков.
В мае SafeDep зафиксировала ещё более масштабную кампанию Megalodon. Всего за несколько часов вредоносные коммиты попали в 5561 репозиторий GitHub, а целью атакующих стали секреты из систем сборки и CI/CD.
Летом похожая проблема проявилась уже в экосистеме npm. Червь Shai-Hulud заразил 444 пакета с совокупной аудиторией около двух миллиардов загрузок в месяц, при этом вредоносный код мог отсутствовать в исходном GitHub-репозитории.
