
Executive Summary
North Korean threat actors are targeting cryptocurrency developers through a large-scale software supply chain campaign that combines malicious npm packages, GitHub repositories, and social media promotion.
Panther's npm threat scanner identified over 50 malicious packages embedded across more than 100 GitHub repositories targeting developers in the Polymarket, PancakeSwap, PumpFun/Solana, Hyperliquid, Kalshi, and general Ethereum Virtual Machine (EVM) ecosystems.
The packages are operated by 30+ throwaway npm personas and rotate across 20+ command-and-control domains at time of writing.
The packages fall into three distinct DPRK malware families:
PromptMink, an LLM-generated infostealer named by ReversingLabs, exfiltrates wallet keys, environment secrets, and SSH credentials. ClipViper, which we have named for this report, is a persistent Windows clipboard stealer deployed through a multi-layer dependency chain. OtterCookie, documented in our separate report, is a credential exfiltration and SSH backdoor toolchain.
The malicious repositories are promoted through verified accounts on X and Reddit, use spoofed developer identities and bot-inflated star counts to appear legitimate, and are distributed across 40+ GitHub users and organizations as redundant delivery fronts.
Automated package scanners miss the attack because the malicious payload sits one to three dependency hops deep; the visible code passes review while the malware lives in a sub-dependency.
We attribute the activity with high confidence to DPRK / Famous Chollima as part of the Contagious Trader campaign, with IoCs corroborated by findings from KMSec, ReversingLabs, OTX, and independent researchers including @stephenlacy and @MalwareUtkonos. Contagious Trader is the name assigned to the cluster of npm-poisoning activity targeting crypto trading bot developers.
Attack Chain

The attack chain depicted above follows a consistent pattern: malicious npm packages are embedded as dependencies in crypto trading bot GitHub repositories, promoted through social media and SEO-optimized READMEs. When a user clones the repo and runs npm install, the typosquatted dependency silently executes the payload.
The operators maintain parallel GitHub orgs as redundant delivery fronts. When one gets taken down, the others continue serving the same payload.
The campaign uses two distinct techniques to make malicious repositories look authored by trusted developers: outright identity theft of real contributors and per-commit attribution spoofing via $(git config user.name) shell injection.
Campaign Timeline

The campaign began on February 19, 2026, when PromptMink's first two packages (npm-eslint-helper and bn-eslint.js) were published within 90 seconds of each other. OtterCookie followed the next day with npm-doc-builder.
Activity escalated sharply in April, with 23 new packages published, more than double March's output. The most intense burst came between April 21 and 23, when 10 packages across all three clusters appeared in roughly 30 hours, including the first ClipViper payload.
As of May 11, the campaign shows no signs of slowing. Nine new packages have appeared in the first eight days of the month, a pace that would exceed April's rate. Packages like pino-pretty-logger, api-ts-utils, and npm-doc-dev are still receiving fresh versions, indicating the operators are actively maintaining deployed infrastructure and victim acquisition is ongoing.
Contagious Interview and Contagious Trader: Converging Toolsets
The three malware families in this report trace back to nominally separate DPRK campaigns that increasingly share infrastructure. OtterCookie was originally a Contagious Interview payload, deployed through fake job lures.
ReversingLabs documented PromptMink as a distinct campaign by Famous Chollima, noting that its packages overlap significantly with Contagious Trader.
Our findings confirm that overlap: PromptMink is the dominant family in the Trader delivery network, embedded across 45+ GitHub repos through packages like bn-eslint.js, chalks-logger, prettier-logger, and a dozen other typosquats. OtterCookie appears in Trader repos via packages from a.yal.a.da.ve7, al.lanjaysa.t.i.a.gi, and alberto1114.
Multiple teams have observed this convergence independently. GitLab Threat Intelligence assessed that DPRK malware activity involves distinct teams operating in parallel, based on branching distribution techniques, infrastructure, and malware variants. BlueVoyant described a two-pronged model: targeted fake job offers on one side, broad npm poisoning through crypto bot repos on the other.
The Bait
Malicious repositories don't find victims on their own. The campaign relies on social media promotion to drive developers toward the poisoned repos, making the promotion layer as critical to the kill chain as the malware itself.
We confirmed two X accounts actively promoting malicious GitHub repositories linked to the Contagious Trader campaign. Many more promotional posts likely exist, but tracking is difficult because a significant number of the repos they reference have already been taken down.

Figure 1: Screenshot of X post promoting malicious DPRK-attributed GitHub repository
The promoting profiles appear "verified" with large follower counts, likely inflated by bots. Whether these are DPRK-operated, paid promoters, or unwitting amplifiers, the effect is the same.

Figure 2: Screenshot of verified X profile responsible for the post in Figure 1
In one case, the verified account @RepoGems promoted a repo from Krypto-Hashers-Community, a confirmed PromptMink delivery org that imported bn-eslint.js.
The GitHub org has been taken down, but the promotional tweet remains live. The social media layer persists independently of the GitHub infrastructure it promotes.
We have identified one Reddit instance suggesting the same playbook extends beyond X. In the r/PredictionsMarkets subreddit, a post covering strategies to earn $100K a month received several comments from user Miserable_Variety277 that directly link to a malicious repository.

