Під час планового моніторингу активності реєстру NPM фахівцями Mend.io було виявлено підозрілий патерн, пов’язаний із користувачем sdjkals, який опублікував 10 пакетів із файлами, що виглядають як шрифти WOFF2. Первинний аналіз свідчить, що це не легітимні шрифтові ресурси.
Пакети опубліковані в межах неймспейсу @sdjkals/*. Номери версій сягають 1.0.1594 та 1.0.1912, що вказує на надзвичайно швидкі цикли перевипуску – нові версії публікуються кожні кілька хвилин. Кожен пакет містить 31–33 файли з шаблоном назви segment_NNNNNN.woff2. Розмір окремого сегмента становить 2–3 МБ, а загальний розмір пакета – близько 90 МБ. Загалом у всіх зафіксованих пакетах налічується понад 284 сегментні файли.
Структура пакетів у всіх випадках однакова:
- мінімальний package.json із загальним описом “Assets”,
- простий index.js, який експортує посилання на CSS для шрифтів,
- сегментні файли.
У заголовках сегментів наявні коректні магічні байти (magic bytes) WOFF2, однак інструменти парсингу шрифтів відхиляють їх як некоректні. Бінарний аналіз свідчить, що дані можуть бути зашифровані або стиснені з використанням нестандартного формату.
Аналіз сегментації корисного навантаження
Розподіл сегментів між пакетами свідчить про навмисну фрагментацію:
@sdjkals/lib-v1-ifmt → segments 000128-000158
@sdjkals/media-static-pro → segments 000283-000313
@sdjkals/adapter-core-v1 → segments 000408-000438
@sdjkals/data-dist-387w → segments 000656-000686
@sdjkals/assets-loader-nse4 → segments 000717-000747
@sdjkals/data-lib-kernel → segments 000748-000779
@sdjkals/shim-theme-v2 → segments 000842-000873
@sdjkals/font-core-v1 → segments 001025-001056
@sdjkals/adapter-theme-kernel → segments 001059-001090
Помітні розриви в нумерації сегментів між різними пакетами. Це вказує на архітектуру розподіленого корисного навантаження, за якої повний набір даних необхідно зібрати шляхом встановлення кількох пакетів. Такий підхід зазвичай застосовується для обходу автоматизованих систем виявлення, що аналізують кожен пакет ізольовано.
Аномальними є і самі номери версій. Пакет @sdjkals/data-lib-kernel уже досяг v1.0.1912, а інші пакети мають так само неприродно «роздуті» версії (v1.0.1594, v1.0.1614). Надшвидка зміна версій виконує кілька функцій: ускладнює відстеження змістовних змін, створює шум у системах моніторингу реєстру та потенційно є зловживанням інфраструктурою зберігання і пропускної здатності NPM.
Оцінка загроз
Цей патерн створює кілька проблем з погляду безпеки:
- Зловживання інфраструктурою: зловмисник використовує CDN та сховище NPM для розміщення майже 900 ГБ обфускованих даних у складі кількох пакетів, а безперервний перевипуск додатково підсилює споживання ресурсів.
- Розподілення корисного навантаження: сегментована архітектура є характерною для багатоетапних систем доставлення корисного навантаження. Розподіляючи сегменти між пакетами з непослідовною нумерацією, зловмисник ускладнює статичний аналіз і зменшує ймовірність того, що автоматизовані засоби виявлення позначать будь-який окремий пакет як шкідливий.
- Ухилення від виявлення: окремі пакети виглядають нешкідливими, вони містять лише файли шрифтів і мінімальний JavaScript. Відсутні очевидні «гачки» для виконання коду, підозрілі мережеві запити чи обфускований код. Через це їх складно позначити як підозрілі за допомогою традиційних евристик.
- Засмічення сигналів: стрімке збільшення версій створює шум у системах моніторингу безпеки, які відстежують оновлення пакетів. Це потенційно може маскувати іншу зловмисну активність або перевантажувати чергу сповіщень і знижувати увагу до критичних сигналів.
Висновок
Рівень складності цієї операції (розподілене корисне навантаження, імітація форматів файлів, швидка ітерація) вказує або на proof-of-concept методик атак на ланцюг постачання, або на активне зловживання інфраструктурою для зберігання та розповсюдження даних.







