Просыпаюсь утром, открываю ленту - и сразу два инцидента. Оба про 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 он нигде не импортируется. Вообще нигде.
Тогда зачем он нужен?
npm installставит все зависимости изpackage.jsonplain-crypto-jsсодержитpostinstall-скрипт- Скрипт тянет второй этап payload с C2-сервера
- Разворачивается кроссплатформенный RAT-троян (macOS, Windows, Linux)
- После установки скрипт подчищает за собой - подменяет
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 марта.