Figure 3: Screenshot of the r/PredictionsMarket subreddit comments promoting a malicious DPRK-attributed GitHub repository
The repository linked in those comments, which now redirects to polymarket-btc-5min-15min-arbitrage-trading-bot, is still live with its most recent commit published on May 8, 2026, and imports emojiprint-logger - a PromptMink package that appears in KMSec feed as recently as May 3rd.
We can't confidently assess whether these are unwitting amplifiers or DPRK personas.
The GitHub delivery network
The network spans over 100 repositories distributing malware through NPM dependency poisoning. These repos follow the pattern documented by KMSec in the Contagious Trader campaign, targeting Polymarket, PumpFun, Solana, Hyperliquid, and others.
DPRK Developer Personas
One of the most interesting accounts we have tracked in this campaign is lorine93s, which appears on GitHub and NPM. Although the NPM email does not match the GitHub email we found on their profile, the username is the same.
The account is extremely well-polished with a professional developer persona, with links to a personal portfolio hosted on Vercel.
Whether any of this is authentic cannot be verified; the GitHub account may simply be compromised.
The account is responsible for several malicious repositories importing DPRK-attributed packages. As of May 11, 2026, the repositories hosted on this account are updated every few days.

Figure 4: Screenshot of the lorine93s GitHub account
Developer Identity Spoofing and Theft
A sample of repositories revealed that malicious commits are attributed to legitimate open-source developers via $(git config user.name) shell injection. One malicious commit spoofing a known Swedish open-source contributor carries a +0900 timezone offset (UTC+9, consistent with the Korean peninsula). We cross-referenced the claimed developer with their public GitHub activity and found no history of commits to any of the malicious repositories.
In one of the repositories we analyzed, screenshotted below, the commit author field reads $(git config user.name), a failed shell injection that exposes the spoofing technique.

The second technique is outright identity theft. The gigi0500 GitHub account (six PumpFun-themed delivery repos) operates under a stolen developer's name, location, and profile photo with 119 repositories and 283 followers.
Malicious Imports
The malicious payloads are imported in one of two ways: through a direct dependency listing in package.json and/or through a direct import in /src/index.ts.

Figure 5: Malicious NPM import via dependency listing in package.json

Figure 6: Malicious NPM import via createRequire
Repository descriptions are packed with crypto-related keywords to game SEO.

Figure 7: GitHub repository description pattern of SEO stuffed keywords
The repositories serve as delivery fronts for PromptMink, ClipViper, and OtterCookie.
In one case, a single repo imported both bn-eslint.js (PromptMink) and web-http-errors (ClipViper), hitting the developer with both payloads simultaneously.
That repo, tied to CashBlazorLab, was the one promoted in the X post above by @Atenov_D. Most others import one of the three families. Several are forks of each other — the ClipViper section below covers a 40+ fork chain.
The count is not exhaustive. Given the scale of the operation within a single crypto ecosystem, there are likely other targeted ecosystems we have not yet mapped. In one instance, a repository claimed to use OpenClaw as a Polymarket trading bot through this same delivery network.

