Просыпаюсь утром, открываю ленту — и сразу два инцидента. Оба про npm. Оба серьёзные. И оба произошли в один день.

Первый — в Axios (да, тот самый, который стоит вообще везде) три часа раздавал RAT‑троян. Второй — Anthropic случайно выложила полные исходники Claude Code в публичный npm. Полмиллиона строк с промптами и архитектурой.

Вот и доброе утро :-)


Axios: 3 часа, которых хватило

Что случилось

Кто-то угнал npm-аккаунт Джейсона Саймана (jasonsaayman) - основного мейнтейнера Axios. Сменил привязанный email. И руками опубликовал две версии:

  • "axios@1.14.1" - в ветку latest

  • "axios@0.30.4" - в legacy-ветку

Версии провисели в открытом доступе примерно с 00:21 до 03:15 UTC 31 марта. Три часа. Для пакета со ста миллионами загрузок в неделю - этого более чем достаточно.

Как устроена атака

Самое неприятное, сам код Axios не тронут. Ни строчки. Откроете исходники - всё чисто. Подвох в package.json.

Туда добавили зависимость plain-crypto-js@4.2.1. Пакет создан накануне, 30 марта. Название нормальное - ну крипто-утилита, кто будет присматриваться. В коде Axios он нигде не импортируется. Вообще нигде.

Тогда зачем он нужен?

  1. npm install ставит все зависимости из package.json

  2. plain-crypto-js содержит postinstall-скрипт

  3. Скрипт тянет второй этап payload с C2-сервера

  4. Разворачивается кроссплатформенный RAT-троян (macOS, Windows, Linux)

  5. После установки скрипт подчищает за собой - подменяет package.json на чистую версию

Пятый пункт - отдельное удовольствие. Троян уже работает, а вы смотрите в package.json - всё чисто. Никакого plain-crypto-js там нет.

Phantom dependency

Это называют phantom dependency - зависимость-призрак. Она не используется в коде, не импортируется, существует только ради побочного эффекта при установке. Стандартный код-ревью её не поймает, потому что в .js-файлах всё чисто.

Вы сканируете исходники на подозрительный код? Хорошо. А package.json на новые зависимости? А postinstall-скрипты транзитивных зависимостей?

Что делать прямо сейчас

Безопасные версии:

Ветка

Вредоносная

Безопасная

latest

1.14.1

1.14.0

legacy

0.30.4

0.30.3

Если ваш проект поставил именно эти версии в окно с 00:21 до 03:15 UTC 31 марта - система считается скомпрометированной. Не "возможно". Скомпрометированной.

Необходимо:

  • Проверить package-lock.json / yarn.lock на "axios@1.14.1" или "axios@0.30.4"

  • Поискать "plain-crypto-js" в дереве зависимостей

  • Если нашли - машина, где был запущен npm install, заражена

  • Ротация ключей, секретов, токенов - полный комплект

StepSecurity, Socket, Endor Labs, Aikido и Huntress подтвердили детали и опубликовали IOC.

Кто стоит за атакой

Некоторые источники - включая Google и Reuters - указывают на северокорейскую группировку UNC1069 / Lazarus. Supply-chain через угон аккаунта мейнтейнера - их классический подход.

Важный момент: npm-реестр не взломан. Инфраструктура не пострадала. Атакующие просто залогинились под настоящим аккаунтом и сделали npm publish. Всё легитимно с точки зрения системы.


Claude Code: когда забыл про .npmignore

Что случилось

В тот же день Anthropic выкатила в npm очередную версию CLI-агента - "@anthropic-ai/claude-code@2.1.88". Рядовой релиз. Но в пакет залетел файл cli.js.map на 59,8 МБ.

Это sourcemap. И через него восстанавливается весь исходный код проекта.

Масштаб

Из одного файла достали:

  • ~512 000 строк TypeScript

  • ~1 900 файлов

  • Внутреннюю логику агента

  • System-промпты

  • Механизмы памяти, планирования, работу с инструментами

  • Неанонсированные фичи

Sourcemap ссылался на ZIP-архив в публичном R2-бакете Anthropic. Исследователь Chaofan Shou первым написал об этом в X. Код тут же растащили на GitHub.

Причина

Anthropic подтвердила: ошибка в build-процессе. Source maps не исключили через .npmignore. Всё.

Не взлом. Не утечка пользовательских данных. Забыли строчку в конфиге сборки.

Версию быстро удалили, выпустили фикс. Но код уже разошёлся.

Корейский разработчик, 4 утра и 50 000 звёзд за два часа

Пока Anthropic рассылала DMCA-тейкдауны на зеркала утёкшего кода, один человек в Корее пошёл другим путём.

Сигрид Джин (Sigrid Jin, GitHub: instructkr) - известный power-user Claude Code. Насколько известный? По данным Wall Street Journal, за год он нагенерировал через инструмент больше 25 миллиардов токенов. Двадцать пять миллиардов. Человек явно знал архитектуру не понаслышке.

Утром 1 апреля, около четырёх утра по местному времени, Джин проснулся от уведомлений об утечке. Увидел, что Anthropic сносит зеркала оригинального кода. И принял решение: не копировать, а переписать.

Clean room

Джин не форкнул утёкший TypeScript. Это сразу попало бы под DMCA, и репозиторий бы снесли за день. Вместо этого он сделал clean-room-реализацию - переписал ключевые паттерны и архитектуру с нуля на Python:

  • Агент-харнесс

  • Инструменты

  • Память и планирование

  • Swarms-подагенты

Для ускорения использовал AI-инструмент oh-my-codex (OmX). Репозиторий claw-codeбыл выложен до рассвета.

Другой язык, другой код, никакого копи-паста - юридически это новая творческая работа. Gergely Orosz из Pragmatic Engineer и другие юристы/разработчики подтвердили: такая "чистая переписка" юридически устойчива.

Anthropic не смогла снять репозиторий через DMCA. Он до сих пор жив.

Рекорд GitHub

А дальше началось безумие.

Время после публикации

Звёзды

~2 часа

50 000

~24 часа

100 000+

Форки за первые сутки

50 000 - 58 000

50 тысяч звёзд за два часа. По заявлениям автора и ряда СМИ - самый быстрый рост репозитория в истории GitHub.

Позже Джин начал портировать ту же архитектуру на Rust - эта реализация тоже быстро набрала десятки тысяч звёзд.

По сути, сообщество за считанные часы превратило корпоративную утечку в полностью открытый клон AI-агента. Сам Джин потом сформулировал цель проекта просто: "Better Harness Tools" - лучшие инструменты, которые реально делают вещи.

Можно спорить, этично ли строить на чужой утечке. Но юридически - чисто. А 100 тысяч звёзд за сутки говорят о том, что спрос на открытую альтернативу был огромный задолго до 31 марта.

POSSE:

На Дерево