Skip to navigation

Threat reportAPTTL-2026-2581

North Korean WaterPlum (Contagious Interview) Campaign Infects 30,000 Devices, Steals $10.71M in Crypto via Fake Job Interviews and npm/PyPI/Go/Rust Supply-Chain Packages

highACTIVE

A joint advisory from Japan's NPA, US FBI/IC3, Australia's ASD Cyber Security Centre, and Germany's BND/BfV attributes North Korea's 313 General Bureau-linked WaterPlum group (the actor behind the long-running 'Contagious Interview' campaign) to infecting at least 30,000 devices across 100+ countries between December 2025 and July 2026.

Key facts for WaterPlum crypto theft campaign

IdentifiersTL-2026-2581
Also known asContagious Interview
SeverityHIGH
Exploitation statusExploited in the wild
Affected productsnpm, Inc. / OpenJS Foundation npm public package registry; Python Software Foundation PyPI public package registry; Open Source / crates.io, pkg.go.dev, Packagist Go module, Rust crate, and Packagist/PHP registries; Microsoft Visual Studio Code
AttributionWageMole (high confidence)
Nation-state nexusNorth Korea
MalwareBeaverTail - S1246, FlexibleFerret, InvisibleFerret - S1245, OtterCandy, OtterCookie, StoatWaffle
ToolsAnyDesk
MITRE ATT&CK techniquesT1027 Obfuscated Files or Information, T1036.005 Match Legitimate Resource Name or Location, T1056.001 Keylogging, T1059.006 Python, T1059.007 JavaScript, T1082 System Information Discovery, T1113 Screen Capture, T1195.001 Compromise Software Dependencies and Development Tools, T1204.002 Malicious File, T1497 Virtualization/Sandbox Evasion, T1547.001 Registry Run Keys / Startup Folder, T1552.001 Credentials In Files and 4 more in the attack flow
MotivationFINANCIAL
Target sectorstechnology, software development, cryptocurrency, financial services, artificial intelligence, freelance gig economy
Target regionsGlobal, japan, united states of america, australia, germany, North America, Europe, Asia-Pacific
Detection rules9 (1 shown free)
Sources11 cited sources

Detection coverage for WaterPlum crypto theft campaign

As of 2026-09-19, Threadlinqs Intelligence publishes 9 detection rule(s) for TL-2026-2581 across Splunk SPL, Microsoft KQL and Sigma, covering 30 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: BeaverTail/InvisibleFerret/OtterCookie Credential Store, Crypto Wallet, and .env Harvesting with Keylogging/Screen Capture

Detects a Node.js or Python process (consistent with BeaverTail, InvisibleFerret, OtterCookie/OtterCandy, or StoatWaffle) accessing browser credential stores, KeePass/1Password vault files, .env files, or cryptocurrency wallet files (wallet.dat, Electrum, MetaMask/Exodus leveldb stores), combined with loading of repurposed legitimate npm dependencies (node-global-key-listener for keylogging, screenshot-desktop for screen capture) — post-exploitation collection consistent with the campaign's 7,000+ drained crypto wallets.

  • Languages: Splunk SPL, Microsoft KQL, Sigma
  • ATT&CK: T1555, T1552.001, T1056.001, T1113, T1082
  • Data sources: sysmon, windows_security, edr_file_telemetry, browser_credential_store
  • Severity: critical
  • Confidence: high

Splunk SPL

index=sysmon OR index=edr (EventCode=11 OR EventCode=1)
| eval img_lc=lower(Image), tgt_lc=lower(TargetFilename), cl_lc=lower(CommandLine)
| where match(img_lc, "(node\.exe|python(3)?\.exe)$")
| eval sensitive_target=if(match(tgt_lc, "(login data|local state|cookies|\.kdbx|1password|\.env$|wallet\.dat|electrum|metamask|exodus|leveldb)"), 1, 0)
| eval capture_module=if(match(cl_lc, "(node-global-key-listener|screenshot-desktop|clipboardy|robotjs)"), 1, 0)
| where sensitive_target=1 OR capture_module=1
| table _time, ComputerName, User, Image, TargetFilename, CommandLine, sensitive_target, capture_module
| sort -_time

Microsoft KQL

DeviceFileEvents
| where Timestamp > ago(24h)
| where InitiatingProcessFileName in~ ("node.exe","python.exe","python3.exe")
| where FileName has_any ("Login Data","Local State","Cookies",".kdbx","1password",".env","wallet.dat","electrum","metamask","exodus","leveldb")
| project Timestamp, DeviceName, AccountName, InitiatingProcessFileName, InitiatingProcessCommandLine, FileName, FolderPath
| union (
    DeviceProcessEvents
    | where Timestamp > ago(24h)
    | where InitiatingProcessFileName in~ ("node.exe")
    | where ProcessCommandLine has_any ("node-global-key-listener","screenshot-desktop","clipboardy","robotjs")
    | project Timestamp, DeviceName, AccountName, InitiatingProcessFileName, InitiatingProcessCommandLine, FileName=ProcessCommandLine, FolderPath=""
)
| order by Timestamp desc

