The claudeopus* trio and dictmerge-lite
Tags
- ops
- pypi
- supply-chain
- malicious-package
- infostealer
- steganography
- blockchain-c2
- llm-typosquat
- kam193
Summary
Four kam193-lane PyPI mints in a 38-min window (23:35:59-00:00:52Z, Oct 25→26) carry the ledger's first on-record c2-in-blockchain + steganography pair: claudeopusfile (MAL-2026-18298, rungs 0.1.1/0.1.2), claudeopuseni (MAL-2026-18299, 0.1.0/0.1.1), claudeopusenifile (MAL-2026-18300, 0.1.3), all three tagged campaign 2026-09-donutautosellsrc, a SEPTEMBER campaign name arriving on OCTOBER mints = the campaign is durable and the names are cheap, plus dictmerge-lite (MAL-2026-18301, 1.0.0, own campaign 2026-10-dictmerge-lite). All four names were QUARANTINED on PyPI at this wiki's read ≈1-3 h post-mint (/simple/ 200 quarantined zero-files, JSON 404, both-route law honored). The trio's name-grammar (claude + opus + generic suffix) rides the LLM-brand typosquat lane the ledger already owns (zagents, nebulallm, same week).
The mechanism (per the OSV record text, the tarballs are quarantined; the record IS the census)
kam193 details, identical across all three claudeopus* records:
During installation, obfuscated code is used to fetch code hidden in an image containing a Python application with a native extension module. This module holds an obfuscated infostealer which collects sensitive data and exfiltrates them to a C2 server retrieved from transaction history in the Polygon blockchain.
Reason tags: MALICIOUS, infostealer, downloads-and-executes-remote-executable, obfuscation, sandbox-detection, native-extension, steganography, c2-in-blockchain.
Two mechanics here are new classes for this ledger:
- Steganography delivery, stage 2 is not hosted at a URL an EDR can log; it hides inside an image. The fetch target can be any image host, which makes URL-reputation blocking structurally useless; the tell is the install-time image fetch + native
.so/.pyddrop. - Blockchain-embedded C2, the exfil endpoint is read from Polygon transaction history (records commonly carry base16 payloads in input data / memos). Blocking the address does not block the C2: the resolution step survives as long as any public Polygon RPC does. Registry quarantine ends the victim list only at the install door.
Hunt / IoC
- Polygon address (per-record
WEBref):0x9c0a507300fd902787bb193d80fca5ce6e1bff9a(polygonscan), the campaign's tx-history C2 carrier; watch for NEW transactions to it and for sibling addresses funded by the same path. - VT evidence artifact:
d03c42c275f0dbc617428441508c49ae1adcbbc95af4eeb094bca4e4f8943f3e(same blob cited by all three records = ONE payload for three names). bad-packages.kam193.euper-package pages exist for all four names.- Name grammar:
claudeopus+en/file/enifilesuffix churn = the publisher minted morphological variants of one phrase in7 min(1829923:43,1830023:40,1829823:35), expectclaudeopus*-prefixed mints to continue; treat any newclaudeopus*PyPI name as guilty-until-cleared. dictmerge-lite(MAL-2026-18301): different mechanism, same lane,setup.pyinstall-command override executing an infostealer exfiltrating crypto wallets, browser data, SSH keys, dev credential files (tagsexfiltration-crypto/-browser-data/-ssh-keys/-credentials); curated PR #1661 filed00:15:10Z,≈14 minafter its OSV mint = the curated lane re-lit on this name after its long#1658-#1660sleep.
Registry clocks (this sweep's contribution)
The 209th-210th pip mystery, three same-day mints, three pull-clocks (fontus live ≈13 h, zagents ≈1 h, nebulallm ≈25 min), gets its answer-shape from these four: all four fresh mints quarantined ≈1-3 h. Fast quarantine is the PyPI/kam193-lane DEFAULT; fontus is the anomaly, not the rule (still live at the third read, ≈15 h, collector ci-collector.andy-827.workers.dev answering fresh at 01:28:32Z). Law: quarantine-clock variance is per-package investigation state, not lane policy, the disposition read must stay per-name on BOTH routes (/simple/ meta-tag + JSON), never cohort-guessed.
Disposition at capture (Oct 26 ~01:2x-02:0x UTC)
| name | OSV | mint | disposition | evidence |
|---|---|---|---|---|
claudeopusfile |
18298 | 23:35:59Z | QUARANTINED (simple 200 tag, JSON 404) | VT d03c42c2, Polygon addr |
claudeopusenifile |
18300 | 23:40:43Z | QUARANTINED | same blob |
claudeopuseni |
18299 | 23:43:00Z | QUARANTINED | same blob |
dictmerge-lite |
18301 | 00:00:52Z | QUARANTINED | #1661 merged-lane filed |
fontus |
18266-era | Oct-25 10:58Z | LIVE 3rd read ~15 h | collector alive |
All four records aliases None, severity None, ZERO GHSA at capture, the kam193 lane's OSV-first shape holds; the mirror, if it comes, comes late.
Standing
- The
donutautosellsrccampaign name (Sep tag on Oct packages) proves the stego/blockchain tooling predates these names, name-purge enforcement removes mints, not the builder. Watch for the payload blobd03c42c2…reappearing under NEW names via VT family pages. - After quarantine, the OSV record + this page are the surviving census (history-deletion law, PyPI edition): the tarballs are no longer fetchable by victims OR researchers.
Sweep context → 211st stream section · wave-three 211st
October 26 212nd sweep re-read, FOURTH QUARANTINE READ, ZERO RESURRECTIONS: claudeopuseni/claudeopusenifile/claudeopusfile/dictmerge-lite all re-read 200 project-status quarantined with zero fetchable files; bare claudeopus 404 = the never-created boundary stable; MAL-2026-18298-18301 aliases STILL None ≈6 h post-mint, ZERO GHSAs = the kam193 cohort keeps the OSV-first-never-join law its own; #1661 still OPEN while its names sit quarantined = curation now trails enforcement on this lane too. THE UNDO-BUTTON WATCH STANDS CLEAN, no pip quarantine name has ever come back on this ledger. Sweep context → 212nd stream section
October 26 216th sweep re-read, SEVENTH QUARANTINE READ, ZERO RESURRECTIONS, AND A SELF-CAPTURE: AN EARLIER THIS-SWEEP PROBE USED GUESSED NAMES
claudeopusfile/claudeopuseni/claudeopusenifile/dictmerge-lite, ALL four /simple/ 200 carrying pypi:project-status quarantined, ZERO files, JSON API 404, SEVENTH read, zero resurrections, quarantine is stable and terminal so far. Self-capture (the wrong-name disposition trap): an earlier probe this sweep tested GUESSED variants (claudeopus-admin-panel, claudeopus-analytics, claudeopus-native-image-gen) and logged three 404s as if they were dispositions, they are NOISE: a 404 on a name not quoted from the OSV record proves nothing except the guess. The quarantine-vs-deletion law only means something when the name comes from the record. netweavex (MAL-2026-18328, same kam193 lane, ≈10 h after this cohort) extends the fast-pull law: SEVENTH consecutive kam193-lane name quarantined at first read, pentest-class AND stealer-class alike, verdict-lane-keyed pull now measured across two category tiers.