8 июля 2026 года в реестре npm появился пакет, который на первый взгляд ничем не отличался от обычного обновления SDK. Библиотека принадлежала Injective Labs — проекту, чьи инструменты используются разработчиками криптокошельков по всему миру. Проблема выяснилась не сразу: злоумышленники встроили в код механизм кражи приватных ключей и мнемонических seed-фраз, и версия 1.20.21 разошлась по цепочке зависимостей прежде, чем кто-то забил тревогу.
GitHub-репозиторий проекта скомпрометировали не через взлом инфраструктуры, а куда более коварным способом — через легитимный аккаунт разработчика с именем thomasRalee. Это был не случайный подставной профиль, а учётная запись с историей реальных коммитов, доверие к которой сложилось за долгое время участия в проекте. Специалисты StepSecurity, разбиравшие инцидент, обратили внимание, что вредоносный релиз прошёл через собственный OIDC-пайплайн репозитория — систему доверенной публикации, которая как раз и должна была защищать от подобных сценариев. Получилось наоборот: механизм, созданный для повышения безопасности, стал каналом для распространения вредоносного кода.
Отдельного внимания заслуживает то, как малварь избегала обнаружения. Обычно вредоносные npm-пакеты запускают код через lifecycle-скрипты сразу при установке — это самый очевидный момент для срабатывания антивирусных сканеров и систем мониторинга. Здесь разработчики вредоноса поступили иначе: код активировался только при реальном использовании библиотеки, то есть когда разработчик действительно вызывал функции генерации ключей. Установка пакета проходила чисто, без каких-либо подозрительных действий — вот почему обнаружение заняло время.
Заражение не ограничилось одним пакетом. Помимо основного SDK, злоумышленники опубликовали версию 1.20.21 ещё в 17 связанных пакетах с областью видимости @injectivelabs, которые зависели от скомпрометированной библиотеки и были жёстко привязаны к её версии. В список попали @injectivelabs/utils, @injectivelabs/networks, @injectivelabs/ts-types, @injectivelabs/exceptions и целая линейка пакетов для работы с кошельками — wallet-base, wallet-core, wallet-cosmos, wallet-private-key, wallet-evm, wallet-trezor, wallet-cosmostation, wallet-ledger, wallet-wallet-connect, wallet-magic, wallet-strategy, wallet-turnkey и wallet-cosmos-strategy. Фактически под ударом оказалась вся экосистема разработчиков, использующих Injective SDK для интеграции с аппаратными и программными кошельками — от Ledger до Trezor.
Технически вредонос был замаскирован довольно изящно. Функция, отвечающая за перехват данных, называлась trackKeyDerivation() и в официальном описании выглядела как безобидный инструмент телеметрии: якобы она отслеживает, какой метод деривации ключей используется — hex или мнемоника — и замеряет тайминги для выявления узких мест производительности. В документации даже указывалось, что все метрики передаются в режиме fire-and-forget и никак не влияют на процесс генерации ключей. На деле функция параллельно захватывала жёстко закодированный маркер способа генерации ключа и саму чувствительную информацию, необходимую для восстановления приватного ключа — этого было достаточно, чтобы злоумышленники могли независимо воссоздать ключ на своей стороне.
Механизм эксфильтрации данных был построен так, чтобы минимизировать сетевую активность и не вызывать подозрений у систем мониторинга трафика. Вместо отправки каждого перехваченного значения отдельным запросом, вредонос накапливал несколько операций деривации ключей в течение двухсекундного окна, объединяя их в одну очередь. Затем всё это одним пакетом отправлялось через HTTPS POST-запрос на сервер testnet.archival.chain.grpc-web.injective[.]network — домен, стилизованный под легитимную инфраструктуру Injective, что дополнительно усложняло обнаружение по сетевым логам.
Расследование инцидента вели сразу три компании, специализирующиеся на безопасности цепочек поставок программного обеспечения. Socket первой обнаружила вредоносные коммиты и детали скомпрометированного пакета. OX Security проанализировала непосредственно механизм кражи данных из кошельков и дала прямую оценку происходящему: «Малварь добавляет логику кражи криптокошельков в пакет для работы с криптокошельками — каждый раз, когда легитимный пользователь создаёт или использует функциональность чтения мнемонических фраз, которые по сути являются мастер-ключом для любого криптокошелька, вредонос считывает их и отправляет на удалённый сервер». StepSecurity, в свою очередь, установила факт эксплуатации OIDC-пайплайна и подтвердила компрометацию личности доверенного мейнтейнера.
На момент составления отчёта скомпрометированная версия была помечена как deprecated в реестре npm, однако артефакты релиза оставались доступны для скачивания напрямую с GitHub — обстоятельство, которое сохраняет риск для тех, кто получает зависимости не через стандартный менеджер пакетов, а вручную из репозитория. Команда Injective Labs выпустила исправленную версию 1.20.23, и всем, кто устанавливал пакеты в промежутке между 8 июля и обнаружением проблемы, рекомендуется немедленно перейти на неё.
Для пользователей, чьи приложения могли задействовать заражённые пакеты, есть чёткий алгоритм действий. Любой приватный ключ или мнемоническая фраза, которые проходили через вредоносную версию библиотеки, должны считаться скомпрометированными без исключений — восстановить факт утечки постфактум невозможно, поэтому исходить нужно из худшего сценария. Все такие ключи и фразы необходимо ротировать, создав новые кошельки и переведя средства. Отдельно стоит проверить транзитивные зависимости — многие проекты могли подтянуть заражённый SDK не напрямую, а через сторонние библиотеки, которые сами зависели от Injective SDK, даже не подозревая об этом.
GitHub-репозиторий проекта скомпрометировали не через взлом инфраструктуры, а куда более коварным способом — через легитимный аккаунт разработчика с именем thomasRalee. Это был не случайный подставной профиль, а учётная запись с историей реальных коммитов, доверие к которой сложилось за долгое время участия в проекте. Специалисты StepSecurity, разбиравшие инцидент, обратили внимание, что вредоносный релиз прошёл через собственный OIDC-пайплайн репозитория — систему доверенной публикации, которая как раз и должна была защищать от подобных сценариев. Получилось наоборот: механизм, созданный для повышения безопасности, стал каналом для распространения вредоносного кода.
Отдельного внимания заслуживает то, как малварь избегала обнаружения. Обычно вредоносные npm-пакеты запускают код через lifecycle-скрипты сразу при установке — это самый очевидный момент для срабатывания антивирусных сканеров и систем мониторинга. Здесь разработчики вредоноса поступили иначе: код активировался только при реальном использовании библиотеки, то есть когда разработчик действительно вызывал функции генерации ключей. Установка пакета проходила чисто, без каких-либо подозрительных действий — вот почему обнаружение заняло время.
Заражение не ограничилось одним пакетом. Помимо основного SDK, злоумышленники опубликовали версию 1.20.21 ещё в 17 связанных пакетах с областью видимости @injectivelabs, которые зависели от скомпрометированной библиотеки и были жёстко привязаны к её версии. В список попали @injectivelabs/utils, @injectivelabs/networks, @injectivelabs/ts-types, @injectivelabs/exceptions и целая линейка пакетов для работы с кошельками — wallet-base, wallet-core, wallet-cosmos, wallet-private-key, wallet-evm, wallet-trezor, wallet-cosmostation, wallet-ledger, wallet-wallet-connect, wallet-magic, wallet-strategy, wallet-turnkey и wallet-cosmos-strategy. Фактически под ударом оказалась вся экосистема разработчиков, использующих Injective SDK для интеграции с аппаратными и программными кошельками — от Ledger до Trezor.
Технически вредонос был замаскирован довольно изящно. Функция, отвечающая за перехват данных, называлась trackKeyDerivation() и в официальном описании выглядела как безобидный инструмент телеметрии: якобы она отслеживает, какой метод деривации ключей используется — hex или мнемоника — и замеряет тайминги для выявления узких мест производительности. В документации даже указывалось, что все метрики передаются в режиме fire-and-forget и никак не влияют на процесс генерации ключей. На деле функция параллельно захватывала жёстко закодированный маркер способа генерации ключа и саму чувствительную информацию, необходимую для восстановления приватного ключа — этого было достаточно, чтобы злоумышленники могли независимо воссоздать ключ на своей стороне.
Механизм эксфильтрации данных был построен так, чтобы минимизировать сетевую активность и не вызывать подозрений у систем мониторинга трафика. Вместо отправки каждого перехваченного значения отдельным запросом, вредонос накапливал несколько операций деривации ключей в течение двухсекундного окна, объединяя их в одну очередь. Затем всё это одним пакетом отправлялось через HTTPS POST-запрос на сервер testnet.archival.chain.grpc-web.injective[.]network — домен, стилизованный под легитимную инфраструктуру Injective, что дополнительно усложняло обнаружение по сетевым логам.
Расследование инцидента вели сразу три компании, специализирующиеся на безопасности цепочек поставок программного обеспечения. Socket первой обнаружила вредоносные коммиты и детали скомпрометированного пакета. OX Security проанализировала непосредственно механизм кражи данных из кошельков и дала прямую оценку происходящему: «Малварь добавляет логику кражи криптокошельков в пакет для работы с криптокошельками — каждый раз, когда легитимный пользователь создаёт или использует функциональность чтения мнемонических фраз, которые по сути являются мастер-ключом для любого криптокошелька, вредонос считывает их и отправляет на удалённый сервер». StepSecurity, в свою очередь, установила факт эксплуатации OIDC-пайплайна и подтвердила компрометацию личности доверенного мейнтейнера.
На момент составления отчёта скомпрометированная версия была помечена как deprecated в реестре npm, однако артефакты релиза оставались доступны для скачивания напрямую с GitHub — обстоятельство, которое сохраняет риск для тех, кто получает зависимости не через стандартный менеджер пакетов, а вручную из репозитория. Команда Injective Labs выпустила исправленную версию 1.20.23, и всем, кто устанавливал пакеты в промежутке между 8 июля и обнаружением проблемы, рекомендуется немедленно перейти на неё.
Для пользователей, чьи приложения могли задействовать заражённые пакеты, есть чёткий алгоритм действий. Любой приватный ключ или мнемоническая фраза, которые проходили через вредоносную версию библиотеки, должны считаться скомпрометированными без исключений — восстановить факт утечки постфактум невозможно, поэтому исходить нужно из худшего сценария. Все такие ключи и фразы необходимо ротировать, создав новые кошельки и переведя средства. Отдельно стоит проверить транзитивные зависимости — многие проекты могли подтянуть заражённый SDK не напрямую, а через сторонние библиотеки, которые сами зависели от Injective SDK, даже не подозревая об этом.