Sigma

title: Node.js/Python Process Accessing Credential Stores, Crypto Wallets, or .env with Keylog/Screen-Capture Modules (WaterPlum Collection)
id: 4a9d1e6c-8f22-4b7a-b3d5-9e6c1f0a2b77
status: experimental
description: Detects file access to browser credential stores, password-manager vaults, .env files, and cryptocurrency wallet files by node.exe/python.exe, alongside repurposed keylogging/screenshot npm modules — consistent with BeaverTail/InvisibleFerret/OtterCookie post-exploitation collection in the WaterPlum/Contagious Interview campaign.
references:
  - https://www.ic3.gov/CSA/2026/260918.pdf
  - https://www.microsoft.com/en-us/security/blog/2026/03/11/contagious-interview-malware-delivered-through-fake-developer-job-interviews/
author: AII-Detector — ThreadLinqs Intelligence
date: 2026-09-19
tags:
  - attack.credential-access
  - attack.collection
  - attack.discovery
  - attack.t1555
  - attack.t1552.001
  - attack.t1056.001
  - attack.t1113
  - attack.t1082
  - attack.malware.beavertail
  - attack.malware.invisibleferret
  - attack.malware.ottercookie
logsource:
  category: file_event
  product: windows
detection:
  selection_process:
    Image|endswith:
      - '\node.exe'
      - '\python.exe'
      - '\python3.exe'
  selection_target:
    TargetFilename|contains:
      - 'Login Data'
      - 'Local State'
      - 'Cookies'
      - '.kdbx'
      - '1Password'
      - '.env'
      - 'wallet.dat'
      - 'electrum'
      - 'metamask'
      - 'exodus'
      - 'leveldb'
  condition: selection_process and selection_target
falsepositives:
  - Legitimate password-manager sync clients or backup tools accessing the same vault paths
  - Developer tooling that legitimately reads .env files for local configuration
level: high

Known false positives:

  • Legitimate password-manager sync clients or backup tools accessing the same vault paths
  • Developer tooling that legitimately reads .env files for local configuration

Tuning notes: Baseline which developer tools legitimately touch .env/wallet paths (e.g. dotenv-vault clients, hardware-wallet bridges) and exclude their signed binaries by hash; correlate with TL-2026-2581-SPL-001 firing on the same host within 24h to prioritize triage, since standalone file access alone has moderate false-positive volume.

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)
  • WaterPlum Malicious npm/PyPI/Go/Rust Package Install with Postinstall Hook or VS Code Workspace Auto-Exec · unlock with TL Creds
  • BeaverTail/InvisibleFerret/OtterCookie Credential Store, Crypto Wallet, and .env Harvesting with Keylogging/Screen Capture · unlock with TL Creds
  • FlexibleFerret Registry Run-Key Persistence with Encrypted C2 Beaconing, AnyDesk Install, and Clipboard/Exfil Activity · unlock with TL Creds
  • WaterPlum Malicious npm/PyPI/Go/Rust Package Install with Postinstall Hook or VS Code Workspace Auto-Exec · unlock with TL Creds
  • BeaverTail/InvisibleFerret/OtterCookie Credential Store, Crypto Wallet, and .env Harvesting with Keylogging/Screen Capture · unlock with TL Creds
  • FlexibleFerret Registry Run-Key Persistence with Encrypted C2 Beaconing, AnyDesk Install, and Clipboard/Exfil Activity · unlock with TL Creds
  • WaterPlum Malicious npm/PyPI/Go/Rust Package Install with Postinstall Hook or VS Code Workspace Auto-Exec · unlock with TL Creds
  • FlexibleFerret Registry Run-Key Persistence with Encrypted C2 Beaconing, AnyDesk Install, and Clipboard/Exfil Activity · unlock with TL Creds

Indicators of compromise for WaterPlum crypto theft campaign

As of 2026-09-19, Threadlinqs Intelligence tracks 30 indicators of compromise for TL-2026-2581.

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

How WaterPlum crypto theft campaign works

The group used fake recruiter outreach, sham job interviews/coding tests, and malicious npm/PyPI/Go/Rust/Packagist packages plus trojanized VS Code projects to deploy the BeaverTail, InvisibleFerret, OtterCookie, OtterCandy, and StoatWaffle malware families, compromising over 7,000 cryptocurrency wallets and moving $10.71 million (1.7 billion JPY) to North Korea.

