GitHub Advisory malware sweep - 2026-09-13/14 (`chroma-client` continues `2026-09-openaii` AI SDK typosquat wave, `python-fork` PyPI fork bomb, `job-iteration` npm CWE-506, huge `joko-*` Indonesian-food tea.xyz spam explosion with autopublish sources `joan-teadev`/`joknmax`, `joint_*_z3n`/`_0xrequest` continuation, `joker123`/`joker388` casino spam)
GHSA 2026-09-13/14: PyPI chroma-client extends the 2026-09-openaii typosquat wave (chromadb typosquat, same infostealer+cryptominer payload as openaii/langgrap/transfomers/ollamaa); PyPI python-fork is a plain import-time fork bomb; npm job-iteration flagged as CWE-506 malware. Otherwise the day is a massive tea.xyz autopublish spam wave — hundreds of joko-{Indonesian food}-{suffix} names sourced from joan-teadev/joknmax autopublish scripts, plus joint_*_z3n/joint_*_0xrequest continuation of the 2026-09-11 family_*_z3n operator and joker123/joker388 casino-themed spam.
- Incident type
- Advisory sweep. A dated batch of GitHub Advisory Database malware entries collected together. A sweep mixes kinds - typosquats, dependency-confusion probes, boilerplate takedowns with no published analysis, and occasionally real payloads - and its severity reflects the worst confirmed item, not the batch as a whole.
- Detected by
- GitHub Advisory Database · OpenSSF malicious-packages · OpenSSF Package Analysis · amazon-inspector
- Also known as
- 2026-09-14 GHSA npm/PyPI sweep · 2026-09-openaii AI SDK typosquat wave (chroma-client extends) · 2026-09-python-fork PyPI fork bomb · job-iteration npm CWE-506 · joko-* Indonesian-food tea.xyz autopublish spam wave · joan-teadev / joknmax autopublish source packages · joint_*_z3n / joint_*_0xrequest continuation (2026-09-11 family_*_z3n operator) · joker123 / joker388 casino spam
- Ecosystems
- npmPyPI
- Packages tracked
- 58
What happened
Between roughly 2026-09-12 12:00 UTC and 2026-09-14 06:00 UTC, GitHub Advisory Database published one critical continuation of a live active campaign (Cluster A chroma-client — fifth confirmed package in the 2026-09-openaii AI-SDK typosquat wave that Wiz, OpenSSF, Amazon Inspector and Snyk started documenting yesterday), one small-but-real DoS package (Cluster B python-fork fork bomb), one CWE-506 boilerplate npm entry with a plausible cross-ecosystem-typosquat theory (Cluster C job-iteration), and an unusually large tea.xyz autopublish spam explosion organised around Indonesian food names (Cluster D joko-*) plus continuation of prior spam operators (Clusters E-G).
Cluster A - chroma-client (continues 2026-09-openaii AI SDK typosquat wave, chromadb typosquat)
chroma-client<=0.5.7 (GHSA-qp4x-pg53-7xh8) is a PyPI typosquat of chromadb, the official Python client for the Chroma vector database that is a standard component of retrieval-augmented-generation (RAG) pipelines. The GHSA advisory explicitly notes the package "uses exactly the same technique as other packages from the campaign aiming to mislead LLM security tools" — attributing it to the ongoing 2026-09-openaii campaign that this file series has been tracking since 2026-09-12.
Payload shape (per shared campaign fingerprint):
- Import-time (or
.pth-triggered) hook downloads a remote script - Second stage is heavily obfuscated, explicitly designed against AI-based static analysers
- Exfiltrates SSH keys,
~/.aws/credentials, GCP ADC, Azure profile - Installs a cryptominer
- Installs a persistence mechanism (campaign siblings use systemd user units and shell-rc autoruns)
- Clears logs / covers tracks
Campaign fingerprint (five confirmed packages so far, plus a DNS-staged loader sibling):
| Date | Package | Typosquat of | GHSA | Source hash |
|---|---|---|---|---|
| 2026-09-12 | langgrap@0.2.45 | langgraph | GHSA-crjm-2g45-pq97 | 80943fa8…744b1db9 |
| 2026-09-12 | openaii<=1.55.3 | openai | GHSA-q5h5-h6mj-vhgv | c49a2850…21e79120 |
| 2026-09-12 | transfomers@4.44.2 | transformers | GHSA-2p95-qvc5-6rjq | c6a3963d…9befec9a |
| 2026-09-12 | ollamaa@0.4.2 | ollama | GHSA-9gv4-vfjg-jjrm | (not disclosed) |
| 2026-09-12 | platform-telemetry-client@1.0.0 (DNS-staged, aborted) | — | GHSA-7767-763c-fxp3 | 7464733f…3cb0a0eb |
| 2026-09-13 | chroma-client<=0.5.7 | chromadb | GHSA-qp4x-pg53-7xh8 | f74658eb…fe2e5153 |
The combined pick chromadb + langgraph + openai + transformers + ollama covers the exact stack an AI-agent developer will pip install in one session. Treat this campaign as actively expanding and pin every AI/ML SDK explicitly with hash-pinned requirements files. Also see: full technical breakdown of the wave in multi-2026-09-12-ghsa-malware-sweep.ts (Cluster C).
Cluster B - python-fork (PyPI fork bomb, 2026-09-python-fork campaign)
python-fork@0.1.0/0.1.1 (GHSA-v8v2-jgrm-w335) — importing the module starts a fork bomb, exhausting the process table and CPU until the host is unresponsive or crashes. This is a pure availability attack; there is no data-theft payload. Amazon Inspector source hash 0bff8869…186c1e78. Campaign label 2026-09-python-fork (MAL-2026-16142). Reported by OpenSSF via kam193 / bad-packages.kam193.eu.
Because the fork bomb executes on import (not at install), --ignore-scripts and pip install --no-build-isolation do NOT prevent detonation on a host that later imports the module. The only reliable mitigation is not to install it in the first place — pin an explicit denylist entry on internal PyPI mirrors and require a hash-pinned requirements file for any Python-fork-adjacent dependency.
Cluster C - job-iteration (npm CWE-506 boilerplate; possible Shopify Ruby-gem lookalike)
job-iteration@* (GHSA-jh9v-79h6-prqm) — npm package flagged by OpenSSF Package Analysis with the standard CWE-506 "embedded malicious code" boilerplate. No published payload analysis, no IOCs beyond the takedown itself, MAL-2025-23828.
What makes this worth calling out separately from the general spam floor: there is no legitimate npm job-iteration publisher, and the name is a near-exact match for Shopify's widely-used job-iteration Ruby gem for iterating Sidekiq jobs safely. The most plausible read is a cross-ecosystem lookalike / dependency-confusion probe aimed at a developer who remembers "job-iteration" as a queue-iteration library and searches npm for it. Treat as medium pending payload analysis; ignore-scripts + a private-registry scope rule that blocks bare-name npm resolution for any name your org uses in another ecosystem blocks it entirely.
Cluster D - joko-{Indonesian-food}-{suffix} npm tea.xyz autopublish spam explosion (hundreds of packages, source scripts published same day)
2026-09-13 saw an unusually large tea.xyz token-farming autopublish spam wave organised around Indonesian street-food names. Naming grammar:
joko-<dish><n>-<suffix>where the dish word is one of klanting, ketan, ketoprak, kepok, keripik, keraktelor, kemplang, botok, bakwan, asinan, or bakso; <n> is a small integer; and <suffix> cycles through breki, miaww, riris, ruro, apidev, sukiwir, sluey, remi. GHSA published hundreds of these on 2026-09-13; a representative sample is enumerated in the packages map below.
The autopublish source packages joan-teadev and joknmax were flagged the same day — these are what actually contain the loop:
joan-teadev@*(GHSA-rmm9-rq4q-rhh9) — hashc844cc33…01d531f3. Containsauto.js,autopublish.js,autopublish2.js,autopublish3.js; modifiespackage.json(removes"private": true, bumps version, publishes) and cycles derivative names.joknmax@*(GHSA-rwc2-pm3r-wx4g) — hash8111feb6…45745e4. Identical autopublish shape.
Both are attributed to the tea.xyz token-reward campaign that pays out to publishers of "distinct" npm packages regardless of content. This wave is materially larger than the 2026-09-11 fancy_*_z3n batch but uses a different naming grammar; it is the same operator category but not necessarily the same wallet. Remove the source packages first — that stops the autopublish loop faster than chasing every joko-* name individually.
Cluster E - joint_{animal}_z3n / joint_{animal}_0xrequest (continues 2026-09-11 family_*_z3n operator, new prefix)
Same tea.xyz auto-publish shape and same _z3n / _0xrequest operator-suffix conventions documented in 2026-09-11 Cluster J. New prefix joint_ with animal words (hedgehog, panther, hookworm, elephant, pony, raccoon, sheep, swan, porpoise, perch, primate, tortoise). Continue applying the _z3n$ / _0xrequest$ regex denylist from 2026-09-11 to internal mirrors; this file does not re-enumerate every name.
Cluster F - joker123 / joker388 casino-themed spam singletons
Four singletons — joker123, joker123-slot, joker123-gaming, joker388 — flagged with the standard CWE-506 boilerplate. "Joker123" and "Joker388" are real online-slot brands widely SEO-targeted in the Indonesian and broader SE-Asian online-gambling market, which is a plausible source of the naming choice (whether the intent is SEO-farm placeholders, spam, or something else, no published payload analysis is available). Ignore-scripts blocks any preinstall behaviour they might carry.
Cluster G - jnmirdcugstvxqaz random-string singleton
Single random-string name (jnmirdcugstvxqaz), CWE-506 boilerplate, no published payload. Matches the "brand-new fresh-npm-account with autogenerated name" pattern seen throughout the year. Ignore-scripts is sufficient mitigation for this class.
Cross-operator patterns worth flagging
- The
2026-09-openaiicampaign is expanding on a daily cadence — five confirmed packages plus a DNS-staged loader in three days, targeting the exact AI/ML SDK stack RAG developers install. Pin every AI/ML SDK explicitly with hash-pinned requirements files, block the campaign names on internal mirrors, and add a strict-name-match rule forchromadb/openai/langgraph/langchain/transformers/ollama/anthropicat your organisation's Python resolution layer. - Tea.xyz spam volume shows no sign of slowing — 2026-09-11 hundreds of
family_*_z3n; 2026-09-13 hundreds ofjoko-*. Kill the SOURCE packages (joan-teadev,joknmaxtoday; the equivalent source on 2026-09-11) rather than chasing derivatives. - Cross-ecosystem lookalikes are a real subclass (Cluster C). Any name your org uses in another ecosystem should not resolve on npm from a bare name.
Registry state
All packages in Clusters A-C and the specific enumerated singletons in Clusters F/G are flagged as malware on npm / PyPI and quarantined at the time of writing. Cluster D joko-* and Cluster E joint_* tea.xyz spam is auto-republished continuously under fresh derivative names under the same operator infrastructure; only prefix / regex denylists on internal mirrors are durable mitigation.
Discovery credits
GitHub Advisory Database, OpenSSF malicious-packages, OpenSSF Package Analysis, amazon-inspector (via kam193 / bad-packages.kam193.eu). Per-package IOC details drawn verbatim from GHSA advisory bodies published between 2026-09-12 and 2026-09-14 UTC.
Affected packages (58)
- PyPIchroma-client<=0.5.7
- npmjnmirdcugstvxqaz*
- npmjoan-teadev*
- npmjob-iteration*
- npmjoint_elephant_z3n*
- npmjoint_hedgehog_z3n*
- npmjoint_hookworm_z3n*
- npmjoint_panther_z3n*
- npmjoint_perch_0xrequest*
- npmjoint_pony_z3n*
- npmjoint_porpoise_0xrequest*
- npmjoint_primate_0xrequest*
- npmjoint_raccoon_z3n*
- npmjoint_sheep_z3n*
- npmjoint_swan_z3n*
- npmjoint_tortoise-appteadev*
- npmjoker123*
- npmjoker123-gaming*
- npmjoker123-slot*
- npmjoker388*
- npmjoknmax*
- npmjoko-asinan24-riris*
- npmjoko-asinan36-riris*
- npmjoko-asinan56-sluey*
- npmjoko-asinan6-sluey*
- npmjoko-asinan99-breki*
- npmjoko-bakso14-miaww*
- npmjoko-bakso39-sukiwir*
- npmjoko-bakso41-sukiwir*
- npmjoko-bakso42-breki*
- npmjoko-bakwan60-breki*
- npmjoko-bakwan85-riris*
- npmjoko-botok25-sluey*
- npmjoko-botok45-breki*
- npmjoko-keraktelor64-breki*
- npmjoko-keraktelor75-breki*
- npmjoko-keripik1-apidev*
- npmjoko-keripik33-riris*
- npmjoko-keripik43-sukiwir*
- npmjoko-keripik55-sluey*
- npmjoko-keripik64-sluey*
- npmjoko-keripik88-riris*
- npmjoko-keripik89-sluey*
- npmjoko-keripik93-miaww*
- npmjoko-ketan28-sukiwir*
- npmjoko-ketan29-breki*
- npmjoko-ketan40-breki*
- npmjoko-ketan94-breki*
- npmjoko-ketoprak31-breki*
- npmjoko-ketoprak39-breki*
- npmjoko-ketoprak70-breki*
- npmjoko-ketoprak89-breki*
- npmjoko-klanting28-sluey*
- npmjoko-klanting55-breki*
- npmjoko-klanting57-breki*
- npmjoko-klanting70-riris*
- npmjoko-klanting72-miaww*
- PyPIpython-fork0.1.00.1.1
These are usually pulled in as transitive dependencies rather than installed directly. Check your whole tree at once - it runs in your browser and nothing is uploaded.
Impact
- Cluster A —
chroma-clientPyPIchromadbtyposquat (continues2026-09-openaiicampaign, same operator asopenaii/langgrap/transfomers/ollamaa):chroma-client<=0.5.7(GHSA-qp4x-pg53-7xh8) is a typosquat of the legitimatechromadbclient (the standard Python SDK for the Chroma vector database used in RAG pipelines). The advisory explicitly notes it "uses exactly the same technique as other packages from the campaign aiming to mislead LLM security tools" — the same second-stage-download, AI-scanner-aware obfuscation, cryptomining, SSH-key/~/.aws/credentials/GCP ADC/Azure profile exfiltration, persistence, and log-clearing pattern documented in yesterday's Cluster C (2026-09-12 sweep). Amazon Inspector source hashf74658eb…fe2e5153. Campaign label2026-09-openaii(MAL-2026-16143). This is now the fifth confirmed package in the wave (openaii,langgrap,transfomers,ollamaaon 2026-09-12, plusplatform-telemetry-clienton 2026-09-12; sixth counting the sibling DNS-staged loader) - Cluster B —
python-forkPyPI fork bomb (2026-09-python-forkcampaign):python-fork@0.1.0/0.1.1(GHSA-v8v2-jgrm-w335) — importing the module starts a fork bomb, exhausting process-table and CPU resources until the host is unresponsive or crashes. Not a data-theft payload; a plain availability attack against any system that imports the package. Amazon Inspector source hash0bff8869…186c1e78. Campaign label2026-09-python-fork(MAL-2026-16142). Same operator infrastructure as OpenSSFbad-packages.kam193.euPyPI batch of the same day - Cluster C —
job-iterationnpm CWE-506 boilerplate (possiblejob-iterationShopify Ruby gem lookalike):job-iteration@*(GHSA-jh9v-79h6-prqm) — npm package flagged by OpenSSF Package Analysis with the standard CWE-506 "embedded malicious code" boilerplate; no published payload analysis. Name matches Shopify's widely-usedjob-iterationRuby gem for iterating Sidekiq jobs. There is no legitimate npmjob-iterationpublisher, so this is most plausibly a cross-ecosystem lookalike / dependency-confusion probe aimed at developers searching npm for what they remember as a Ruby library. Treat asmediumpending payload analysis; ignore-scripts + private-registry pinning blocks it entirely. Campaign label MAL-2025-23828 - Cluster D — Massive
joko-{Indonesian-food}-{suffix}npm tea.xyz autopublish spam (hundreds of packages, source scripts published): An unusually large 2026-09-13 wave of tea.xyz token-farming autopublish spam. Naming patternjoko-<indonesian-dish-word><small-int>-<suffix>where the dish word cycles throughklanting,ketan,ketoprak,kepok,keripik,keraktelor,kemplang,botok,bakwan,asinan,baksoand the suffix cycles throughbreki,miaww,riris,ruro,apidev,sukiwir,sluey,remi. The AUTOPUBLISH SOURCE packagesjoan-teadev@*(GHSA-rmm9-rq4q-rhh9) andjoknmax@*(GHSA-rwc2-pm3r-wx4g) were flagged the same day and are what actually contain the autopublish scripts (auto.js,autopublish.js,autopublish2.js,autopublish3.js); the joko-* names are the derivative packages the autopublish loop generates.joan-teadevsource hashc844cc33…01d531f3;joknmaxsource hash8111feb6…45745e4 - *Cluster E —
joint_{animal}_z3n/joint_{animal}_0xrequestnpm continuation (2026-09-11 `family__z3noperator, new prefix)**:joint_hedgehog_z3n,joint_panther_z3n,joint_hookworm_z3n,joint_elephant_z3n,joint_pony_z3n,joint_raccoon_z3n,joint_sheep_z3n,joint_swan_z3n,joint_perch_0xrequest,joint_porpoise_0xrequest,joint_primate_0xrequest,joint_tortoise-appteadev. Same_z3n/_0xrequestsuffix and same tea.xyz auto-publish shape documented in 2026-09-11 Cluster J (fancy__z3n,famous__z3n,familiar__z3n,fantastic__z3n). Continue to apply the_z3n$/_0xrequest$` regex denylist rules from 2026-09-11 to internal mirrors; no per-name enumeration here - Cluster F —
joker123/joker388npm casino-themed spam singletons:joker123@*(GHSA-6gmp-rvjx-wv93),joker123-slot@*(GHSA-3p35-jmvr-q36r),joker123-gaming@*(GHSA-w7mq-frpg-3qw6),joker388@*(GHSA-p9qp-fxrq-ch3w). Same CWE-506 boilerplate; names read as SEO-farm placeholders for Indonesian/SE-Asian online casino brands ("Joker123" / "Joker388" are real online-slot brands widely SEO-targeted in that region). No published payload analysis; treat as spam/beacon consistent with the wider tea.xyz mixed-name spam floor - Cluster G —
jnmirdcugstvxqaznpm random-string singleton:jnmirdcugstvxqaz@*(GHSA-7r7p-23fg-8m87) — CWE-506 boilerplate flag with no published payload analysis. Random-string name shape matches the auto-generated "brand-new fresh-npm-account" pattern seen throughout the year. Treat as tea.xyz spam floor
What to do
- 1Grep every
package-lock.json,yarn.lock,pnpm-lock.yaml,package.json,requirements.txt,poetry.lock, andPipfile.lockin your org for the specific package names in Clusters A-C below. Uninstall on hit, wipenode_modules/ the affected venv, delete the lockfile, rebuild against a clean cache, and rotate every credential the affected host could have touched - 2For Cluster A
chroma-client: any Python environment that installedchroma-client<=0.5.7executed the operator-supplied2026-09-openaiisecond-stage payload, meaning SSH keys,~/.aws/credentials, GCP ADC, and Azure profile were exfiltrated and a cryptominer + persistence were installed. Rotate every credential from the affected host and search for persistence (the campaign uses systemd user units and shell-rc autoruns). Pin the real upstreamchromadbexplicitly with a hash-pinned requirements file. Addchroma-client(with the wrong hyphen) to any AI/ML-stack pipeline denylist alongsidelanggrap/openaii/transfomers/ollamaafrom yesterday - 3For Cluster B
python-fork: hosts that importedpython-fork@0.1.0/0.1.1may need a hard reboot to recover — this is a resource-exhaustion DoS, not a data-theft payload, so credential rotation is not required. Remove the package, then auditrequirements.txtfor any dependency accidentally pinning to it.--ignore-scriptsdoes NOT block this — the fork bomb runs on import, not at install - 4For Cluster C
job-iteration(npm): any org that uses Shopify'sjob-iterationRuby gem should audit npm dependencies for a mistakennpm install job-iteration— remove the npm package and pin the Ruby gem viaGemfilewhere the queue-iteration behaviour actually lives. Configure private-registry scope resolution to block bare-name npm resolution for any name your org uses in another ecosystem - 5*For Cluster D `joko-
tea.xyz spam**: apply regex denylist^joko-(klanting|ketan|ketoprak|kepok|keripik|keraktelor|kemplang|botok|bakwan|asinan|bakso)\d*-(breki|miaww|riris|ruro|apidev|sukiwir|sluey|remi)$to internal npm mirrors, and separately blockjoan-teadevandjoknmax(the autopublish SOURCE packages that actually contain the loops). Reportjoan-teadevandjoknmax` to npm for takedown priority — removing the source packages stops the autopublish loop faster than chasing every derivative - 6*For Cluster E `joint__z3n
/joint__0xrequest`*: same as 2026-09-11 Cluster J — apply_z3n$/_0xrequest$regex rules to internal mirrors - 7For Cluster F/G
joker123etc. singletons: single-name deny is enough; no operator-durable IOC beyond the names themselves - 8For every
npm installandpip installin CI, prefer--ignore-scripts/--no-build-isolation(pip 23+) or an equivalent lockfile-consumer mode that blocks preinstall/postinstall/setup.py payloads. This does NOT block Cluster A (a Python.pthfile loader runs on interpreter startup, and Chroma package imports run at import time) or Cluster B (import-time fork bomb). Use hash-pinned requirements files for AI/ML stacks - 9Add every specific name below to internal private-registry deny-lists for at least 30 days to prevent re-uploads by rotating operators. Extend the tea.xyz prefix/regex denylist from the 2026-09-11 sweep with the
joko-*andjoint_*patterns from Clusters D and E
References
- GitHubGitHub Advisory Database - recent malware advisoriesgithub.com
- GitHubGHSA-qp4x-pg53-7xh8 - chroma-client (Cluster A - 2026-09-openaii AI SDK typosquat wave, chromadb typosquat)github.com
- GitHubGHSA-v8v2-jgrm-w335 - python-fork (Cluster B - PyPI fork bomb)github.com
- GitHubGHSA-jh9v-79h6-prqm - job-iteration (Cluster C - npm CWE-506 boilerplate)github.com
- GitHubGHSA-rmm9-rq4q-rhh9 - joan-teadev (Cluster D - tea.xyz autopublish SOURCE package)github.com
- GitHubGHSA-rwc2-pm3r-wx4g - joknmax (Cluster D - tea.xyz autopublish SOURCE package)github.com
- GitHubGHSA-6gmp-rvjx-wv93 - joker123 (Cluster F - casino-themed spam)github.com
- GitHubGHSA-3p35-jmvr-q36r - joker123-slot (Cluster F)github.com
- GitHubGHSA-w7mq-frpg-3qw6 - joker123-gaming (Cluster F)github.com
- GitHubGHSA-p9qp-fxrq-ch3w - joker388 (Cluster F)github.com
- GitHubGHSA-7r7p-23fg-8m87 - jnmirdcugstvxqaz (Cluster G - random-string singleton)github.com
- OpenSSFOpenSSF malicious-packages repositorygithub.com
- GitHubPrior day: 2026-09-openaii wave technical breakdown (Cluster C in the 2026-09-12 sweep)github.com