Figure 8: DPRK-attributed GitHub Repository leveraging OpenClaw keywords
PromptMink Cluster
The repositories in this cluster deliver the credential stealer malware PromptMink, recently documented by ReversingLabs, who tracked its evolution from obfuscated JS to SEA binaries to compiled Rust payloads over seven months. It was built from scratch using LLM-generated code and is distinct from OtterCookie, BeaverTail, and InvisibleFerret.
In our samples, the payload exports a from_str() function that recursively scans the working directory for .env, config.toml, and id.json files, then uploads them to C2 servers via /api/validate/* endpoints.

Most also inject an attacker SSH key into ~/.ssh/authorized_keys and open port 22 via sudo ufw allow 22/tcp for persistent remote access.
The same from_str() exfiltration pattern appears in npm-eslint-helper, which is the payload behind the bn-eslint.js typosquat distributed across the GitHub delivery network, connecting the delivery repos directly to this cluster.
PromptMink Actor Network
We map the NPM actor network distributing the PromptMink malware family below.
Actor | Packages | Notes |
|---|---|---|
lorine93s | picocolor-logger, pinky-logger, chalks-logger, chalk-pro-logger, emojiprint-logger, chalki-pretty | Continuation of sleek-pretty. Two SSH keys rotated across versions. C2 domains A/B tested simultaneously. chalki-pretty links to OTX-confirmed DPRK infrastructure. |
npmpodev0707 | styled-text-logger | OTX-confirmed DPRK C2. Exfiltrates file contents in batches of 50. RSA key po@DESKTOP-EDKDDLL links to devking1616. |
devking1616 | color-logger-console | KMSec-confirmed C2. First socket.io transport in this campaign. podev email prefix mirrors npmpodev0707. |
amauri_jesus | bn-eslint.js, npm-eslint-helper | Same from_str() exfil technique. bn.js typosquat distributed across 20+ GitHub repos. cashblaze1001 email links to CashBlazorLab. |
rafinhossian | big256-ts, npm-doc-dev | Two-layer chain: big256-ts (big.js typosquat) loads npm-doc-dev. 7+ versions, 82 downloads/wk. |
y.rix.elfi.e.co | ts-relayer-pub | New actor, new C2 domain. Same from_str() + file targets + UDP IP probe. |
cryptopawsol | logger-beauty | KMSec watchlist. 302 downloads/wk. |
soju_dev | pino-pretty-logger | Same SSH + file exfil + /api/validate/ pattern. |
aleksislabs | prettier-logger, polymarket-onchain-sdk | SSH backdoor + infostealer. Outlook email (unusual for this campaign). polymarket-onchain-sdk is a direct Polymarket SDK typosquat. |
maklionelox | polymarket-onchain-plugin | Polymarket SDK typosquat. Same from_str() pattern. |
moduler | ts-moduler | Delivered via tradebothub/polymarket-trading-bot. |
ffffrakyevin | api-node-utils, api-ts-utils (v3.x), typescript-util-core | Cluster migration from ClipViper (see ClipViper table). |
ClipViper Cluster
We are introducing the name ClipViper for this cluster. To our knowledge, no public reporting has previously assigned it a family name. It distributes a Windows clipboard stealer we had not seen in DPRK's toolset, delivered through 40+ repositories as of publication.
The malicious behavior was first identified by @MalwareUtkonos on X on May 2nd, in a comment under the fraudulent X post promoting the GitHub repo that imports the malicious npm package.
The ffffrakyevin actor bridges both clusters. Early versions of api-ts-utils (v1.0.0-2.1.4) delivered ClipViper, while later versions (v3.x) switched to PromptMink. Identical build artifacts (the prettier-lint/ directory and cdll-run-hidden.vbs dev paths) confirm this is the same operator as kunwarshivam1971.

Figure 9: MalwareUtkonos on X posting evidence of the malicious behavior found on the CashBlazorLab repository, advertised in Figure 1
On execution, the stealer:
Sends an install beacon (
{"text": "installed"}) tononce-link[.]vercel[.]app/api/noncefor real-time victim countingCopies itself to
%LOCALAPPDATA%\\prettier-lint\\cdll.mjsand launches as a detached child processCreates
cdll-run-hidden.vbsto suppress the console windowRegisters a scheduled task named
CdllProtect(mimicking a system protection service) for persistenceCreates
.cdll-clipboard-worker.lockin the user profile to prevent duplicate instancesContinuously monitors the clipboard and exfiltrates contents to the C2
The ClipViper delivery network operates under the Chain-Ether-Core, Infranova-Labs, and Cryptonerva GitHub organizations, forking CashBlazorLab's repo into 40+ copies with auto-generated names (system-lab-5857, data-pipeline-system-4275, sync-batch-lab-5312), each with ~1k bot-inflated stars and SEO-spammed descriptions.
The main delivery technique is listing web-http-errors as a direct dependency in package.json, making them ClipViper-only delivery fronts. web-http-errors hides its malicious behavior in a transitive dependency, prettier-resolver. The clipboard stealer payloads live in prettier-lint/.

Figure 10: Screenshot of the ClipViper directory and payloads from the live NPM registry.
ClipViper Actor Network
Actor | Packages | Notes |
|---|---|---|
ffffrakyevin | api-ts-utils (v1.0.0–2.1.4) | Confirmed same operator as kunwarshivam1971 via identical build artifacts ( |
kunwarshivam1971 | prettier-resolver, web-http-errors, http-errors-cli | Clipboard stealer payload. First to publish at 07:24 UTC April 21. Six malicious versions in 44 minutes. |
danlo00holoden | classnames-sub-folk, result-type-tool | cashblaze0510 email mirrors CashBlazorLab GitHub org name. Six cover packages in 4-minute burst. result-type-tool chains through classnames-sub-folk as a transitive ClipViper delivery layer. |
OtterCookie Cluster
A third cluster of GitHub repositories distributes the OtterCookie variant we documented in this report. The delivery pattern is the same: one npm account publishes a benign clone of a popular package (often Big.js), which imports a malicious dependency from the same author. The key difference is depth. From the GitHub repo's package.json, the malicious payload sits three dependency hops deep.
OtterCookie Actor Network
Note we are only indicating new actors in the table below. For a full list of IoCs of the OtterCookie campaign in this cluster, read our previous report.
Actor | Packages | Notes |
|---|---|---|
a.yal.a.da.ve7 | bigint.os, lint-null | Dotted-name actor. Two pairs of two-layer big.js typosquat chains. Same obfuscation framework as OtterCookie samples. |
n.ar.a.tat.ia.n.aaa | mjs-biginteger, ts-lint-builders | Dotted-name actor. big-integer typosquat paired with payload. Shared payload hash bcfb01ee... with st-bigintr and cjs-biginteger. |
al.lanjaysa.t.i.a.gi | npm-doc-builder | Dotted-name actor. C2 confirmed as OtterCookie infrastructure. Also documented in OtterCookie report. |
a.n.n.as.ibal2.36 | st-bigintr, sjs-builder | Dotted-name actor. Payload hash bcfb01ee... shared with mjs-biginteger and cjs-biginteger. Solana devnet API abused as C2. |
ca.r.lane.es1.2.6 | cjs-biginteger, ts-lint-builds | Dotted-name actor. Same payload hash bcfb01ee... as st-bigintr and mjs-biginteger. ts-lint-builds confirmed malicious in scanner data. |
ayal.a.d.av.e.7 | sjs-builders, st-biginteger | Dotted-name actor. Near-identical username to |
alberto1114 | lint-builder-logger, ts-big-lib, levex-press | Known actor from 108-packages report. lint-builder-logger is an unobfuscated OtterCookie Rosetta Stone (from_str_1/from_str_2 dual chain). levex-press pivots to bare-IP C2. Reuses documented OtterCookie infrastructure. |
digoschristiann | npm-builders, ts-lint-builder | Dotted-name email pattern (googlemail[.]com). Unobfuscated OtterCookie payload. Shared C2 with alberto1114 and |
a.l.l.a.nh.orca0.7 | bjs-lint-builders | New actor not in prior reporting. Dotted Gmail rotation pattern. Package contacted cloudflareinsights[.]vercel[.]app — confirmed OtterCookie C2 shared with npm-doc-builder and npm-builders. |
jofarc | awesome-cli-builders, awesome-cli-logger, rjs-biginteger | Two-layer chain: rjs-biginteger (big-integer typosquat) loads awesome-cli-builders. awesome-cli-logger confirmed malicious in scanner data. |
Shifting Techniques, a Cat and Mouse Game
As npm scanners improve, the operators adapt.
On May 7, the a.n.n.as.ibal2.36 actor stripped both st-bigintr and sjs-builder down to identical 26-line loaders. The previous versions were full OtterCookie payloads, with 52 kB of obfuscated JavaScript disguised as big.js clones, complete with README and LICENSE files. The new versions contain nothing but a fetch call to the Solana devnet API, which retrieves executable code stored in a blockchain account (4WF8QCFEnVD7BLs3QAVe2SjxRZ4n3EboCsdhj363VAqZ), decodes it from base64, and runs it via new Function().
The npm package now contains no malicious code at all. The payload lives on-chain, where it can be updated without publishing a new package version, and where most static scanners cannot follow.

Figure 11: Solana-based loader
Takeaways & Recommendations
The boundaries between these campaigns are dissolving. IoCs from both Contagious Trader and Contagious Interview should be treated as a single threat.
The malware comes from a small set of operators. The delivery vectors don't. We've seen GitHub orgs get taken down while the same packages keep landing in new repos within hours.
If you cloned a crypto trading bot from GitHub in the past six months, check it against the IoCs in this report. If you ran npm install on a repo you found through social media, assume compromise until proven otherwise.
The full package list, repository table, C2 infrastructure, SSH keys, and detection queries are provided to support immediate triage.
Detection
Linux and Mac
Save the keys from the SSH Keys section to keys.txt, then:
Check for the ufw allow 22/tcp artifact on hosts that don't run SSH:
Hunt for the from_str() exfil pattern, including the deceptive aliases used by ffffrakyevin:
Windows
Pre-install
Block every package in the IoC table at your SCA tool or private registry mirror.
Audit lockfiles for transitive hits. ClipViper's
web-http-errorspullsprettier-resolver; OtterCookie chains nest three deep.In cloned repos, flag commits with
+0900timezone offsets or a literal$(git config user.name)in the author field.
Network
Block every entry in the C2 table at the DNS or proxy layer. From node or npm processes, flag any of the following:
UDP to 8.8.8[.]8:53 with zero bytes sent (PromptMink IP discovery primitive)
HTTP to
api.ipify[.]org,checkip.amazonaws[.]com,icanhazip[.]com, orifconfig[.]mePOST to
/api/validate/*or/api/v1on a.vercel.apphost (PromptMink exfil)POST to
/api/noncewith body{"text": "installed"}(ClipViper install beacon)HTTPS to
api.devnet.solana[.]comduringnpm install(OtterCookie on-chain loader)GET to
/api/ssh-key,/api/scan-patterns, or/api/block-patternsfrom anodeprocess (OtterCookie config fetch)POST to
/api/v1on a bare IP from anodeprocess (OtterCookie file exfil)
YARA Rules
IoCs
Hashes
SHA256 | Name | Note |
|---|---|---|
| prettier-resolver-1.1.5.tgz | npm tarball (kunwarshivam1971) |
| cdll.mjs | ClipViper sample |
| cdll-run-hidden.vbs | VBScript launcher |
| cdll.xml | Task Scheduler XML definition |
| ctll.mjs | ClipViper Dropper |
DPRK-attributed NPM Malicious Packages
Package | Version(s) | npm Account | Cluster | |
|---|---|---|---|---|
api-node-utils | 2.2.4 | ffffrakyevin | frankykevin.dev[@]gmail[.]com | PromptMink |
api-ts-utils | 1.0.0-2.1.4 | ffffrakyevin | frankykevin.dev[@]gmail[.]com | ClipViper |
api-ts-utils | 3.x (3.4.9, 3.5.9) | ffffrakyevin | frankykevin.dev[@]gmail[.]com | PromptMink |
typescript-util-core | 3.5.0-7.1.6 | ffffrakyevin | frankykevin.dev[@]gmail[.]com | PromptMink |
prettier-resolver | 1.1.5-1.2.2 | kunwarshivam1971 | kunwarshivam1971[@]hotmail[.]com | ClipViper |
web-http-errors | 1.3.3, 4.5.1 | kunwarshivam1971 | kunwarshivam1971[@]hotmail[.]com | ClipViper |
http-errors-cli | 1.3.1 | kunwarshivam1971 | kunwarshivam1971[@]hotmail[.]com | ClipViper |
bn-eslint.js | 8.0.5 | amauri_jesus | cashblaze1001[@]gmail[.]com | PromptMink |
npm-eslint-helper | 1.0.1 | amauri_jesus | cashblaze1001[@]gmail[.]com | PromptMink |
classnames-sub-folk | 1.0.0, 3.5.2 | danlo00holoden | cashblaze0510[@]gmail[.]com | ClipViper |
result-type-tool | 2.8.3 | danlo00holoden | cashblaze0510[@]gmail[.]com | ClipViper (depends on classnames-sub-folk) |
prettier-logger | 0.1.5-0.1.6 | aleksislabs | aleksis2026dev[@]outlook[.]com | PromptMink |
polymarket-onchain-sdk | 1.0.3-1.0.4 | aleksislabs | aleksis2026dev[@]outlook[.]com | PromptMink |
polymarket-onchain-plugin | 2.1.4 | maklionelox | maklionelox[@]gmail[.]com | PromptMink |
picocolor-logger | 1.0.0-1.0.2 | lorine93s | milosk920125[@]gmail[.]com | PromptMink |
sleek-pretty | 1.0.0 | lorine93s | milosk920125[@]gmail[.]com | PromptMink |
pinky-logger | 1.0.0 | lorine93s | milosk920125[@]gmail[.]com | PromptMink |
chalks-logger | 1.1.0-1.1.3 | lorine93s | milosk920125[@]gmail[.]com | PromptMink |
chalk-pro-logger | 1.1.1-1.1.2 | lorine93s | milosk920125[@]gmail[.]com | PromptMink |
emojiprint-logger | 1.1.0 | lorine93s | milosk920125[@]gmail[.]com | PromptMink |
chalki-pretty | 1.0.0 | lorine93s | milosk920125[@]gmail[.]com | PromptMink |
styled-text-logger | 1.3.1 | npmpodev0707 | diwatkins1971k[@]gmail[.]com | PromptMink |
color-logger-console | 3.1.8-3.1.9 | devking1616 | podev75926[@]gmail[.]com | PromptMink |
lint-builder-logger | 1.0.4 | alberto1114 | super1114dev[@]gmail[.]com | OtterCookie |
ts-big-lib | 1.3.4 | alberto1114 | super1114dev[@]gmail[.]com | OtterCookie |
levex-press | 1.0.5 | alberto1114 | super1114dev[@]gmail[.]com | OtterCookie |
awesome-cli-builders | 1.0.0 | jofarc | jofarc789[@]gmail[.]com | OtterCookie |
awesome-cli-logger | 1.0.0 | jofarc | jofarc789[@]gmail[.]com | OtterCookie |
rjs-biginteger | 2.0.1 | jofarc | jofarc789[@]gmail[.]com | PromptMink |
npm-doc-dev | 1.0.4-1.1.1 | rafinhossian | rafinhossianlove[@]gmail[.]com | PromptMink |
big256-ts | 5.0.4 | rafinhossian | rafinhossianlove[@]gmail[.]com | PromptMink |
ts-relayer-pub | 1.0.0 | y.rix.elfi.e.co | y.rix.elfi.e.co[@]gmail[.]com | PromptMink |
npm-builders | 1.0.8 | digoschristiann | di.gos.c.hristia.n.n[@]googlemail[.]com | OtterCookie |
ts-lint-builder | 1.0.8-1.0.9 | digoschristiann | di.gos.c.hristia.n.n[@]googlemail[.]com | OtterCookie |
ts-lint-builds | 1.0.5 | ca.r.lane.es1.2.6 | ca.r.lane.es1.2.6[@]googlemail[.]com | OtterCookie |
npm-doc-builder | 1.0.7 | al.lanjaysa.t.i.a.gi | al.lanjaysa.t.i.a.gi[@]gmail[.]com | OtterCookie |
pino-pretty-logger | 1.0.8 | soju_dev | haraldosman.ho[@]gmail[.]com | PromptMink |
logger-beauty | 2.1.1 | cryptopawsol | cryptopawsol[@]gmail[.]com | PromptMink |
ts-moduler | 1.0.5 | moduler | cobily11[@]gmail[.]com | PromptMink |
ts-logger-pack | 1.1.2 | jpeek886 | jpeek886[@]gmail[.]com | PromptMink |
terminal-logger-pack | 0.1.0-1.1.1 | jpeek895 | jpeek895[@]gmail[.]com | PromptMink |
pino-utils | 1.4.0 | satyasu8 | satyasumn8[@]gmail[.]com | PromptMink (SSH key = npmpodev0707) |
@tsjunk/chalk | 5.6.2 | mod_triler | N/A | PromptMink |
@etherprojects/logger | 5.8.1 | michale127 | N/A | PromptMink |
changelog-utils-wrapper | 1.0.0 | chirag_nikolic | chiragnikolic[@]gmail[.]com | PromptMink (ReversingLabs) |
ts-bing | 1.3.1 | v.al.s.o.lo.mon7.0 | v.al.s.o.lo.mon7.0[@]gmail[.]com | PromptMink (C2 = y.rix.elfi.e.co) |
vime-azl | 1.1.4 | v.al.s.o.lo.mon7.0 | v.al.s.o.lo.mon7.0[@]gmail[.]com | PromptMink (payload for ts-bing) |
ts-utils-dev | 1.3.2 | jamesjamesjmaes123 | al.la.n.h.o.rca07[@]gmail[.]com | PromptMink (big.js typosquat) |
gleb-js | 1.2.0 | jamesjamesjmaes123 | al.la.n.h.o.rca07[@]gmail[.]com | PromptMink (payload for ts-utils-dev) |
bigint.os | 5.0.5 | a.yal.a.da.ve7 | a.yal.a.da.ve7[@]gmail[.]com | OtterCookie (big.js typosquat) |
lint-null | 1.0.4 | a.yal.a.da.ve7 | a.yal.a.da.ve7[@]gmail[.]com | OtterCookie (payload for bigint.os) |
mjs-biginteger | 5.0.5 | n.ar.a.tat.ia.n.aaa | n.ar.a.tat.ia.n.aaa[@]gmail[.]com | OtterCookie (big-integer typosquat) |
ts-lint-builders | 1.0.5 | n.ar.a.tat.ia.n.aaa | n.ar.a.tat.ia.n.aaa[@]gmail[.]com | OtterCookie (payload for mjs-biginteger) |
st-bigintr | 5.0.6 | a.n.n.as.ibal2.36 | a.n.n.as.ibal2.36[@]googlemail[.]com | OtterCookie (paired with sjs-builder. Payload hash bcfb01ee... shared with mjs-biginteger + cjs-biginteger) |
cjs-biginteger | 5.0.3-5.0.5 | ca.r.lane.es1.2.6 | ca.r.lane.es1.2.6[@]googlemail[.]com | OtterCookie (payload hash bcfb01ee... shared with st-bigintr + mjs-biginteger) |
sjs-builders | 1.0.4 | ayal.a.d.av.e.7 | ayal.a.d.av.e.7[@]gmail[.]com | OtterCookie (dotted-name actor, near-identical username to |
st-biginteger | 5.0.5 | ayal.a.d.av.e.7 | ayal.a.d.av.e.7[@]gmail[.]com | OtterCookie (big-integer typosquat, not in prior reporting) |
bjs-lint-builders | 1.0.4 | a.l.l.a.nh.orca0.7 | a.l.l.a.nh.orca0.7[@]googlemail[.]com | OtterCookie |
sjs-builder | 1.0.4 |
|
| OtterCookie |
pretty-fancy | 1.0.0-1.0.5 | npm_kei | N/A | PromptMink |
pretty-pino-logger | 1.0.0-2.0.2 | npm_kei | N/A | PromptMink |
js-tree-integer | 1.0.0, 2.6.3, 2.6.7 | amauri_jesus | cashblaze1001[@]gmail[.]com | OtterCookie |
js-integer-log | 1.0.0, 3.6.1 | amauri_jesus | cashblaze1001[@]gmail[.]com | OtterCookie |
DPRK-attributed GitHub Repos
Repo | GitHub User/Org | Theme | Malicious import | Cluster |
|---|---|---|---|---|
/polymarket-trading-bot | CashBlazorLab | Polymarket | bn-eslint.js + web-http-errors | PromptMink + ClipViper |
/polymarket-trading-bot | XHYhappy | Polymarket | bn-eslint.js | PromptMink |
/polymarket-copy-trading-bot | XHYhappy | Polymarket | bn-eslint.js | PromptMink |
/polymarket-ai-trading-bot | XHYhappy | Polymarket | bn-eslint.js | PromptMink |
/polymarket-kalshi-arbitrage-bot-15min-market | XHYhappy | Polymarket | bn-eslint.js | PromptMink |
/polymarket-copy-trading-bot | Symotix | Polymarket | bn-eslint.js | PromptMink |
/polymarket-kalshi-arbitrage-bot-15min-market | syahrayhan | Polymarket | bn-eslint.js | PromptMink |
/polymarket-kalshi-arbitrage-bot-15min-market | Krypto-Hashers-Community | Polymarket | bn-eslint.js | PromptMink |
/polymarket-arbitrage-trading-bot | legit-script-group | Polymarket | bn-eslint.js | PromptMink |
/polymarket-arbitrage-bot | polkadot-org | Polymarket | bn-eslint.js | PromptMink |
/polymarket-ai-trading-bot | polkadot-org | Polymarket | bn-eslint.js | PromptMink |
/polymarket-finance-bot | polkadot-org | Polymarket | bn-eslint.js | PromptMink |
/polymarket-politics-bot | polkadot-org | Polymarket | bn-eslint.js | PromptMink |
/pancakeswap-prediction-bot | madewithai | PancakeSwap | bn-eslint.js | PromptMink |
/pumpfun-mayhem-trading-bot | gigi0500 | PumpFun | bn-eslint.js | PromptMink |
/pumpfun-mayhem-ai-trading-bot | gigi0500 | PumpFun | bn-eslint.js | PromptMink |
/pumpfun-mayhem-copy-trading-bot | gigi0500 | PumpFun | bn-eslint.js | PromptMink |
/pumpfun-mayhem-volume-bot | gigi0500 | PumpFun | bn-eslint.js | PromptMink |
/pumpfun-mayhem-bundler-bot | gigi0500 | PumpFun | bn-eslint.js | PromptMink |
/pumpfun-mayhem-migration-sniper | gigi0500 | PumpFun | bn-eslint.js | PromptMink |
/Polymarket-Arbitrage-Crypto-Trading-Bot-V3 | 0xFives | Polymarket | polymarket-onchain-sdk | PromptMink |
/Pumpfun-Volume-Bot | 0xFives | PumpFun | prettier-logger | PromptMink |
/Raydium-Cpmm-Sniper | 0xFives | Solana | prettier-logger | PromptMink |
/openclaw-ai-polymarket-trading-bot | solcanine | Polymarket | logger-beauty | PromptMink |
/polymarket-impulse-monitoring-trading-bot | solcanine | Polymarket | logger-beauty | PromptMink |
/Polymarket-Sports-Bot | GastonDeMichele | Polymarket | color-logger-console | PromptMink |
/Polymarket-Copytrading-Bot | PoDev-rahulrajasekhar | Polymarket | color-logger-console | PromptMink |
/polymarket-copy-trade-bot | djosk23 | Polymarket | bigint.os + sjs-builder | OtterCookie |
/polymarket-trading-bot-example | LacaveSeb | Polymarket | mjs-biginteger | OtterCookie |
/chain-fetcher-hub | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/system-lab-5857 | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/data-services | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/stack-runtime | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/infra-pipeline-lab | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/sync-batch-lab-5312 | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/hub-suite | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/gateway-stack-5812 | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/system-runtime | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/sync-core | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/service-core | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/stack-system | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/engine-core | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/bridge-core | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/index-lab | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/flux-kit | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/prime-services | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/data-pipeline-system-4275 | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/sync-stack | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/prime-core | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/data-stream-lab-1839 | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/meta-runtime-lab | Chain-Ether-Core | Polymarket | web-http-errors | ClipViper |
/flux-relay-stack | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/core-hub-stack | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/infra-service-system | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/worker-hub-2619 | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/core-lab-7000 | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/runtime-kit | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/pipeline-system | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/fetcher-core | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/flux-batch-stack | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/system-hub-core-536 | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/index-services-2599 | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/dev-platform-4287 | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/infra-index-kit | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/stack-fetcher-lab | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/relay-suite | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/prime-pipeline-system-8633 | Infranova-Labs | Polymarket | web-http-errors | ClipViper |
/prime-suite | Cryptonerva | Polymarket | web-http-errors | ClipViper |
/system-services | Cryptonerva | Polymarket | web-http-errors | ClipViper |
/polymarket-arbitrage | amplify-protocol | Polymarket | api-ts-utils | PromptMink |
/polymarket-arbitrage | TQ-trade | Polymarket | api-ts-utils | PromptMink |
/polymarket-copy-trading-bot | Predictional-Infra | Polymarket | big256-ts | PromptMink |
/polymarket-trading-bot | tradebothub | Polymarket | ts-moduler | PromptMink |
/polymarket-copy-trading-bot | G3-DEV-AGENCY | Polymarket | ts-big-lib | OtterCookie |
/polymarket-copytrading-bot | G3-DEV-AGENCY | Polymarket | ts-big-lib | OtterCookie |
/polymarket-arbitrage-bot | zkOSAI | Polymarket | ts-big-lib | OtterCookie |
/polymarket-trading-bot | soldrift | Polymarket | ts-logger-pack | PromptMink |
/polymarket-copy-trading-bot | Valentioo | Polymarket | ts-logger-pack | PromptMink |
/Sol-marketplace | machenxi | Solana | chalks-logger | PromptMink |
/Polymarket-Trading-Bot-Gabagool | satyasumn7 | Polymarket | pino-utils | PromptMink |
/polymarket-sports-betting-bot | AlgoInfraTech | Polymarket | sleek-pretty | PromptMink |
/polymarket-trading-bot | AlgoInfraTech | Polymarket | @tsjunk/chalk | PromptMink |
/polymarket-trading-bot-copytrading | ScouterInfinite | Polymarket | @etherprojects/logger | PromptMink |
/Polymarket-Arbitrage-Crypto-Trading-Bot | emmarktech | Polymarket | polymarket-onchain-plugin | PromptMink |
/1776507753199 | alpaca-project | Polymarket | ts-bing | PromptMink |
/evm-arbitrage-bot | BNB-Alpha-Community | EVM | ts-bing | PromptMink |
/polymarket-trading-bot | alexandrosmagos | Polymarket | ts-utils-dev | PromptMink |
/polymarket-btc-5min-15min-arbitrage-bot | lorine93s | Polymarket | chalks-logger, emojiprint-logger | PromptMink |
/polymarket-copy-trading-bot | lorine93s | Polymarket | chalks-logger | PromptMink |
/Pumpfun_AI_Trading_Bot | Jackhuang166 | PumpFun | chalks-logger | PromptMink |
/hyberliquid-arbitrage-bot | Jackhuang166 | Hyperliquid | chalks-logger | PromptMink |
/Ethical-GenAI-Framework | praneethreddyy14 | Polymarket | bn-eslint.js | PromptMink |
/Polymarket-Arbitrage-Trading-Bot | Matias123p | Polymarket | changelog-utils-wrapper | PromptMink |
/polymarket-arbitrage-trading-bot | Runtime-Trade-Systems | Polymarket | @tsjunk/chalk | PromptMink |
/polymarket-copy-trading-bot | benja-dev-lab | Polymarket | @tsjunk/chalk | PromptMink |
/polymarket-btc-5min-15min-arbitrage-trading-bot | lorine93s | Polymarket | emojiprint-logger | PromptMink |
/Polymarket-Arbitrage-Crypto-Trading-Bot | AdrianNavaG | Polymarket | polymarket-onchain-sdk | PromptMink |
/Polymarket-Arbitrage-Trading-Bot-Spreadmaker | Corettafinnougricspeaking368 | Polymarket | pretty-fancy | PromptMink |
/polymarket-copytrade | mclaeo | Polymarket | api-ts-utils | PromptMink |
/polymarket-arbitrage | mclaeo | Polymarket | api-ts-utils | PromptMink |
/polymarket-copytrade | rybirdwell | Polymarket | api-ts-utils | PromptMink |
/polymarketarbitrage | rybirdwell | Polymarket | api-ts-utils | PromptMink |
/polymarket-copytrade | Dougthethugg | Polymarket | api-ts-utils | PromptMink |
/polymarketarbitrage | Dougthethugg | Polymarket | api-ts-utils | PromptMink |
/polymarket-copytrade | gisel69 | Polymarket | api-ts-utils | PromptMink |
/polymarketarbitrage | gisel69 | Polymarket | api-ts-utils | PromptMink |
/polymarket-copytrade | kyyook | Polymarket | api-ts-utils | PromptMink |
/polymarketarbitrage | kyyook | Polymarket | api-ts-utils | PromptMink |
/polymarket-arbitrage-bot | JoTalksdxb | Polymarket | cjs-biginteger | OtterCookie |
/polymarket-arbitrage/ | JeanDupuis68 | Polymarket | api-ts-utils | PromptMink |
/polymarket-copytrade | JeanDupuis68 | Polymarket | api-ts-utils | PromptMink |
/prediction-market-copytrade | SXai-lab | Polymarket | api-ts-utils | PromptMink |
/prediction-market-arbitrage | SXai-lab | Polymarket | api-ts-utils | PromptMink |
C2 | Actor | Notes |
|---|---|---|
nonce-link[.]vercel[.]app | ffffrakyevin, kunwarshivam1971, danlo00holoden | Shared clipboard stealer C2 |
mono-link[.]vercel[.]app | ffffrakyevin | api-ts-utils v1-2.1.3 |
polymarkettrading[.]vercel[.]app | ffffrakyevin | KMSec confirmed, api-node-utils |
eslint-helper[.]vercel[.]app | amauri_jesus | File exfil C2 for npm-eslint-helper (confirmed from source) |
eslint-config[.]vercel[.]app | amauri_jesus | Possible C2 rotation or alternate endpoint |
170.205.31[.]203 | ffffrakyevin | AS206216 Advin Services LLC, typescript-util-core |
api.fivefingerz[.]dev | aleksislabs | prettier-logger SSH backdoor + infostealer |
polymarket-clob2[.]blog | lorine93s | Primary C2, A/B rotated with Vercel backend |
polymarket-bots-backend[.]vercel[.]app | lorine93s | KMSec watchlist |
api.mywalletsss[.]store | lorine93s | OTX confirmed DPRK / Contagious Trader |
clob-polymarket[.]com | npmpodev0707 | OTX confirmed DPRK / Contagious Trader |
color-picker[.]live | devking1616 | KMSec confirmed, socket.io transport |
cloudflareinsights[.]vercel[.]app | alberto1114, digoschristiann, al.lanjaysa.t.i.a.gi | OtterCookie C2. SSH key + scan-pattern config server. See OtterCookie report for full infrastructure mapping. |
wallet-management-tg-bot[.]vercel[.]app | alberto1114 | OtterCookie C2. lint-builder-logger from_str_1() file exfil |
208.84.100[.]22 | alberto1114 | OtterCookie bare-IP C2. levex-press v1.0.5, ports 3000 (exfil) / 3001 (config + SSH key). Same /api/v1, /api/ssh-key, /api/scan-patterns, /api/block-patterns endpoint structure as Vercel C2. |
polybot-management-v1[.]vercel[.]app | jofarc | awesome-cli-builders, published 2026-05-05 |
polybot-management-v2[.]vercel[.]app | jofarc | awesome-cli-builders, published 2026-05-05 |
polymarket-api-v2[.]vercel[.]app | rafinhossian | npm-doc-dev file exfil |
polymarket-cli-v2[.]vercel[.]app | rafinhossian | npm-doc-dev SSH key fetch |
cloudflare-protection[.]vercel[.]app | y.rix.elfi.e.co | ts-relayer-pub, new actor |
clob[.]0xundying[.]dev | soju_dev | pino-pretty-logger, new actor |
api.devnet.solana[.]com | a.n.n.as.ibal2.36 | Solana devnet API abused as C2 staging/exfil. OtterCookie cluster. |
https[:]//huggingface[.]co/Lordplay/system-releases/resolve/main/ | jpeek895 | PromptMink cluster |
https[:]//logger[.]clob[.]health | npm_kei | PromptMink cluster |
blxrbn[.]com | npm_kei | PromptMink cluster |
204[.]10[.]194[.]64 | amauri_jesus | OtterCookie |
SSH Keys
Key 1, lorine93s (picocolor-logger, pinky-logger, chalki-pretty, emojiprint-logger, chalks-logger v1.1.3):
Key 2, lorine93s (chalks-logger v1.1.0-1.1.1, chalk-pro-logger v1.1.1):
Key 3, npmpodev0707 (styled-text-logger):
Key 4, devking1616 (color-logger-console):
Key 5, soju_dev (pino-pretty-logger):
Key 6, npm_kei (pretty-pino-logger):
Additional IOCs
IOC | Type | Notes |
|---|---|---|
4WF8QCFEnVD7BLs3QAVe2SjxRZ4n3EboCsdhj363VAqZ | Solana devnet account | Used by st-bigintr ( |
polymarkeths[@]gmail[.]com | Embedded in lorine93s SSH Key 2 comment, not an npm account | |
DESKTOP-EDKDDLL | Windows hostname | Leaked in npmpodev0707 SSH key, links to devking1616 |
DESKTOP-VFF5DKR | Windows hostname | Leaked in soju_dev SSH key |
/api/validate/* | URL path pattern | Universal C2 endpoint across all PromptMink actors |
{"text": "installed"} | Beacon payload | ClipViper install-time victim tracking |
| ClipViper persistence | Clipboard stealer payload |
| ClipViper persistence | Dropper payload |
| ClipViper persistence | Task configuration |
| ClipViper persistence | VBScript launcher, suppresses console |
| ClipViper persistence | Instance lockfile |
CdllProtect | ClipViper persistence | Scheduled task, mimics system service |
| OPSEC artifact | Attacker dev path in cdll-run-hidden.vbs, identical in api-ts-utils + prettier-resolver |
| OPSEC artifact | Attacker Node.js install path |
pip-lint | OPSEC artifact | Original project name before rename to prettier-lint |
0x0-github | OPSEC artifact | Attacker GitHub workspace directory |
DESKTOP-4TO2VRJ | Windows hostname | Leaked in pretty-pino-logger |
References
Panther Labs, Polymarket Trader Funds at Risk, April 2026
Panther Labs, Inside DPRK's npm malware factory, April 2026
Panther Labs, Tracking an OtterCookie Infostealer Campaign Across npm, April 2026
KMSec, Contagious Trader campaign, March 2026
ReversingLabs, PromptMink malware analysis
@stephenlacy, CashBlazorLab malware analysis thread, May 2026
@MalwareUtkonos, prettier-resolver IOC analysis, May 2026
Socket.dev, bn-eslint.js malware alert
SafeDep, Malicious redeem-onchain-sdk npm Targets Crypto Wallets, April 2026
BlueVoyant TFCTI, OtterCookie: Shifty Corsair's Bifurcated Attack Strategy, May 2026
GitLab Threat Intelligence, North Korean tradecraft on GitLab, February 2026
Walmart Global Tech, Mapping OtterCookie Infrastructure, April 2026
Microsoft Security Blog, Contagious Interview malware delivered through fake developer job interviews, March 2026
Ready to learn more about Panther? Book a demo and speak with our team.
Share:
RESOURCES






