Исследователи компании Socket выявили в реестре npm вредоносный пакет fezbox, задействующий нетипичную технику доставки полезной нагрузки: обфусцированный JavaScript прячется внутри QR‑изображения, загружаемого с сервера злоумышленников. По данным специалистов, пакет был скачан не менее 327 раз до его удаления администраторами npm, что подчеркивает устойчивую актуальность атак на цепочки поставок открытого ПО.
Что произошло: вредоносный пакет в экосистеме JavaScript
По информации Socket, fezbox содержит скрытые инструкции для получения JPG‑файла с QR‑кодом и последующей его обработки, в результате чего запускается вторая стадия атаки — выполнение обфусцированного кода. Издание BleepingComputer уточняет, что основная вредоносная логика сосредоточена в dist/fezbox.cjs (на примере версии 1.3.0). Файл минифицирован, однако после форматирования поведение кода становится нагляднее для анализа.
Как работает двухэтапная схема с QR‑кодом
Этап 1: пакет инициирует загрузку необычно “плотного” QR‑изображения. Такой код не получится считать обычной камерой смартфона, он предназначен для машинного парсинга самим пакетом и содержит обфусцированные инструкции.
Этап 2: после задержки и дополнительных проверок код извлекается из QR‑картинки и исполняется. Вредоносная логика ориентирована на кражу cookie через document.cookie, что потенциально дает доступ к сессиям пользователей и конфиденциальным данным веб‑приложений.
Техника уклонения и маскировки
Проверка среды и задержка выполнения
Исследователи отмечают, что malvertising‑логика оценивает, запущен ли код в среде разработки или виртуализированном окружении, снижая риск детектирования. Если ограничений не выявлено, спустя 120 секунд инициируется парсинг и исполнение кода из QR‑изображения.
Сокрытие URL и реверс строк
URL для загрузки данных хранится в обратном порядке — это простая, но эффективная техника обхода статического анализа, ориентированного на шаблоны вроде http(s)://. Аналогично применяется реверс строк для скрытия чувствительных идентификаторов: так, последовательность “drowssap” реконструируется в “password”.
Кража данных и канал эксфильтрации
Обфусцированная полезная нагрузка извлекает cookie через document.cookie и пытается получить имя пользователя и пароль. Если эти поля присутствуют, данные отправляются POST‑запросом по HTTPS на https://my-nest-app-production[.]up[.]railway[.]app/users. В противном случае выполнение завершается без шумных действий, что затрудняет обнаружение.
Почему это работает и кому угрожает
Использование QR‑изображений как носителя кода помогает злоумышленникам маскировать вредоносный трафик под безобидные запросы к картинкам. Для прокси, фильтров и некоторых систем мониторинга это выглядит как типовой загрузчик ресурсов. Учитывая популярность npm и автоматизацию сборок фронтенд‑проектов, риск особенно высок для команд, которые не ограничивают выполнение скриптов из зависимостей или включают внешние пакеты в клиентский бандл.
Рекомендации по защите разработчиков и организаций
Минимизируйте доверие к зависимостям: фиксируйте версии (lockfile), используйте проверенные зеркала и SCA‑инструменты, включайте анализ пост‑инсталляционных скриптов. Рассмотрите запуск сборок с ограничениями на выполнение сторонних скриптов.
Ужесточайте защиту cookie: помечайте их флагами HttpOnly, Secure, SameSite. HttpOnly делает кражу через document.cookie невозможной даже при XSS‑подобных сценариях.
Отслеживайте аномалии трафика: обращайте внимание на неожиданные запросы к JPG‑файлам, после которых наблюдается выполнение динамического кода или активность POST на неизвестные домены.
Проводите ревизию цепочки поставок: периодически пересматривайте список зависимостей, удаляйте неиспользуемые пакеты, внедряйте принципы минимально необходимого набора библиотек.
Усиление контроля в CI/CD: изолируйте сборочные контуры, используйте политики deny‑by‑default для исходящих соединений, логируйте сетевые обращения и блокируйте подозрительные эндпоинты.
Случай с fezbox демонстрирует эволюцию злоумышленников: перенос полезной нагрузки в QR‑картинку усложняет статический анализ и маскирует сетевую активность. Командам разработки и ИБ стоит ускорить внедрение практик безопасной разработки, усилить контроль зависимостей и конфигураций cookie. А если ваш проект мог использовать fezbox, проверьте логи, сетевые обращения к Railway.app и убедитесь, что сессионные cookie защищены флагом HttpOnly.