Просыпаюсь утром, открываю ленту - и сразу два инцидента. Оба про 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-скрипты транзитивных зависимостей?

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

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

ВеткаВредоноснаяБезопасная
latest1.14.11.14.0
legacy0.30.40.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 марта.