Skip to navigation

Threat reportSupply ChainTL-2026-5002

Compromised Injective SDK npm Package (@injectivelabs/sdk-ts 1.20.21) Exfiltrates Cryptocurrency Wallet Keys

highRESOLVED

A contributor account compromise let an unknown actor publish @injectivelabs/sdk-ts 1.20.21 to npm. The release hooked the PrivateKey.fromMnemonic and PrivateKey.fromHex wallet functions and exfiltrated mnemonics and private keys, Base64-encoded, over HTTPS to an Injective-lookalike endpoint. 17 other @injectivelabs packages at 1.20.21 pinned the malicious SDK. First disclosed .

Key facts for Injective SDK npm compromise

IdentifiersTL-2026-5002
Also known asMAL-2026-10165, GHSA-5fc4-fm2x-6f4r
SeverityHIGH
First disclosed
Exploitation statusExploited in the wild
Affected productsInjective Labs @injectivelabs/sdk-ts (npm); Injective Labs 17 other @injectivelabs-scoped npm packages that pinned @injectivelabs/sdk-ts 1.20.21
Weaknesses (CWE)CWE-506, CWE-200
MITRE ATT&CK techniquesT1027 Obfuscated Files or Information, T1036 Masquerading, T1059.007 JavaScript, T1071.001 Web Protocols, T1078 Valid Accounts, T1132.001 Standard Encoding, T1195.001 Compromise Software Dependencies and Development Tools, T1552 Unsecured Credentials
MotivationUNKNOWN
Target sectorscryptocurrency, blockchain, decentralized-finance, software-development
Target regionsGlobal
Detection rules9 (1 shown free)
Sources7 cited sources

Detection coverage for Injective SDK npm compromise

As of 2026-11-01, Threadlinqs Intelligence publishes 9 detection rule(s) for TL-2026-5002 across Splunk SPL, Microsoft KQL and Sigma, covering 9 indicator(s) of compromise. The whole corpus is readable without an account. Every threat comes with one complete detection in Splunk SPL, Microsoft KQL and Sigma, free for everyone; a free account adds daily TL Creds to unlock the rest. Paid plans add a larger daily allowance, correlation and the MCP server. Threadlinqs MCP server · View plans.

Free detection: TL-2026-5002 Wallet-Key Exfiltration Endpoint Lookups for Injective gRPC-web Lookalike Hosts (Splunk SPL)

