Компрометация npm-пакета Injective раскрыла риск кражи ключей
Атака на supply chain: npm-пакет @injectivelabs/sdk-ts похищал мнемонические фразы через фальшивую telemetry
8 июля 2026 года экосистема Injective столкнулась с критическим инцидентом безопасности. В официальном npm-реестре оказалась скомпрометированная версия пакета @injectivelabs/sdk-ts — одного из ключевых инструментов для разработки в этом блокчейне. Вредоносная версия 1.20.21, существовавшая всего 49 минут, действовала как бэкдор: она перехватывала и отправляла на удалённый сервер конфиденциальные ключевые материалы пользователей. Инцидент стал очередным тревожным сигналом о хрупкости доверия в open-source supply chain.
Как злоумышленник внедрил бэкдор
Вредоносная нагрузка была добавлена через, казалось бы, легитимный коммит в GitHub-репозиторий, выполненный под видом одного из сопровождающих проекта. Это позволило модификации слиться с обычным потоком обновлений и избежать подозрений на этапе первичного рассмотрения. Расследование позже выявило аномальное поведение учётной записи автора коммита, что только укрепило уверенность в работе злоумышленника.
Основная инъекция скрывалась в файле packages/sdk-ts/src/core/accounts/PrivateKey.ts. Именно здесь были расставлены хуки в двух критически важных функциях вывода ключей:
PrivateKey.fromMnemonic()PrivateKey.fromHex()
При каждом вызове этих функций во время загрузки кошелька вредоносный код незаметно инициировал вызов trackKeyDerivation, отвечавший за эксфильтрацию секретов.
Маскировка под telemetry и техника кражи
Чтобы остаться незамеченным, зловредный код был глубоко обфусцирован и сознательно стилизован под рутинную функциональность telemetry. Вместо того чтобы вызывать прямые подозрения, он имитировал сбор метрик, что значительно затруднило его обнаружение автоматическими сканерами и поверхностным код-ревью.
Объектами атаки стали два типа наиболее чувствительных данных:
- mnemonic seed phrases (мнемонические фразы для восстановления кошелька),
- private keys стандарта BIP-39, генерируемые через
PrivateKey.fromHex().
Захваченные значения кодировались в base64 и скрытно передавались на контролируемую злоумышленником удалённую конечную точку. Передача осуществлялась через HTTP-заголовок X-Request-Id — поле, которое обычно не вызывает подозрений и редко проверяется межсетевыми экранами.
Раскрытие и реакция сообщества
Инцидент стал публичным после того, как исследователь безопасности детально описал механизм эксфильтрации в issue #697 на GitHub. Сообщество и разработчики отреагировали оперативно: уже вскоре после раскрытия предполагаемый мейнтейнер признал проблему и отменил скомпрометированную версию, пометив вредоносную активность на npm. Вся кампания по тихой краже ключей продлилась менее часа, однако сам факт успешного проникновения через цепочку поставок продемонстрировал всю серьёзность рисков.
Случай с @injectivelabs/sdk-ts наглядно показал, насколько уязвимыми могут быть даже широко используемые open-source компоненты. Маскировка под легитимный код, внешне корректный коммит от доверенного лица и использование безобидного HTTP-заголовка для вывода данных — всё это делает атаки на supply chain всё более изощрёнными. Инцидент служит важным напоминанием о необходимости тщательного аудита зависимостей и настороженности к обновлениям, независимо от их источника.
Отчет получен из сервиса CTT Report Hub. Права на отчет принадлежат его владельцу.
Ознакомиться подробнее с отчетом можно по ссылке.



