TGViewer
Spring АйО Spring АйО @spring_aio · 10.9K subscribers
Post #781 8.2K
👩‍💻 Чёрный день для npm

8 сентября 2025 года злоумышленники скомпрометировали npm-аккаунт известного Open Source мейнтейнера Qix (Josh Junon) и выпустили вредоносные патч-версии десятков популярных пакетов — от chalk и strip-ansi до debug и color-convert. Совокупная аудитория — миллиарды скачиваний в неделю. Встроенный вирус представлял собой «крипто-клиппер», то есть подменял адреса кошельков криптовалют (об этом позже). Инцидент быстро заметили исследователи; шёл массовый откат релизов и зачистка.

Как это выглядело изнутри

Утро 8 сентября началось с «тишины перед бурей»: под привычными именами пакетов в реестр легли новые patch версии. Никаких громких мажорных апдейтов. Но внутри — обфусцированный код, который в браузере перехватывал fetch / XMLHttpRequest, а при наличии window.ethereum подменял поля транзакций ещё до того, как пользователь нажмёт «Approve». Именно так незаметные утилиты, лежащие в основании фронтенд-мира, превратились в оружие.

Ключ к атаке — социальная инженерия. Хакеры получили доступ к npm аккаунту Josh-а через фишинговое письмо, содержащее ссылку, по которой Josh перешёл. После захвата учётки началась «россыпь» вредоносных патчей в его проектах — от chalk и debug до strip-ansi, color-convert и других небольших, но крайне распространённых модулей.

Почему это ударило так широко?

Потому что речь о крайне популярных транзитивных зависимостях, спрятавшихся глубоко в node_modules фронтенда. Еженедельные скачивания — миллиарды: chalk, strip-ansi, debug и компания прокатываются транзитом через CI, статические сайты документации, Storybook’и и админки. Поэтому по сути огромная часть веба, которая транзитивно использовала данные зависимости, оказалась под угрозой.

Сам обфусцированный код, как уже сказали, работал как crypto clipper. Вирус подбирал «похожий» адрес кошелька транзакции по расстоянию Левенштейна, и подменял кошелёк получателя, по сути, надеясь, на невнимательность пользователя. Если кошелёк не обнаруживался при переводе — шла пассивная подмена в сетевом трафике; если обнаруживался — транзакция на самом деле совершалась на кошелёк злоумышленника, а не на тот, куда хотел отправить пользователь .

Дальше — гонка скоростей

В сухом остатке — тревожный, но честный вывод: сегодня «маленькая» зависимость — это не строка в package.json, а потенциальный канал влияния на миллионы пользователей.

Несмотря на то, что в ходе данной атаки в сумме злоумышленники получили всего лишь порядка $50, эта история хорошо демонстрирует, что современная интернет инфраструктура построена на доверии - просто подумайте, насколько просто было злоумышленникам распространить свой crypto clipper на десятки миллионов билдов.

🙏 Нас, как бекенд-разработчиков эта история мало касается. Однако не стоит забывать, что "Умный учится на своих ошибках, мудрый учится на чужих, а дурак не учится никогда". Будьте аккуратны, друзья
  • ❤ 37
  • 👍 31
  • 🔥 13
  • 🤯 5
  • 😁 1
More from @spring_aio
  1. Oct 6, 2026👩‍💻 Spring Config Import без магии У наших друзей из Axelix вышла статья о том, как Spri…
  2. Oct 5, 2026🥲 В Java 27 TLS научился переживать квантовую атаку При установке HTTPS-соединения клиент…
  3. Oct 3, 2026⚡️⚡️Строки кода стремятся подешеветь до цены токена. Что остается ценным? Про это — трек «…
  4. Oct 2, 2026🙅‍♂️ Не каждый AI-вызов должен генерировать текст Иногда от модели нужен не красивый отве…
  5. Oct 1, 2026JEP 544: JVM будет сохранять машинный код между запусками JEP 544 (Ahead-of-Time Code Comp…
  6. Sep 30, 2026🍃 Переписываем всё на Rust, JavaScript — кошмар, AI против Vaadin | Spring АйО Подкаст №7…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →