Екосистема відкритого програмного забезпечення знову опинилася в центрі уваги: дослідники компанії Socket виявили на платформі npm сім шкідливих пакетів, які використовували хмарний сервіс Adspect для приховування активності та перенаправлення користувачів на криптомошенницькі ресурси. Інцидент показує, наскільки легко інструменти антибот-захисту можуть перетворюватися на механізм cloaking у руках зловмисників і як це поглиблює ризики для ланцюга постачання ПЗ (software supply chain).
Як зловмисники скомпрометували npm за допомогою Adspect
Усі сім пакетів були опубліковані в період з вересня по листопад 2025 року з облікового запису розробника під псевдонімом dino_reborn (email geneboo@proton[.]me). Зовні вони позиціонувалися як звичайні залежності для веб-проєктів, що підвищувало ймовірність їх інтеграції до реальних застосунків без додаткових підозр.
Хмарний сервіс Adspect офіційно рекламується як платформа для фільтрації трафіку та захисту від ботів. У межах цієї кампанії його застосували протилежним чином — як інструмент cloaking, тобто відокремлення «корисного» для зловмисника трафіку від небажаного (сканери, дослідники, аналітичні системи) та приховування шкідливої логіки від систем моніторингу.
Зі знайдених семи пакетів шість містили шкідливий JavaScript-код, тоді як сьомий, під назвою signals-embed, слугував приманкою: формував початкову сторінку, з якої запускався сценарій атаки.
Adspect як елемент схеми cloaking
Зібрані відвідувачем технічні параметри середовища надсилалися на сервери зловмисників та в API Adspect. На основі цих даних сервіс вирішував, який контент показати: реальній жертві — шкідливий ланцюжок із криптоскамом, досліднику безпеки — нейтральну сторінку, що маскує справжню мету кампанії.
Технічний аналіз шкідливого JavaScript у npm-пакетах
Автоматичний запуск через IIFE у браузері
Шкідлива частина складалася приблизно з 39 КБ JavaScript-коду, упакованого в конструкцію IIFE (Immediately Invoked Function Expression) — функцію, яка виконується одразу після оголошення. Це означало, що достатньо було підключити залежність до фронтенд-проєкту, щоб скрипт автоматично завантажувався й запускався в браузері користувача без жодних явних дій з боку розробника.
Протидія аналізу та виявленню
Код очевидно проєктувався з урахуванням протидії аналізу та реверс-інжинірингу. Він:
- блокував правий клік миші;
- відключав відкриття інструментів розробника через клавішу F12;
- перехоплював комбінації Ctrl+U (перегляд вихідного коду сторінки) та Ctrl+Shift+I (DevTools);
- при виявленні відкритих DevTools примусово перезавантажував сторінку.
Подібні прийоми давно застосовуються у фішингових і шахрайських кампаніях, оскільки ускладнюють роботу аналітиків, систем динамічного аналізу та автоматизованих сканерів веб-контенту.
Фингерпринтинг браузера та відбір потенційних жертв
Паралельно скрипт виконував активний фингерпринтинг браузера — збирав характеристики середовища користувача для побудови профілю. Серед іншого фіксувалися:
- user agent браузера;
- мовні налаштування;
- використовуваний протокол (HTTP/HTTPS);
- домен (host) і реферер;
- повний URI та параметри запиту;
- типи кодування та інші технічні параметри.
Ці метадані передавалися на проксі-сервер зловмисників, а реальна IP-адреса користувача — в API Adspect. На основі сукупності ознак система класифікувала відвідувача як «цінну» жертву або як потенційного дослідника / бота та обирала відповідний сценарій.
Ланцюжок атаки: фальшива CAPTCHA та криптомошенницькі сайти
Якщо профіль користувача відповідав критеріям зловмисників, його перенаправляли на підроблену сторінку з CAPTCHA, стилізовану під тематику криптовалют з використанням логотипів Ethereum або Solana. Візуально це нагадувало стандартну перевірку «Я не робот».
Підтвердження CAPTCHA ініціювало відкриття в новій вкладці спеціально сформованого URL сервісу Adspect. У результаті перехід на криптомошенницький сайт виглядав для браузера й деяких антифрод-систем як користувацька дія, а не автоматичне перенаправлення скриптом, що ускладнювало виявлення шахрайства.
Якщо ж логіка фингерпринтингу ідентифікувала відвідувача як дослідника кібербезпеки або автоматизований сканер, замість шкідливого сценарію відображалася нешкідлива підставна сторінка, яка нібито належала компанії Offlido. Такий підхід знижував шанси на швидке викриття й блокування інфраструктури атаки.
Ризики для ланцюга постачання ПЗ та безпеки npm
Цей інцидент є черговою ілюстрацією того, як атаки на ланцюг постачання ПЗ стають одним з ключових векторів компрометації. Замість прямого зламу окремих організацій зловмисники проникають у популярні екосистеми пакетів, розраховуючи на довіру розробників до відкритих репозиторіїв та автоматичне оновлення залежностей.
За публічними звітами провайдерів рішень для безпеки розробки (зокрема Sonatype, Snyk, Checkmarx), щороку в екосистемах на кшталт npm, PyPI, Maven виявляються тисячі шкідливих або скомпрометованих пакетів. Випадок із Adspect лише підкреслює, що до ризиків додається ще й зловживання легальними сервісами для обману засобів захисту.
Після публікації звіту Socket усі сім виявлених пакетів були оперативно видалені з репозиторію npm. Водночас факт їх присутності протягом кількох місяців демонструє обмеженість ручної та вибіркової модерації та потребу в більш жорстких процесах валідації пакунків.
Щоб знизити подібні ризики, доцільно комбінувати кілька підходів: використовувати спеціалізовані інструменти аналізу залежностей (SCA-рішення), фіксувати версії пакетів за допомогою lock-файлів, проводити регулярний аудит використовуваних бібліотек, впроваджувати принципи Zero Trust щодо стороннього коду й розмежовувати права доступу для збірки та виконання застосунків.
Чим системніше організації та окремі розробники підходять до безпеки ланцюга постачання ПЗ, тим складніше зловмисникам перетворювати легітимні платформи — такі як npm чи сервіси на кшталт Adspect — на канал доставки шкідливого коду та криптомошенницьких кампаній. Вартим кроком уже сьогодні є перегляд поточних залежностей, впровадження автоматизованих перевірок та підвищення обізнаності команд розробки щодо тактик cloaking, фингерпринтингу й атак на екосистеми відкритого ПЗ.