WaterPlum — publicly tracked interchangeably as Contagious Interview, Famous Chollima, DeceptiveDevelopment, CL-STA-0240, UNC5342, PurpleBravo, Void Dokkaebi, WageMole, Nickel Tapestry, Storm-1877, and Gwisin Gang — is a North Korean cyber-enabled financial crime operation that a September 18, 2026 joint advisory (Japan NPA/National Cybersecurity Office, US FBI and DoD Cyber Crime Center, Australia's ASD Cyber Security Centre, and Germany's BND/BfV) formally ties to the 313 General Bureau of the Munitions Industry Department under North Korea's Workers' Party Central Committee — the same command structure the advisory links to North Korea's fraudulent overseas IT-worker ('laptop farm') schemes.

The operation runs a two-track model: (1) DPRK operatives are hired as freelance/remote developers on crowdsourcing and gig platforms using stolen or fabricated identities, laptop farms (a domestic 'enabler' hosts a company-issued or locally purchased laptop while a remote DPRK-based operator controls it over VPN chains such as Astrill VPN, NETNUT Proxy, and High Speed Rabbit Proxy), earning legitimate wages that evade sanctions; and (2) the same actor set runs 'Contagious Interview,' posing as recruiters for fictitious or impersonated AI, cryptocurrency, and NFT companies to lure real software developers, web freelancers, and blockchain specialists via social media, job boards, gig-work platforms, and freelance marketplaces. Victims are walked through a fake virtual technical interview or coding assignment — sometimes with the interviewer using AI face-swapping software before disconnecting the video feed — and are told to clone and run a code repository or npm/PyPI/Go/Rust package hosted on GitHub, GitLab, or Bitbucket to complete the 'test.'

The payloads escalate across five named malware families sharing infrastructure and code lineage: BeaverTail (a heavily obfuscated JavaScript infostealer/loader embedded in npm packages, historically the first stage that fetches InvisibleFerret), InvisibleFerret (a Python-based multi-stage backdoor for reconnaissance, remote command execution, and further payload staging), OtterCookie (a JavaScript RAT/infostealer first seen in the wild in September 2024, whose October 2025 'v5' variant merged BeaverTail characteristics per Cisco Talos and added VM/sandbox-detection and heavier obfuscation), OtterCandy (an OtterCookie-RAT hybrid), and StoatWaffle (modular Node.js malware delivered through malicious VS Code projects whose .vscode/tasks.json or postinstall hooks execute automatically once a workspace is trusted). A related loader family, FlexibleFerret, persists via Windows Registry Run keys and supports encrypted HTTP/TCP C2 with dynamic plugin loading.

Distribution is a cross-ecosystem software-supply-chain operation: Socket and other researchers have tracked more than 1,700 malicious packages tied to the broader campaign since January 2025, spanning npm, PyPI, Go modules, Rust crates, and Packagist/PHP, with names disguised as mundane logging/licensing utilities (e.g., dev-log-core, logger-base, logkitx, pino-debugger, debug-fmt, debug-glitz on npm; logutilkit, apachelicense, fluxhttp, license-utils-kit on PyPI; formstash and mit-license-pkg as Go modules; logtrace as a Rust crate; logkit on Packagist) so the malicious code sits inside functions that match the package's advertised purpose rather than firing on install. Earlier-stage droppers observed in the same cluster (node-nvm-ssh, published and pulled from npm in August 2025) used postinstall hooks, while legitimate npm dependencies such as node-global-key-listener, screenshot-desktop, and socket.io-client were repurposed inside the malware for keylogging, screen capture, and Socket.IO-based C2 respectively. Staging infrastructure has leaned on abused legitimate web services — Vercel-hosted (vercel.app) pages and the short.gy URL shortener — to host or redirect to payloads.

Once executed, the malware harvests browser-stored credentials and cookies, monitors the clipboard and keystrokes, captures screenshots, enumerates and drains cryptocurrency wallet private keys and seed phrases, scrapes KeePass/1Password credential stores and .env files, and exfiltrates identity documents (used downstream for further impersonation), while installing AnyDesk for hands-on-keyboard remote access. The September 2026 advisory quantifies the resulting damage at 30,000+ infected devices in 100+ countries, 7,000+ compromised cryptocurrency wallets, and $10.71 million (1.7 billion JPY) transferred to North Korea between December 2025 and July 2026 — continuing activity documented as far back as December 2022 under the Contagious Interview name, and as recently as a July 2026 108-package/extension 'PolinRider' wave publicized after the advisory's coverage window closed.

MITRE ATT&CK techniques by tactic:

Defense Evasion

T1027 Obfuscated Files or Information; T1036.005 Match Legitimate Resource Name or Location; T1497 Virtualization/Sandbox Evasion

Collection

T1056.001 Keylogging; T1113 Screen Capture

Execution

T1059.006 Python; T1059.007 JavaScript; T1204.002 Malicious File

Discovery

T1082 System Information Discovery

Initial Access

T1195.001 Compromise Software Dependencies and Development Tools; T1566.003 Spearphishing via Service

