web3
Yesterday

Web3. Безопасность. Массовый взлом NPM-пакетов

NPM-атака

Перевод + анализ

Для начала я представлю краткий перевод-пересказ анализа атаки: jdstaerk.substack.com/p/we-just-found-malicious-code-in-the, а затем, дополню его другими аспектами.

Анатомия supply-chain атаки с миллиардом загрузок NPM

Основные факты

Произошла серьёзная supply-chain атака: был скомпрометирован аккаунт популярного разработчика в NPM (qix), что позволило злоумышленникам опубликовать вредоносные версии десятков популярных пакетов, таких как chalk, strip-ansi, color-convert.

Общее число загрузок пострадавших пакетов — свыше миллиарда в неделю, что создаёт критическую угрозу для JavaScript-экосистемы.

Малварь функционирует как crypto-clipper — она крадёт средства, подменяя адреса кошельков в сетевых запросах и напрямую перехватывая криптовалютные транзакции.

Ход атаки

Атака началась с бессмысленной ошибки в CI/CD pipeline (ReferenceError: fetch is not defined). Выяснилось, что ошибка вызвана вредоносной версией малой зависимости — error-ex.

После анализа кода был обнаружен фрагмент с явным вредоносным поведением: функция checkethereumw использовалась для выявления и кражи криптовалюты. Окружение Node.js было устаревшим и не поддерживало глобальный fetch (прим. В Node.js термин глобальный fetch означает, что начиная с версии 18.0.0 в среде выполнения по умолчанию встроен тот же самый API fetch, что ранее был доступен только в браузерах), поэтому атака была замечена случайно.

Масштаб заражения

Вредоносные версии были опубликованы для основных JavaScript-библиотек, глубоко зашитых в зависимости множества проектов:

  • chalk - ок. 300 млн загрузок в неделю;
  • strip-ansi — ок. 261 млн;
  • color-convert — ок. 193 млн;
  • color-name — ок. 191 млн;
  • is-core-module, error-ex, simple-swizzle, has-ansi и др.

Разбор вредоносного кода: две тактики атаки

Первый тип атаки: пассивная подмена адреса.

Если в окне браузера не обнаружен кошелёк (объект window.ethereum), вредоносный код “патчит” нативные браузерные функции (fetch, XMLHttpRequest). Это позволяет перехватывать весь веб-трафик на сайте и подменять крипто-адреса на адреса злоумышленника. Особенность: алгоритм Левенштейна подбирает наиболее похожий по написанию адрес из списка атакующих, чтобы подмена была незаметна для человека.

Второй тип атаки: активное перехватывание транзакций.

Если находится кошелёк, вредонос убирает контроль над транзакциями у пользователя. Он модифицирует методы передачи данных кошелька (request, send). При попытке совершить транзакцию (например, eth_sendTransaction) вредонос меняет адрес получателя на адрес атакующего до подписания. Если пользователь не сверит адрес вручную, он отправит средства напрямую злоумышленнику.

Трекер украденных средств

Благодаря прозрачности блокчейна часть украденных средств возможно отследить по адресам злоумышленников, например, один из их Ethereum-адресов:
0xFc4a4858bafef54D1b1d7697bfb5c52F4c166976.

Рекомендации по защите

  • Немедленно провести аудит зависимостей/lock-файлов.
  • Использовать overrides в package.json для жёсткой фиксации безопасных версий:
  • text
"overrides": {
  "chalk": "5.3.0",
  "strip-ansi": "7.1.0",
  "color-convert": "2.0.1",
  "color-name": "1.1.4",
  "is-core-module": "2.13.1",
  "error-ex": "1.3.2",
  "has-ansi": "5.0.1"
 }
  • После этого удалить директорию node_modules и lock-файл, заново выполнить npm install.

Вывод по переводу

Открытая экосистема строится на доверии, но требует высокой бдительности. Supply-chain атаки становятся всё сложнее. Только своевременный аудит зависимостей и культура безопасности помогают предотвращать крупные инциденты.

Примечание

Больше данных по кошелькам и коду см. в оригинале: jdstaerk.substack.com/p/we-just-found-malicious-code-in-the.

Дополнение из крипто-твиттера

Charles Guillemet: Технический директор кошелька Ledger… Пишет: “Происходит масштабная атака на цепочку поставок: была взломана учётная запись NPM уважаемого разработчика. Уязвимые пакеты уже были загружены более 1 миллиарда раз, что означает, что вся экосистема JavaScript может оказаться под угрозой. Вредоносная программа работает путём незаметной подмены крипто-адресов на лету для кражи средств.

Если вы используете аппаратный кошелек, обращайте внимание на каждую транзакцию перед подписанием, и вы в безопасности.

Если вы не используете аппаратный кошелек, воздержитесь от совершения каких-либо транзакций по цепочке на данный момент.

До сих пор неясно, ворует ли злоумышленник seeds непосредственно из программных кошельков на данном этапе.

Если вы используете Ledger или аппаратный кошелёк без слепой подписи, вы ничем не рискуете.

Мой твит выше предупреждает о риске тех, кто не использует аппаратный кошелёк … Всегда проверяйте каждую транзакцию перед подписанием”.

Важное

Странно, что на атаку обратили внимание только сейчас, т.к. идёт она явно не 1-й месяц: “В npm обнаружена еще одна крупная атака на цепочку поставок, затронувшая 17 популярных пакетов GlueStack @react-native-aria. В пакеты, загруженные более миллиона раз, был добавлен вредоносный код, работающий как троян удаленного доступа (RAT)”.

Более того - схожий вектор был и в 2024 году. И весной 2025-го… В общем - изучаю дальше.

Выводы

Я писал не раз, что связка Trezor + MetaMask/Rabby/etc. работает не для холодного кошелька, а для горячего тоже. И этот пример - ещё одно тому подтверждение.

Что есть холод, а что - нет, читайте вот в этом материале: специально для Forklog готовил.

Если вам не нравятся подобные решения - СИЛЬНО ЗАРАНЕЕ СДЕЛАННЫЕ Т.Е. - то готовьтесь терять деньги в крипто-активах: много и часто.

Обвинят в этот раз, скорее всего, снова Lazarus, которых никто не видел, но все знают. Легче от этого не станет никому.

Берегите себя и свои финансы и

До!