QR-код превратился в полноценный контейнер для исполнения вредоносного скрипта.
Команда Socket Threat Research обнаружила новый вредоносный NPM-пакет под названием fezbox, опубликованный пользователем с ником janedu. Пакет позиционируется как безобидная библиотека, но внутри скрыт необычный и технически изощренный вредоносный код: он использует QR-код как носитель стеганографически зашифрованной полезной нагрузки.
fezbox замаскирован под типичную TypeScript/JavaScript-библиотеку с утилитами, аккуратно оформленную в духе лучших практик: с тестами, типами, обещаниями высокой производительности и модульной структурой. Всё это создаёт иллюзию добросовестного open-source-проекта. В описании отдельно подчёркивается наличие QR-модуля, якобы предназначенного для генерации и парсинга QR-кодов. Однако README ни словом не упоминает, что на самом деле при подключении библиотеки загружается QR-код с удалённого сервера и выполняется скрытый в нём JavaScript-код. Эта скрытность реализована через многоуровневую обфускацию.
Первый уровень маскировки — это инвертированный URL. Адрес изображения QR-кода в исходном коде представлен в обратном порядке, что затрудняет автоматическое обнаружение. Второй уровень — сам QR-код, в который внедрён вредоносный скрипт. Третий — обфусцированный JavaScript внутри этого QR, использующий Unicode-последовательности и бессмысленные переменные.
Сам скрипт активируется только при соблюдении двух условий: во-первых, он не должен запускаться в режиме разработки (что определяется функцией isDevelopment()), а во-вторых, он срабатывает лишь с вероятностью 1/3. Эта случайность встроена намеренно — как защита от песочниц и систем статического анализа. Если окружение подходит и проверка на chance(2/3) пройдена, спустя 120 секунд после загрузки библиотеки скрипт инициирует обращение к инвертированному URL, загружает QR-код, извлекает из него код и исполняет его на стороне клиента.
Важной особенностью вредоносной логики является наличие строки "idbgha", вставленной в код и никак не влияющей на поведение. Это классический приём антифорензики, направленный на то, чтобы ввести исследователей в заблуждение и усложнить анализ. Сама полезная нагрузка, закодированная в QR-коде, представляет собой обфусцированную функцию, извлекающую значения cookies с именами username и password (последний через инвертированную строку drowssap), а затем отправляющую эти данные на сервер злоумышленника. Передача происходит в формате JSON, через защищённый HTTPS-канал, что ещё больше усложняет обнаружение.
Функция получения значения cookie (getC(name)) реализована в максимально непрозрачном виде: все строки представлены через шестнадцатеричные Unicode-коды — от слова cookie до внутренних методов split и find. В итоге чтение cookie выглядит безобидно, но при этом затруднено для простого анализа. На фоне всего этого QR-код превращается не в обычный переносчик URL или данных, а в полноценный контейнер для зашифрованного и исполняемого JavaScript-кода. Это использование QR в стеганографической роли делает fezbox особенно опасным: визуально картинка выглядит как обычный код, но внутри неё скрыт полноценный вредоносный сценарий.
С технической точки зрения это пример трёхслойной обфускации: сначала скрыт URL, затем код упакован в изображение, а затем дополнительно шифруется внутри изображения. Такая глубина маскировки говорит о высоком уровне подготовки атакующего и явно рассчитана на обход как автоматических средств анализа зависимостей, так и ручного аудита. При этом fezbox содержит ещё один характерный признак вредоносной активности — избирательное поведение. Он не исполняется в среде разработки и запускается не сразу, а с задержкой в 2 минуты. Всё это делает его практически невидимым в короткоживущих тестовых окружениях и песочницах CI/CD.
Socket подчёркивает, что подобные атаки невозможно выявить простым просмотром исходного кода. Только специализированные инструменты, отслеживающие сетевые вызовы, инвертированные строки, подозрительное поведение и попытки доступа к cookies, способны поймать такие пакеты до того, как они попадут в продакшн. Именно поэтому fezbox классифицирован как вредоносное ПО, использующее нестандартные методы скрытия кода и кражи данных.
На данный момент fezbox остаётся доступным на npm, несмотря на обращения Socket о его удалении и блокировке аккаунта автора. Данный случай показывает, насколько гибкими и креативными становятся злоумышленники. Даже QR-код, который кажется визуально безопасным, может стать точкой входа для сложной клиентской атаки. А npm, как и другие экосистемы с открытым доступом к публикации пакетов, остаётся уязвимым звеном при отсутствии глубокой проверки зависимостей.