Исследователи Koi Security сообщили о длительной кампании PhantomRaven, в рамках которой с августа 2024 года в реестр npm было загружено 126 вредоносных пакетов с совокупным числом загрузок свыше 86 000. На момент публикации отчета около 80 пакетов оставались активными. Ключевая особенность операции — использование механизма удаленных динамических зависимостей (Remote Dynamic Dependencies, RDD), который помогает атакующим обходить привычные средства детектирования и статического анализа.
Как работает RDD и почему его сложно обнаружить
В традиционном сценарии все зависимости пакета явно перечислены в манифесте package.json и загружаются из доверенной инфраструктуры npm. RDD меняет модель угроз: пакет может автоматически подтягивать и исполнять код с внешних URL при установке, включая незашифрованный HTTP. При этом в манифесте формально может отображаться ноль зависимостей, что вводит в заблуждение разработчиков и инструменты проверки.
Когда пользователь запускает npm install, вредоносный пакет инициирует скрытую загрузку полезной нагрузки с контролируемого злоумышленниками сервера и немедленно её исполняет. Взаимодействие пользователя не требуется, а статический анализ не видит удаленных динамических вызовов, поскольку фактическая зависимость не фиксируется в lock-файле и не проходит через реестр npm.
Таргетирование, нереплицируемость и методы эксфильтрации
Согласно Koi Security, вредоносный код подгружается при каждой установке заново и не кешируется. Это позволяет операторам PhantomRaven настраивать таргетированные ответы: проверять IP-адреса, возвращать «чистый» ответ исследователям ИБ, подсовывать другой пейлоад корпоративным сетям или облачным окружениям. Такой подход усложняет репликацию атаки и форензику.
После первичного компрометационного этапа малварь собирает детальную телеметрию о системе жертвы и похищает чувствительные данные, включая токены доступа. Эти токены могут стать точкой входа для атак на цепочки поставок — внедрения вредоносного кода в легитимные репозитории и CI/CD-пайплайны. Экфильтрация реализована сразу несколькими каналами для надежности: через HTTP GET с данными в URL, HTTP POST в формате JSON и по WebSocket-соединениям.
Маскировка под популярные экосистемы и феномен slopsquatting
Часть вредоносных пакетов маскировалась под инструменты экосистем, связанных с GitLab и Apache, что повышает доверие и CTR при установке. Дополнительно операторы используют slopsquatting — эксплуатацию галлюцинаций LLM-ассистентов. Разработчики нередко запрашивают у ИИ «правильные» зависимости, а модели иногда «выдумывают» правдоподобные, но несуществующие названия. Преступники мониторят такие рекомендации и оперативно регистрируют соответствующие пакеты в npm, превращая совет ИИ в канал доставки малвари.
Риски для цепочки поставок и инструментов разработки
RDD подрывает традиционные подходы к управлению зависимостями: содержимое lock-файла и вывод статических сканеров не отражают фактических сторонних компонентов, загружаемых на лету. В сборочной инфраструктуре это особенно опасно: компрометация билд-агентов, секретов окружения и артефактов может быстро привести к масштабным supply chain-атакам. Как подчеркивают исследователи, удаленные динамические зависимости остаются «невидимыми» для статического анализа и требуют изменений в процессах и политике контроля.
Практические рекомендации по защите
Минимизируйте слепые зоны установки. В CI/CD по умолчанию используйте режимы без исполняемых скриптов (например, npm ci с параметром игнорирования скриптов), а также окружения с ограниченным доступом в интернет, разрешая только доверенные домены реестра по HTTPS.
Ужесточайте сетевые политики. Блокируйте исходящие HTTP-запросы и запрещайте загрузку кода из непроверенных внешних URL на этапах сборки. Применяйте egress-контроль и прокси с инспекцией TLS для фиксации аномалий.
Управляйте зависимостями прозрачно. Проводите ручную и автоматическую валидацию новых пакетов: происхождение, репутация автора, журнал релизов, наличие исходников. Отслеживайте typosquatting/slopsquatting, внедрите локальный зеркальный реестр или внутреннее кэширование доверенных пакетов.
Защитите секреты и токены. Используйте краткоживущие токены и минимально необходимые права, регулярно проводите ротацию, включайте сканирование секретов, отделяйте сборочные среды от рабочих.
Повышайте осведомленность команд. Не полагайтесь на рекомендации LLM при выборе пакетов без последующей верификации. Обучайте разработчиков распознавать признаки подозрительных модулей и неуточненных внешних загрузок.
Кампания PhantomRaven демонстрирует, что злоумышленники эффективно используют архитектурные особенности экосистемы npm и поведенческие уязвимости разработчиков. Усиление сетевых и процессных контролей вокруг установки зависимостей, переход к принципу «минимально необходимого интернета» для сборок и дисциплина в управлении секретами значительно снижают риск. Проверьте свои пайплайны сегодня: отключите лишние скрипты, ограничьте внешние подключения и внедрите процедуру независимой проверки новых пакетов — это поможет предотвратить следующий инцидент в вашей цепочке поставок.