Persistence

T1547.001 Registry Run Keys / Startup Folder

Credential Access

T1552.001 Credentials In Files; T1555 Credentials from Password Stores

Resource Development

T1583.006 Web Services; T1585.001 Social Media Accounts

Remediation for WaterPlum crypto theft campaign

Immediate actions

  • Treat unsolicited recruiter contact via social media, job boards, gig-work sites, or freelance marketplaces that asks for a coding test or repository clone as a likely social-engineering lure
  • Never execute unverified interview/coding-test code, npm/PyPI/Go/Rust/Composer packages, or cloned repositories on primary developer workstations or any device with stored credentials or crypto wallets
  • Open unfamiliar Visual Studio Code workspaces in Restricted Mode and inspect .vscode/tasks.json and package.json pre/postinstall hooks before trusting the workspace
  • Isolate any device known to have run an interview/coding-test artifact, then rotate all browser-stored credentials, password-manager (KeePass/1Password) contents, and cryptocurrency wallet seed phrases accessible from it

Workarounds

  • Require multi-person review and sign-off before any employee or contractor executes third-party code obtained through a job-interview process
  • Monitor and restrict outbound traffic from developer endpoint segments to disposable hosting/shortener services such as Vercel-hosted staging pages and short.gy links

Longer-term hardening

  • Isolate coding-test and interview environments in non-persistent virtual machines separate from production credentials and wallets
  • Enforce application control/allow-listing to restrict unmanaged Node.js, Python, and PowerShell execution on developer endpoints
  • Deploy EDR tuned to flag code-editor-to-shell-to-network execution chains, unexpected AnyDesk installs, and Registry Run-key persistence
  • Require dependency provenance/lockfile review before installing npm, PyPI, Go, Rust, or Composer packages introduced via an unsolicited job or interview process
  • Move developer secrets out of .env files and into just-in-time credential vaults

Affected and fixed versions

  • npm, Inc. / OpenJS Foundation — npm public package registry
    Vulnerable versions: N/A — malicious first-party package uploads (e.g. dev-log-core, logger-base, logkitx, pino-debugger, debug-fmt, debug-glitz, node-nvm-ssh), not a registry software vulnerability
    Fixed in: N/A
  • Python Software Foundation — PyPI public package registry
    Vulnerable versions: N/A — malicious first-party package uploads (e.g. logutilkit, apachelicense, fluxhttp, license-utils-kit)
    Fixed in: N/A
  • Open Source / crates.io, pkg.go.dev, Packagist — Go module, Rust crate, and Packagist/PHP registries
    Vulnerable versions: N/A — malicious packages (e.g. github.com/golangorg/formstash, github.com/aokisasakidev/mit-license-pkg, logtrace crate, golangorg/logkit)
    Fixed in: N/A
  • Microsoft — Visual Studio Code
    Vulnerable versions: N/A — workspace-trust / .vscode/tasks.json auto-execution abused via social engineering, not a VS Code product vulnerability
    Fixed in: N/A

Timeline of WaterPlum crypto theft campaign

  • Contagious Interview activity (fake job-interview lures delivering locked-ioc-22/locked-ioc-9) first documented in the wild.
  • locked-ioc-18, a JavaScript RAT/infostealer complementary to locked-ioc-22, is first observed in real-world Contagious Interview attacks.
  • The malicious npm package locked-ioc-14, using a postinstall hook to stage the infection chain, is published to the npm registry.
  • locked-ioc-14 is removed from the npm registry after detection.
  • Cisco Talos reports locked-ioc-18 'v5' has merged characteristics of locked-ioc-22, blurring the line between the two malware families and adding heavier obfuscation and VM-detection.
  • Start of the infection window later quantified by the September 2026 joint advisory (30,000+ devices, 100+ countries).
  • Microsoft publishes a detailed technical writeup on the Contagious Interview campaign, mapping TTPs including locked-ioc-10's Registry Run-key persistence.
  • Researchers report over 1,700 malicious packages tied to the campaign spread across npm, PyPI, Go, and Rust ecosystems since January 2025.
  • End of the infection window covered by the joint advisory; a related 108-package/extension 'PolinRider' wave is separately reported around this period.
  • Japan's NPA/National Cybersecurity Office, the US FBI and DoD Cyber Crime Center, Australia's ASD Cyber Security Centre, and Germany's BND/BfV jointly publish an advisory attributing WaterPlum/Contagious Interview to North Korea's 313 General Bureau and quantifying $10.71M (1.7B JPY) in crypto theft from 7,000+ wallets across 30,000+ infected devices.
  • BleepingComputer and other outlets report on the joint advisory's findings.

Sources cited for WaterPlum crypto theft campaign

More from WageMole

Previous and next in apt

Further reading

Drafted by the Threadlinqs research pipeline from 11 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