Detects DNS lookups for testnet.archival.chain.grpc-web.injective.network (reported by Wiz, Socket and OffSeq) and hexhole.injective.network (GitHub issue #697, lower confidence). The compromised SDK builds the endpoint from char-code arrays to evade string scanning and POSTs Base64-encoded mnemonics and private keys over HTTPS, framed as Injective gRPC-web traffic. A lookup from a build host, CI runner or wallet-handling host indicates the stealer ran and keys may have left the environment.

  • Languages: Splunk SPL, Microsoft KQL, Sigma
  • ATT&CK: T1071.001, T1132.001, T1041, T1552, T1036
  • Data sources: sysmon, XmlWinEventLog:Microsoft-Windows-Sysmon/Operational, zeek, bro:dns:json, DeviceNetworkEvents
  • Severity: critical
  • Confidence: high

Splunk SPL

(index=endpoint sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=22 (QueryName="testnet.archival.chain.grpc-web.injective.network" OR QueryName="hexhole.injective.network")) OR (index=zeek sourcetype="bro:dns:json" (query="testnet.archival.chain.grpc-web.injective.network" OR query="hexhole.injective.network"))
```Sysmon EventCode 22 gives the querying process, Zeek gives the client IP for network-level coverage```
| eval queried_domain=coalesce(QueryName, query), client=coalesce(host, 'id.orig_h'), process=coalesce(Image, "n/a")
| stats count earliest(_time) AS first_seen latest(_time) AS last_seen values(process) AS processes by client, queried_domain
| convert ctime(first_seen) ctime(last_seen)

Microsoft KQL

DeviceNetworkEvents
| where Timestamp > ago(14d)
| where RemoteUrl has_any ("testnet.archival.chain.grpc-web.injective.network", "hexhole.injective.network")
| extend InitiatedByJsRuntime = InitiatingProcessFileName in~ ("node", "node.exe", "bun", "bun.exe", "deno", "deno.exe")
| project Timestamp, DeviceName, ActionType, RemoteUrl, RemoteIP, RemotePort, InitiatedByJsRuntime, InitiatingProcessFileName, InitiatingProcessCommandLine, InitiatingProcessAccountName

Sigma

title: DNS Lookup for Injective Lookalike Wallet-Key Exfiltration Endpoint
id: c4e8f1a9-5d20-4b76-9e3c-1a7b6d0f2903
status: experimental
description: Detects DNS queries for testnet.archival.chain.grpc-web.injective.network and hexhole.injective.network, the endpoints used by the compromised @injectivelabs/sdk-ts 1.20.21 to exfiltrate Base64-encoded mnemonics and private keys (TL-2026-5002, MAL-2026-10165).
references:
    - https://socket.dev/blog/compromised-injective-sdk-npm-package
    - https://threats.wiz.io/all-incidents/compromised-injective-sdk-npm-package-exfiltrates-cryptocurrency-wallet-keys
    - https://github.com/InjectiveLabs/injective-ts/issues/697
author: AII-Detector — ThreadLinqs Intelligence
date: 2026-11-01
tags:
    - attack.command-and-control
    - attack.t1071.001
    - attack.t1132.001
    - attack.defense-evasion
    - attack.t1036
    - attack.exfiltration
    - attack.t1041
    - attack.credential-access
    - attack.t1552
logsource:
    category: dns_query
    product: windows
detection:
    selection:
        QueryName|endswith:
            - 'testnet.archival.chain.grpc-web.injective.network'
            - 'hexhole.injective.network'
    condition: selection
falsepositives:
    - Threat-intelligence enrichment or sandbox tooling that resolves the indicator domains
    - Analysts manually testing the reported IOCs
level: critical

Known false positives:

  • Threat-intelligence enrichment or sandbox tooling that resolves the indicator domains
  • Analysts manually testing the reported IOCs

Tuning notes: hexhole.injective.network comes from a single source (GitHub issue #697) and is lower confidence, so consider a separate lower-severity alert for it. Real Injective gRPC-web hosts exist under injective.network, so match these two exact hostnames and do not wildcard the parent domain. Sibling infrastructure is not known: osint_context.json holds no community-corroborated indicators for this threat. Adapt the index and sourcetype names to your Sysmon and Zeek deployments, and add proxy or firewall logs for hosts without DNS telemetry. Prioritise alerts from CI runners and hosts that handle wallet keys.

8 more detection rules (Splunk SPL, Microsoft KQL, Sigma) · unlock with TL Creds. Sign up free to unlock the detection rules or query them with the Threadlinqs MCP server (Purple)
  • TL-2026-5002 Compromised @injectivelabs npm Package 1.20.21 Installed or Resolved (Microsoft Sentinel KQL) · unlock with TL Creds
  • TL-2026-5002 Injected Stealer Bundle accounts-jQ1GSgaW.js / accounts-Cy0p4lLW.cjs or Known Malicious Hash (Microsoft Sentinel KQL) · unlock with TL Creds
  • TL-2026-5002 Wallet-Key Exfiltration Connections to Injective gRPC-web Lookalike Hosts (Microsoft Sentinel KQL) · unlock with TL Creds
  • TL-2026-5002 Compromised @injectivelabs npm Package 1.20.21 Installed or Resolved (Sigma) · unlock with TL Creds
  • TL-2026-5002 Injected Stealer Bundle accounts-jQ1GSgaW.js / accounts-Cy0p4lLW.cjs (Sigma) · unlock with TL Creds
  • TL-2026-5002 DNS Lookup for Injective Lookalike Wallet-Key Exfiltration Endpoint (Sigma) · unlock with TL Creds
  • TL-2026-5002 Compromised @injectivelabs npm Package 1.20.21 Installed or Resolved (Splunk SPL) · unlock with TL Creds
  • TL-2026-5002 Injected Stealer Bundle accounts-jQ1GSgaW.js / accounts-Cy0p4lLW.cjs or Known Malicious Hash (Splunk SPL) · unlock with TL Creds

Indicators of compromise for Injective SDK npm compromise

As of 2026-11-01, Threadlinqs Intelligence tracks 9 indicators of compromise for TL-2026-5002.

Sample indicators (3 of 9)

  • Domain: testnet[.]archival[.]chain[.]grpc-web[.]injective[.]network
  • File hash: 103c4e6181151c1bcfedc41506cd1815458c38375d08a8fcd9981dbe0b965ce0
  • Domain: hexhole[.]injective[.]network

Defanged, TLP:CLEAR. Full set of 9 indicators: unlock with TL Creds.

9 indicators of compromise · unlock with TL Creds. Compare plans

How Injective SDK npm compromise works

On 2026-07-08 at 20:59:28 UTC, version 1.20.21 of the @injectivelabs/sdk-ts npm package was published after a legitimate contributor account with an established commit history was compromised. Per Socket, the same version number was also published for 17 other packages in the @injectivelabs scope whose dependencies were pinned to the malicious SDK, for 18 compromised packages in total. The initial-access method for the account takeover is not stated in any source reviewed. The previous release, 1.20.20, was published on 2026-07-07 and is clean.

The malicious code is a credential stealer disguised as 'key derivation telemetry'. It hooks PrivateKey.fromMnemonic(), which captures full mnemonic phrases, and PrivateKey.fromHex(), which captures raw private key strings. A function named trackKeyDerivation() records the derivation method and the key material. The code sits in the compiled bundles /dist/esm/accounts-jQ1GSgaW.js and /dist/cjs/accounts-Cy0p4lLW.cjs. The key material is Base64-encoded and sent by HTTPS POST to https://testnet.archival.chain.grpc-web.injective.network/. The endpoint URL is built from char-code arrays to hide it from string scanning, and the traffic is framed as legitimate Injective gRPC-web traffic. The payload runs at runtime when the wallet functions are called, not at install time, so install-script scanners would not flag it.

A clean release, 1.20.23, was published at 21:48:03 UTC the same day, about 49 minutes after the malicious release. Version 1.20.22 was never released. The affected versions were deprecated with a security warning, and the maintainer closed GitHub issue #697 on 2026-07-08. Socket reported about 310 downloads of the malicious version; the legitimate package averages about 50,000 weekly downloads. Injective's CEO publicly disputed the download count and said there were zero downloads of the malicious package. No confirmed theft of funds has been reported. Socket publicly disclosed the compromise on 2026-07-09. Socket, Ox Security and StepSecurity are reported to have detected it. OSV tracks it as MAL-2026-10165 and GitHub as GHSA-5fc4-fm2x-6f4r.

Source discrepancies: Socket's article and Cointelegraph give the start as June 8, 2026, but the npm publish metadata cited by OffSeq and the GitHub issue timeline both give 2026-07-08, so this record uses July 8 (Socket's '22:59 GMT+2' equals 20:59 UTC). The GitHub issue describes the exfiltration target as https://hexhole.injective.network/ with the Base64 payload in an X-Request-Id header. Wiz, Socket and OffSeq instead report testnet.archival.chain.grpc-web.injective.network. Both are listed as IOCs, and the hexhole details are unconfirmed by other sources. Anyone who called PrivateKey.fromMnemonic or fromHex under 1.20.21 should treat those mnemonics and keys as compromised and move funds to newly generated wallets.

MITRE ATT&CK techniques by tactic:

Defense Evasion

T1027 Obfuscated Files or Information; T1036 Masquerading

Execution

T1059.007 JavaScript

Command and Control

T1071.001 Web Protocols; T1132.001 Standard Encoding

Initial Access

T1078 Valid Accounts; T1195.001 Compromise Software Dependencies and Development Tools

Credential Access

T1552 Unsecured Credentials

Remediation for Injective SDK npm compromise

Patches

  • Upgrade @injectivelabs/sdk-ts to 1.20.23 or later (1.20.22 was never released)

Immediate actions

  • Identify any project, lockfile, container image or CI cache that resolved @injectivelabs/sdk-ts 1.20.21 or any other @injectivelabs package at 1.20.21, and remove it
  • Treat every mnemonic and private key passed to PrivateKey.fromMnemonic or PrivateKey.fromHex under 1.20.21 as compromised, and move funds to newly generated wallets
  • Block and alert on egress to testnet.archival.chain.grpc-web.injective.network and hexhole.injective.network from build systems and runtime hosts
  • Rotate other credentials from clean machines, as advised by OffSeq

Workarounds

  • Pin @injectivelabs/sdk-ts to 1.20.20 until the upgrade to 1.20.23 or later is validated

Longer-term hardening

  • Pin dependencies with lockfiles and integrity hashes, and delay adoption of freshly published versions
  • Run package-behavior scanning in CI to catch runtime network calls added to key-handling code
  • Enforce MFA and trusted-publishing provenance for npm publish rights
  • Do not handle production wallet keys in environments that load unvetted dependencies

Affected and fixed versions

  • Injective Labs — @injectivelabs/sdk-ts (npm)
    Vulnerable versions: 1.20.21
    Fixed in: 1.20.23
  • Injective Labs — 17 other @injectivelabs-scoped npm packages that pinned @injectivelabs/sdk-ts 1.20.21
    Vulnerable versions: 1.20.21
    Fixed in: 1.20.23 or later clean releases

Timeline of Injective SDK npm compromise

  • locked-ioc-9 1.20.20 published at 14:29:31 UTC; the last clean release before the compromise (GitHub issue #697).
  • 1.20.23 published at 21:48:03 UTC, about 49 minutes later, with the malicious code removed. Versions deprecated with a security warning and GitHub issue #697 closed.
  • 1.20.21 of locked-ioc-9 published at 20:59:28 UTC from a compromised contributor account. The same version was published for 17 other @injectivelabs packages pinned to it. Socket's text says June 8; npm metadata and the GitHub issue say July 8.
  • Socket published its analysis of the compromised package; Wiz Threat Center listed the incident the same day.
  • Cointelegraph reported the incident. Injective's CEO said the issue was fixed and disputed Socket's count of 310 downloads. OSV MAL-2026-10165 and GHSA-5fc4-fm2x-6f4r were published around this date.
  • Wiz Threat Center record last updated.

Sources cited for Injective SDK npm compromise

Further reading

Drafted by the Threadlinqs research pipeline from 7 sources; published ; last updated —.

Threadlinqs Intelligence — Real-Time Threat Detection Platform

[ 0 threats ] [ 0 det ] [ CRIT: 0 ] [ HIGH: 0 ]
// threat_feed
$ sort --newest
Showing all threats

Live intelligence console

Threat level

Latest Threats