Axios получил бэкдор: 5 пакетов npm, которые нужно заменить HTTP API
Связанный с Северной Кореей субъект отправил RAT внутри axios 1.14.1 70M еженедельным установщикам. Пять одноцелевых пакетов npm, которые вы можете удалить сегодня и заменить вызовами HTTP API.
31 марта 2026 года связанный с Северной Кореей оператор опубликовал две зашифрованные версии
axios в НПМ. Версии 1.14.1 и 0.30.4 поставляются с постустановочной зависимостью с именем
plain-crypto-js который извлек из платформы RAT-имплантат
sfrclak[.]com:8000. Пакеты были активны в течение трех часов. Axios получает 70 миллионов
еженедельные загрузки. Посчитайте.
Каждое выполненное задание CI npm install в течение этого окна отправил полезную нагрузку в свою сборку
окружающая среда. Секреты переменных среды были раскрыты; частные токены GitHub привыкли
новые новые релизы; ноутбуки для разработчиков работают npm install локально получил КРЫСУ.
Инцидент обошел 2FA, поскольку машина сопровождающего уже была скомпрометирована через
целевая кампания социальной инженерии. 2FA для учетной записи npm ничего не делает, если ею владеет злоумышленник.
терминал, который работает npm publish.
Вы не можете устранить этот класс атаки, но можете уменьшить радиус взрыва. Каждый пакет npm это делает одну маленькую вещь; проверка электронной почты, анализ номера телефона, удаление HTML, генерация QR-код, подписывающий JWT; это пакет, который вы можете удалить и заменить HTTPS-вызовом API, который вы управление с помощью поворотного ключа. Скомпрометированный пакет запускается до того, как вы успеваете отреагировать. Скомпрометированный ключ API перестает работать через несколько секунд.
Вот пять пакетов npm, которые вы можете заменить на этой неделе HTTP API, который делает то же самое: плюс защита CI, которая блокирует попадание новых перехватчиков после установки в ваш файл блокировки.
Проведите аудит вашей текущей поверхности зависимостей npm
Прежде чем что-либо удалять, узнайте, что у вас есть. Этот проход оболочки выявляет производственные зависимости. с помощью хуков установки и проверяет, есть ли где-нибудь в вашем дереве отравленные версии axios:
Если какая-либо версия Axios появляется в вашем файле блокировки, поменяйте каждый секрет на затронутом компьютере или CI. у задания был доступ. А не «проверить логи». Поворот. Предположим, что эксфильтрация произошла за 180 минут. между публикацией и удалением. Секреты, которые были раскрыты, не могут быть раскрыты.
Google Threat Intelligence приписывает операцию UNC1069, тому же участнику, который запустил
раньше WAVESHAPER кампании. Их сборник действий нацелен на ноутбуки обслуживающего персонала через
фишинг, а затем использует учетные данные сопровождающего для публикации. Ваша защита должна исходить из того, что
по крайней мере один сопровождающий хотя бы одного переходного отдела находится на расстоянии одного фиша от имплантата
система доставки.
Замена 1: валидатор электронной почты → /v1/электронная почта/проверить
validator, email-validator, deep-email-validator, и
disposable-email-domains появляются в огромной части потоков регистрации. Вместе они добавляют
примерно полмегабайта установочного веса, собственные транзитивные деревья и поддерживаемый список
одноразовые домены, которые устаревают в течение нескольких недель.
API проверяет синтаксис, записи DNS MX и действующий список одноразовых доменов за один вызов. Обмен два пакета выглядят так:
Вы теряете возможность проверки в автономном режиме. Вы получаете постоянную проверку MX, действующий одноразовый список, и отсутствие пакетов с хуками postinstall, сидящими в вашем дереве. Для регистрации, оформления заказа и вебхука поля электронной почты, этот компромисс благоприятствует API.
Замена 2: libphonenumber-js → /v1/телефон
libphonenumber-js это порт Google libphonenumber. Он весит 147 КБ.
минимизирован. Размер мини-сборки уменьшается до 79 КБ, но теряются метаданные для большинства стран. Полные метаданные
комплект возвращает вес до 2 МБ в распакованном виде. На Cloudflare Workers или холодной Lambda это
реальная задержка, которую вы платите при каждом вызове.
Один POST возвращает формат E.164, страну, национальный номер, тип линии и часовой пояс. Если число
недействителен, data.valid является false а остальное ноль. Ваша серверная часть
поток регистрации вызывает это между «чтением формы» и «записью в базу данных». Обращение API туда и обратно занимает 60 мс.
внутри существующего окна записи БД.
Замена 3: qrcode → /v1/qr/генерировать
The qrcode Сам пакет npm в порядке: 34 КБ, без хука после установки. Что не хорошо, так это
тот canvas зависимость от коллег, к которой вас подталкивает половина учебных пособий, что завершает
собственный код, устанавливает node-gyp и уже десять лет использует CVE в своей цепочке инструментов сборки. Каждый уроженец
npm dep — это стык цепочки поставок.
Ответ — необработанный SVG. Перенесите его в файл, поместите в шаблон счета или визуализируйте в режиме онлайн.
в компоненте React с dangerouslySetInnerHTML. Нет собственных модулей, нет сборки
цепочка инструментов, нет транзитивного дерева.
Замена 4: jsonwebtoken → /v1/jwt/generate и /v1/jwt/decode
jsonwebtoken — одна из наиболее копируемых JWT-библиотек в Node. Это еще и библиотека
большинство людей неправильно настраивают: неправильный алгоритм, отсутствие заявки на аудиторию, отсутствие срока действия. Неправильный алгоритм
вызов проверки плюс заголовок, контролируемый злоумышленником, вновь представляют JWT эпохи 2015 года. none
уязвимость. API применяет белые списки алгоритмов и отклоняет неподписанные токены в конечной точке:
Используйте это для недолговечных токенов, выпущенных серверной службой: ссылки для сброса пароля, одноразовые URL-адреса загрузки, токены носителя между службами. Не используйте внешний сервис для сеанса пользователя JWT на горячем пути каждого аутентифицированного запроса; для них оставьте проверенную библиотеку в процессе и заблокируйте алгоритм.
Замена 5: преобразование html в текст → /v1/html-в-текст/конвертировать
html-to-text, sanitize-html, node-html-parserи их
друзья существуют, потому что каждый API, принимающий пользовательский контент, в конечном итоге должен отделить HTML от обычного текста.
предварительный просмотр, дайджесты электронной почты или индексирование поиска. Их общий вес составляет от 500 КБ до 1,2 МБ; они тянут
parse5 или htmlparser2 через дверь, которая у каждого своя
поверхность для ухода.
Чтобы получить более богатый результат, /v1/html-to-markdown возвращает Markdown со вкусом GitHub, и
/v1/html-sanitize возвращает очищенный HTML с настраиваемым списком разрешенных. Выберите тот
это соответствует тому, как ваш нижестоящий потребитель хочет хранить контент.
Добавьте защиту CI, которая блокирует новые перехватчики после установки.
Удаление пакетов — разовая работа. Оставаться стройным – это постоянно. Эта проверка действий GitHub не удалась
PR, если обновление файла блокировки вводит новый postinstall или preinstall
зацепиться в любом месте дерева:
Проверка недорогая, выполняется при каждом PR и требует проверки человеком, прежде чем появится какой-либо новый скрипт.
Соедините его с npm config set ignore-scripts true по CI и явным спискам разрешений для
пакеты, которые, как вы знаете, нужны esbuild-стиль постустановки (TypeScript, Puppeteer, bcrypt).
От чего ты отказался и когда вернуть это обратно
Перенос проверки на HTTP-вызов имеет реальные затраты. Вы обмениваете их на меньшую зависимость поверхность:
| Компромисс | пакет npm | HTTP API |
|---|---|---|
| Задержка | микросекунды | от 50 до 150 мс от края |
| Автономное использование | Да | Нет |
| Установить риск | После установки выполняется произвольный код | Нет этапа установки |
| отзыв | Восстановить, переиздать, перераспределить | Поворот ключа API за секунды |
| Аудиторский след | Нет по умолчанию | Запрос журнала по звонку |
| Дрейф версий | Закрепить или обновить | Заголовок версии, стабильный контракт |
Правильный ответ — «и то, и другое, с намерением». Держите библиотеки критического пути в процессе (сессия JWT верификация, криптопримитивы, промежуточное программное обеспечение аутентификации). Уберите длинный хвост одноцелевых утилит из вашего файла блокировки на подписанную конечную точку HTTPS, которую вы можете отозвать.
Ключевые выводы
- Предположим, что специалист по обслуживанию находится на расстоянии одного фиша от имплантата. Axios получал 70 миллионов еженедельно загрузок, и его учетная запись npm все еще была скомпрометирована в результате атаки социальной инженерии на личный ноутбук.
-
Проведите аудит постустановочных перехватчиков сегодня. Любой dep, который запускает произвольный код во время
npm installэто шов в цепочке поставок. Инвентаризируйте их, затем удалите или добавьте в белый список. - Сначала удалите одноцелевые пакеты. Электронная почта, телефон, QR, подпись JWT, HTML конверсия; каждый имеет однострочную замену HTTP отзывным ключом.
- Поворачивайте, не исследуйте, после воздействия. Если отравленный аксиос попал в ваш дерево, поверните каждый секрет, которого коснулась затронутая среда. Эксфильтрация происходит за считанные минуты.
-
Добавьте охранника CI. Блокировать новые
postinstallкрючки от приземления в ваш lockfile без проверки человеком. Компромисс аксиоса поставил бы подножку этому охраннику.
Botoi предоставляет HTTP-замены для пяти вышеперечисленных пакетов и еще около 145 одноцелевых пакетов. утилиты: хеширование, генерация UUID, тестирование регулярных выражений, преобразование меток времени, проверка схемы JSON, генерация штрих-кода, рендеринг PDF и все остальное. Один ключ API, 5 запросов в минуту на бесплатном уровне, нет установить крючки. Просмотрите интерактивные документы или подключите MCP-сервер в твой Агент AI-кодирования для вызова одних и тех же конечных точек из Claude Code или Cursor, не выходя из редактора.
FAQ
- Что случилось с пакетом axios npm в марте 2026 года?
- В период с 00:21 по 03:20 UTC 31 марта 2026 г. злоумышленник использовал скомпрометированную учетную запись сопровождающего для публикации axios 1.14.1 и 0.30.4 с вредоносной постустановочной зависимостью под названием Plain-crypto-js. Зависимость загружала RAT-имплантаты для конкретной платформы с сайта sfrclak[.]com:8000. Google Threat Intelligence связывает операцию с UNC1069, игроком, связанным с Северной Кореей. Пакеты работали примерно три часа, этого было достаточно, чтобы попасть в кэши CI и на ноутбуки разработчиков по всему миру.
- Снижает ли риск замена пакетов npm на HTTP API?
- Это уменьшает поверхность атаки двумя способами. Сначала вы удаляете перехватчик postinstall, который запускает произвольный код на вашем сервере сборки. Во-вторых, вы перемещаете логику проверки с ноутбука разработчика в подписанную конечную точку, работающую только с HTTPS, которой вы управляете с помощью ротации ключей API. Отравленный пакет запускается до того, как вы успеваете среагировать; отозванный ключ API перестает работать за считанные секунды.
- HTTP-вызов медленнее, чем локальный пакет npm?
- Для разового звонка по холодному запросу — да; Типичная задержка API botoi составляет от 50 до 150 мс от клиента в Северной Америке до границы Cloudflare. Для большинства серверных потоков (регистрация, оформление заказа, обработка веб-перехватчика), которые перекрываются с уже совершаемыми вами вызовами БД, это не добавляет ничего измеримого. Для путей с высокой пропускной способностью кэшируйте ответ по входному хешу для того же профиля задержки, что и для локального пакета.
- Как прямо сейчас проверить мой репозиторий на наличие рискованных пакетов npm?
- Запустите npm Audit --omit=dev, чтобы выявить производственные зависимости, а затем проверьте любой пакет с помощью перехватчика postinstall или preinstall с помощью сценариев npm ls и npm view {name}. Пакеты, которые выполняют одну небольшую задачу (проверку электронной почты, генерацию QR-кодов, подпись JWT, анализ телефона, удаление HTML), являются сильными кандидатами для перехода на HTTP-вызов. Пакеты, которые используют шифрование или активно извлекают сетевой контент, являются объектами аудита с наивысшим приоритетом.
- Что, если вместо npm будет скомпрометирован провайдер HTTP API?
- Радиус взрыва меньше, а обнаружение быстрее. Вы контролируете ключ API и можете отозвать его одним вызовом. Ваш провайдер предоставляет страницу состояния, RSS об инцидентах и подписанные ответы через HTTPS. Сравните это с пакетом, работающим внутри вашей сборки, где для обнаружения требуется прочитать каждый хук после установки в вашем транзитивном дереве зависимостей. Это также не нулевой риск; один дает вам рычаги, другой нет.
Начните разработку с botoi
150+ API-эндпоинтов для поиска, обработки текста, генерации изображений и утилит для разработчиков. Бесплатный тариф, без банковской карты.