GitHub Advisory malware sweep, 28 August 2026
31 new GHSA malware advisories in the 24h window ending 2026-08-28. Highlights: 4 flyteplugins-* PyPI packages all published at the identical exact version 2.6.10 - a dependency-confusion probe against Union.ai / Flyte internal package namespaces; PyPI discordnv@0.8.0 steals Discord tokens plus DPAPI-decrypts Roblox cookies with full Discord-webhook + Google-Apps-Script + registry-persistence IOCs; PyPI sap-quarterly-report + ekx-report-utils share a DNS-exfil campaign; npm @postman-cse/okta-aio-darwin-arm64 reads as a Postman internal okta-aio binary namespace hit.
Published 28 Aug 2026 · Updated 29 Aug 2026
Every version named by the advisory is in the scanner, so a lockfile check finds it directly.
- Severity
- High
- Type
- Advisory sweep
- Published
- 28 Aug 2026
- Last updated
- 29 Aug 2026
- Ecosystems
- npmPyPI
- Detected by
- GitHub Advisory Database, OpenSSF malicious-packages, OpenSSF Package Analysis, Amazon Inspector, kam193
- Also known as
- 2026-08-28 GHSA sweep, 2026-08-flyteplugins dependency-confusion, 2026-08-discordnv Discord Roblox stealer
- Source
- github.com
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.
The full picture
The 24-hour window ending 2026-08-28 06:00 UTC published 31 new GHSA malware advisories across npm and PyPI. (Updated 2026-08-29: three additional PyPI packages - yaml-report-formatter, yamlformat-tools, yamlformatter-utils - published later on 2026-08-28 have been added to Cluster D under the shared 2026-08-ekx-report-utils campaign identifier.) The window is dominated by two organised campaigns - a PyPI flyteplugins-* dependency-confusion probe (4 identical-version publishes against the Flyte / Union.ai internal package namespace) and a Windows-targeted Discord+Roblox infostealer with full IOCs - plus the routine boilerplate CWE-506 tail.
Cluster A - PyPI flyteplugins-* dependency-confusion cluster (Union.ai / Flyte target)
| Package | Version | GHSA | Source hash |
|---|---|---|---|
flyteplugins-redis | 2.6.10 | GHSA-23fv-6cgr-766g | 785b972d…64c03 |
flyteplugins-agento11y | 2.6.10 | GHSA-8cpp-43j8-xg7c | 46ad72ab…66c09a |
flyteplugins-nsight | 2.6.10 | GHSA-33m6-gx9h-9qv5 | 46b08f15…f2f129 |
flyteplugins-echo | 2.6.10 | GHSA-gcjf-mv7f-ffmf | e40fe85c…78b85c |
All four setup.py overrides exfiltrate host IP and OS username. The identical 2.6.10 version pin across all four is the tell: this is a dependency-confusion probe against the Flyte / Union.ai internal package namespace. Canonical Flyte plugin packages are published as flytekitplugins-* and flyteplugins-* under the flyteorg publisher; the target-selection here mirrors that pattern exactly (a redis connector, an agent observability helper, an nsight NVIDIA profiler integration, an echo test plugin - all names a real internal Flyte plugin catalogue would carry). OpenSSF classifies as PROBABLY_PENTEST but if any Flyte-shop CI is misconfigured to fall through to PyPI on internal-index failure, the setup.py exfil is a real hit and a follow-on payload could ship arbitrary code.
Cluster B - PyPI discordnv@0.8.0 Discord+Roblox DPAPI infostealer
| Package | Version | GHSA | Amazon Inspector hash | kam193 hash |
|---|---|---|---|---|
discordnv | 0.8.0 | GHSA-89r4-hq67-cfgq | 2f791396…3ba48 | d28ded2c…92f3646 |
IOCs: Discord webhook discord.com/api/webhooks/1528403989983662194/...; Google Apps Script script.google.com/macros/s/AKfycbwa.../exec; Windows registry persistence HKCU\Software\Microsoft\Windows\CurrentVersion\Run\discordnv.
On import, steals Discord authentication tokens across every installed Discord client and DPAPI-decrypts Roblox robloxcookies.dat from multiple browsers. Because the payload DPAPI-decrypts under the user profile, browser saved passwords for that user are also at risk. Windows-targeted.
Cluster C - PyPI decoris@0.3.0, 0.3.3 Roblox cookie exfil
| Package | Versions | GHSA | Source hash | Campaign |
|---|---|---|---|---|
decoris | 0.3.0, 0.3.3 | GHSA-v4c9-8j66-3xg2 | 1ce74b34…d9973 | 2026-06-spaysrbdata |
Roblox cookie infostealer, same population as discordnv. Campaign identifier links back to a June 2026 spaysrbdata cluster (kam193 discovery).
Cluster D - PyPI sap-quarterly-report + ekx-report-utils + yaml* DNS exfil family (shared campaign)
| Package | Versions | GHSA | Source hash |
|---|---|---|---|
sap-quarterly-report | 1.0.0 | GHSA-3g4v-hc5w-c37x | 2235bdf8…567b37ec |
ekx-report-utils | 0.1.0, 0.2.0, 0.3.0, 0.4.0 | GHSA-77v5-hfrm-j4h4 | a92d3d4c…4e1ab6 |
yaml-report-formatter | 0.1.0, 0.2.0, 0.3.0 | GHSA-3q3w-rmgq-cq8x | 207190bd…50f01 |
yamlformat-tools | 0.1.0 | GHSA-fgh2-58j8-r2cq | 60b8ab6c…1b734 |
yamlformatter-utils | 1.0.0 | GHSA-rccj-4982-7jfw | ef2cbf7d…25cdc2 |
All five packages import-time collect sensitive host info and exfiltrate via DNS queries. Shared campaign identifier 2026-08-ekx-report-utils. The sap-quarterly-report name is a targeted lure at SAP finance shops; the three yaml* names (published 2026-08-28) confirm the operator did not stop at the 2026-08-27 batch and is iterating on report / formatter-flavoured lures aimed at Python BI / data / DevOps teams. DNS-based exfil bypasses HTTP-only egress proxies - internal DNS resolvers routinely forward externally. Discovery credit: kam193 (bad-packages.kam193.eu).
Cluster E - PyPI mathkitlite@0.1.0 PROBABLY_PENTEST
| Package | Version | GHSA | Source hash |
|---|---|---|---|
mathkitlite | 0.1.0 | GHSA-j3j9-38mp-8cf7 | c91a8962…7845 |
Generic setup.py-override IP+username exfil. MAL-2026-14552. Low signal individually.
Cluster F - npm @vapi-ai/server-sdk formal GHSA backfill (folds into 2026-06-03 record)
GHSA-mjhg-2cvf-w2p4 formalises the Phantom Gyp / Miasma compromise of @vapi-ai/server-sdk and expands the tracked version set from 0.11.1 to 0.11.1, 0.11.2, 1.2.1, 1.2.2. The existing 2026-06-03 record (npm-2026-06-03-phantom-gyp-vapi-jagreehal) has been updated in place rather than duplicated here.
Cluster G - npm @postman-cse/okta-aio-darwin-arm64@<=0.11.6 internal-namespace probe
| Package | Versions | GHSA | Note |
|---|---|---|---|
@postman-cse/okta-aio-darwin-arm64 | <= 0.11.6 | GHSA-2qc4-r3x2-xh47 | Reads as Postman internal CSE Okta-AIO darwin-arm64 platform binary |
Exactly the naming shape a Postman internal CI would pull-through if the private mirror briefly failed over to public. Postman-adjacent orgs: audit .npmrc scope-registry pins for @postman-cse.
Cluster H - npm @hd-team/* operator cluster (8 packages)
| Package | GHSA |
|---|---|
@hd-team/app-impkg-prod | GHSA-g7cq-7vcf-rp48 |
@hd-team/app-dnpkg-beta | GHSA-6p53-v557-745c |
@hd-team/app-dnpkg-three | GHSA-qwcv-3958-fhq5 |
@hd-team/app-dnpkg-prod | GHSA-35w7-82wv-vwxj |
@hd-team/app-impkg-test | GHSA-hxxw-mprp-h9w7 |
@hd-team/app-dnpkg-ten | GHSA-q7mf-7f69-7qpr |
@hd-team/app-dnpkg-test | GHSA-6fm3-xp27-2556 |
@hd-team/app-dnpkg-eight | GHSA-97qc-463w-p2jr |
Eight coordinated advisories at one publisher account within one publish window; the app-impkg-* / app-dnpkg-* naming is throwaway boilerplate. Any lockfile hit under @hd-team should be uninstalled scope-wide.
Cluster I - npm hydration/svelte -ui-dlx extension
| Package | Versions | GHSA |
|---|---|---|
hydration-ui-dlx | >= 0 | GHSA-j5x7-qc6j-xwg4 |
svelte-ui-dlx | >= 0 | GHSA-7qq8-vjh5-hpgw |
Extends the multi-week hydration-*-ui / svelte-*-ui lookalike campaign with a -dlx suffix mirroring npm dlx / pnpm dlx / bunx terminology.
Cluster J - npm tailwindcss-* typosquats
| Package | Versions | GHSA |
|---|---|---|
tailwindcss-3d-animate | <= 1.1.0 | GHSA-683p-54mf-9297 |
tailwindcss-form-styles | <= 0.5.15 | GHSA-8wj9-gw6r-6vqh |
tailwindcss-* prefix leverages the Tailwind CSS plugin surface.
Cluster K - npm high-version-count takeovers
| Package | Versions | GHSA | Note |
|---|---|---|---|
@fleetbo/svro | 0.0.2-0.0.42 (~35 versions) | GHSA-4hrx-gqq5-q956 | Maintainer-account takeover pattern |
@znan/wabot | 0.0.5-0.2.2-beta.3 (80+ versions) | GHSA-2jxx-8fv2-h8mj | Maintainer-account takeover pattern |
Version-count pattern is the tell of a maintainer-account takeover or a package published as malware from the outset. Treat every historical install as compromised.
Cluster L - npm pushgitquickx scattered-version takeover
| Package | Versions | GHSA |
|---|---|---|
pushgitquickx | 1.0.0, 1.0.4-1.0.17 | GHSA-wx29-h78g-ww4f |
Unusual gap (1.0.0 flagged, 1.0.1-1.0.3 clean, then 1.0.4-1.0.17 all flagged) is consistent with a maintainer-account takeover mid-release-train.
Cluster M - npm 2026-08-27 boilerplate CWE-506 tail
| Package | GHSA |
|---|---|
stackpaths | GHSA-6hcw-m358-fq4q |
inspectstack | GHSA-xjx7-pff2-34gp |
charclass | GHSA-ccgj-rp72-9hvj |
deepjoin | GHSA-37cw-jw3f-qf4v |
module-relpath | GHSA-pmg4-2q5x-v3x5 |
sigcheck | GHSA-qm8v-w5qj-32jq |
morglog | GHSA-v899-gp96-p5rv |
veloq | GHSA-gccc-9phc-w64p |
All >= 0, all CWE-506 boilerplate with no per-package IOCs.
Registry state
All 31 packages yanked from npm / PyPI during the 2026-08-27 / 2026-08-28 takedown windows. The Cluster F formal GHSA-mjhg-2cvf-w2p4 for @vapi-ai/server-sdk is a backfill - the actual malicious versions have been deprecated on the registry since 2026-06-04; the new advisory just means GHSA-consuming tools finally see them.
Related tracked activity
- *`flyteplugins-
dependency-confusion probe** (Cluster A): first observed grouping this operator against Flyte / Union.ai naming. Watch for follow-on publishes across other Flyte-adjacent scopes (flytekitplugins-,flyteidl-,flyteagent-*`). - Windows-targeted PyPI Discord/Roblox infostealers (Clusters B, C):
discordnvanddecorisoperate in the same ecosystem-vertical as multiple 2022-2026 waves (Sonatype 2022 wave, Snyk 2022 wave); campaign identifier2026-06-spaysrbdatalinks Cluster C to earlierspaysrbdataactivity. - DNS-exfil PyPI campaigns (Cluster D):
sap-quarterly-reportandekx-report-utilsshare the2026-08-ekx-report-utilscampaign. DNS-based exfil bypasses HTTP-only egress controls. - Vue/Svelte/Vite hydration lookalike burst continuation (Cluster I): direct continuation of the 2026-08-25 -> 2026-08-27 burst catalogued in multi-2026-08-25, multi-2026-08-26, and multi-2026-08-27. The
-dlxsuffix mirroringnpm dlxterminology is the new twist. - Phantom Gyp / Miasma backfill (Cluster F): the new GHSA-mjhg-2cvf-w2p4 formalises versions that shipped 2026-06-03 - see npm-2026-06-03-phantom-gyp-vapi-jagreehal for the full attack chain.
- Discovery credits:
GitHub Advisory Database,OpenSSF malicious-packages,OpenSSF Package Analysis,Amazon Inspector(Cluster B),kam193(Clusters A, B, C, E).
36 packages 68 versions
- npm@fleetbo/svro0.0.20.0.30.0.40.0.50.0.60.0.70.0.90.0.100.0.110.0.120.0.130.0.140.0.150.0.160.0.170.0.190.0.200.0.210.0.220.0.230.0.240.0.260.0.270.0.290.0.300.0.310.0.320.0.330.0.340.0.350.0.370.0.380.0.390.0.400.0.42→
- npm@hd-team/app-dnpkg-beta→
- npm@hd-team/app-dnpkg-eight→
- npm@hd-team/app-dnpkg-prod→
- npm@hd-team/app-dnpkg-ten→
- npm@hd-team/app-dnpkg-test→
- npm@hd-team/app-dnpkg-three→
- npm@hd-team/app-impkg-prod→
- npm@hd-team/app-impkg-test→
- npm@postman-cse/okta-aio-darwin-arm64→
- npm@znan/wabot→
- npmcharclass→
- PyPIdecoris0.3.00.3.3→
- npmdeepjoin→
- PyPIdiscordnv0.8.0→
- PyPIekx-report-utils0.1.00.2.00.3.00.4.0→
- PyPIflyteplugins-agento11y2.6.10→
- PyPIflyteplugins-echo2.6.10→
- PyPIflyteplugins-nsight2.6.10→
- PyPIflyteplugins-redis2.6.10→
- npmhydration-ui-dlx→
- npminspectstack→
- PyPImathkitlite0.1.0→
- npmmodule-relpath→
- npmmorglog→
- npmpushgitquickx1.0.01.0.41.0.51.0.61.0.71.0.81.0.91.0.101.0.111.0.121.0.131.0.141.0.151.0.161.0.17→
- PyPIsap-quarterly-report1.0.0→
- npmsigcheck→
- npmstackpaths→
- npmsvelte-ui-dlx→
- npmtailwindcss-3d-animate→
- npmtailwindcss-form-styles→
- npmveloq→
- PyPIyaml-report-formatter0.1.00.2.00.3.0→
- PyPIyamlformat-tools0.1.0→
- PyPIyamlformatter-utils1.0.0→
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.
What it does if you installed it
- *Cluster A - PyPI `flyteplugins-
dependency-confusion cluster (2026-08-28, 4 packages, all v2.6.10)**:flyteplugins-redis@2.6.10(GHSA-23fv-6cgr-766g, source hash785b972da662fb9bf37532e8607149e096679239dbd373dc18406df647564c03),flyteplugins-agento11y@2.6.10(GHSA-8cpp-43j8-xg7c, hash46ad72ab2f7b1b228296686a3090c2c81be3a2257b47fa801b300c1f7b66c09a),flyteplugins-nsight@2.6.10(GHSA-33m6-gx9h-9qv5, hash46b08f15350f8ecf5aabe4633458f517dda24d5eb2687ab95680dc068cf2f129, MAL-2026-14583),flyteplugins-echo@2.6.10(GHSA-gcjf-mv7f-ffmf, hashe40fe85c793ea410384a1c17184e6f7fe08f039a19599b9fb9933cda4078b85c). All four names pattern-match Flyte / Union.ai internal package naming (realflytekitplugins-andflyteplugins-packages exist on PyPI; canonical publisher isflyteorg). All foursetup.pyoverrides exfiltrate host IP and OS username. **The identical2.6.10version pin across all four is the tell**: this is a dependency-confusion probe hoping Flyte / Union.ai internal CI would resolve2.6.10` from PyPI instead of the internal index (2.6.10 likely mirrors a real internal Flyte version). OpenSSF classifies as PROBABLY_PENTEST but the target-selection is not accidental - a real hit would land arbitrary command execution on Flyte / Union.ai CI - Cluster B - PyPI
discordnv@0.8.0Discord+Roblox DPAPI infostealer (2026-08-27, 1 package, 1 version):discordnv@0.8.0(GHSA-89r4-hq67-cfgq, hashes2f79139609558d677545faa7d5f1d30ec31a54abe9fba990117ec0d27ea3ba48(Amazon Inspector) andd28ded2ca28c0182385e9dccf5939e883fd5f18dfa702ca912429270a92f3646(kam193)). On import steals Discord authentication tokens across every installed Discord client, reads and DPAPI-decrypts Robloxrobloxcookies.datfrom multiple browsers, exfiltrates to a Discord webhook (discord.com/api/webhooks/1528403989983662194/...) and a Google Apps Script endpoint (script.google.com/macros/s/AKfycbwa.../exec). Persistence viaHKCU\Software\Microsoft\Windows\CurrentVersion\Runregistry entry nameddiscordnv. Any Windows host that ranpip install discordnv==0.8.0should be considered credential-compromised for Discord and Roblox at minimum; the DPAPI reach also means anything protected by user-DPAPI (browser saved passwords, some VPN clients) is potentially reachable - Cluster C - PyPI
decoris@0.3.0, 0.3.3Roblox cookie exfil (2026-08-27, 1 package, 2 versions):decoris@0.3.0, 0.3.3(GHSA-v4c9-8j66-3xg2, hash1ce74b34855100b6ba312f767a982fb288a802da613fec375aec92665f4d9973, campaign2026-06-spaysrbdata). Roblox cookie infostealer targeting the same population asdiscordnv. Campaign identifier links back to a June 2026spaysrbdatacluster - operator has been active for months. Move Roblox account cookies / revoke sessions from a clean host - *Cluster D - PyPI
sap-quarterly-report+ekx-report-utils+ `yamlDNS exfil family (2026-08-27 / 2026-08-28, 5 packages)**:sap-quarterly-report@1.0.0(GHSA-3g4v-hc5w-c37x, hash2235bdf8263c08fede094c665d2fbc4e023a0f0c5e99631d70ae0685567b37ec),ekx-report-utils@0.1.0, 0.2.0, 0.3.0, 0.4.0(GHSA-77v5-hfrm-j4h4, hasha92d3d4cf522a2a5c2b690f54b14b8312d54b16208b92c8e5540a49fbc4e1ab6),yaml-report-formatter@0.1.0, 0.2.0, 0.3.0(GHSA-3q3w-rmgq-cq8x, hash207190bd409999efcab9a56f8e536b6caf9c6a5ab92a134b77421f4bf1650f01, MAL-2026 series),yamlformat-tools@0.1.0(GHSA-fgh2-58j8-r2cq, hash60b8ab6c62beb2bbbe4e2926cf9cda17f060f9c4184d33ed57d363d9a771b734) andyamlformatter-utils@1.0.0(GHSA-rccj-4982-7jfw, hashef2cbf7d7c360d11860ea9383a1ed84b491e75361f994359fd97284a5d25cdc2). All five import-time collect sensitive host info and exfiltrate via DNS queries - egress-firewall-bypass by encoding data into DNS subdomain labels. Shared campaign identifier2026-08-ekx-report-utilsgroups them (the threeyamlnames published 2026-08-28 confirm the operator did not stop at the 08-27 batch and is iterating on report/formatter-flavoured lures). Thesap-quarterly-reportname is a targeted lure at SAP finance / accounting shops;ekx-report-utilsand theyaml-report-formatter/yamlformat-tools/utils` names read like internal reporting helpers a Python data / BI shop would pull without a second look. DNS-based exfil is the important detail - a proxy-only egress policy does not block it if internal DNS resolvers forward externally. Discovery credit: kam193 (bad-packages.kam193.eu) plus GitHub Advisory Database / OpenSSF Package Analysis - Cluster E - PyPI
mathkitlite@0.1.0PROBABLY_PENTEST (2026-08-27, 1 package, 1 version):mathkitlite@0.1.0(GHSA-j3j9-38mp-8cf7, hashc91a8962fd66464487bcdb5e2c217990cfdea55df22e7166c11703f91dfb7845, MAL-2026-14552).setup.pyoverride exfiltrates host IP and OS username at install time - the same genericPROBABLY_PENTESTshape as recent kam193 discoveries. Low signal individually but part of the persistent PyPI pentest-probe background - Cluster F - npm
@vapi-ai/server-sdkformal GHSA backfill (2026-08-27, adds 3 more versions to 2026-06-03 Phantom Gyp wave): GHSA-mjhg-2cvf-w2p4 formalises the Phantom Gyp / Miasma compromise of@vapi-ai/server-sdkand adds versions0.11.2, 1.2.1, 1.2.2to the previously-tracked0.11.1- the existing 2026-06-03 record has been updated in place rather than duplicated here. Anyone still resolving those exact version pins from an internal mirror after 2026-06-04 remained exposed until the GHSA landed on 2026-08-27 - Cluster G - npm
@postman-cse/okta-aio-darwin-arm64@0.11.6-internal-namespace probe (2026-08-28, 1 package):@postman-cse/okta-aio-darwin-arm64<=0.11.6(GHSA-2qc4-r3x2-xh47). Reads as a Postman internal Customer Success/Solution Engineering (cse) Okta All-In-One (aio) darwin-arm64 platform-specific binary sub-package - the exact namespace shape a Postman internal CI job could pull-through if the private mirror briefly failed over to the public registry. Whether the@postman-cseorg is genuinely Postman-controlled or a squat of the naming pattern is not disclosed in the GHSA; treat any resolution of this scope in a build log as a private-registry misconfiguration to investigate. Postman-adjacent orgs should verify their.npmrcscope-registry pins - *Cluster H - npm `@hd-team/
operator cluster (2026-08-27, 8 packages)**:@hd-team/app-impkg-prod(GHSA-g7cq-7vcf-rp48),@hd-team/app-dnpkg-beta(GHSA-6p53-v557-745c),@hd-team/app-dnpkg-three(GHSA-qwcv-3958-fhq5),@hd-team/app-dnpkg-prod(GHSA-35w7-82wv-vwxj),@hd-team/app-impkg-test(GHSA-hxxw-mprp-h9w7),@hd-team/app-dnpkg-ten(GHSA-q7mf-7f69-7qpr),@hd-team/app-dnpkg-test(GHSA-6fm3-xp27-2556),@hd-team/app-dnpkg-eight(GHSA-97qc-463w-p2jr). Eight coordinated advisories at one publisher account within one publish window - theapp-impkg-/app-dnpkg-naming pattern is throwaway boilerplate rather than a typosquat of any real package. CWE-506 boilerplate advisories only; the operational value is knowing the@hd-team` scope is entirely poisoned so any lockfile hit under that scope should be uninstalled, not selectively pinned - Cluster I - npm hydration/svelte
-ui-dlxextension (2026-08-27, 2 packages):hydration-ui-dlx(GHSA-j5x7-qc6j-xwg4) andsvelte-ui-dlx(GHSA-7qq8-vjh5-hpgw). Extends the multi-weekhydration-*-ui/svelte-*-uilookalike campaign (seemulti-2026-08-25,multi-2026-08-26,multi-2026-08-27sweeps) with a new-dlxsuffix mirroringnpm dlx/pnpm dlx/bunxterminology. CWE-506 boilerplate; no per-package IOCs. Watch for further<framework>-*-dlxpublishes across the same campaign - Cluster J - npm
tailwindcss-3d-animate+tailwindcss-form-stylestyposquats (2026-08-27, 2 packages):tailwindcss-3d-animate<=1.1.0(GHSA-683p-54mf-9297) andtailwindcss-form-styles<=0.5.15(GHSA-8wj9-gw6r-6vqh).tailwindcss-*prefix leverages the massive Tailwind CSS plugin surface; developers searching for a 3D animate plugin or form-styling plugin will find these ahead of legitimate options. Boilerplate CWE-506 with no per-package IOCs; treat astailwindcss-*prefix hygiene reminder - Cluster K - npm high-version-count boilerplate takeovers (2026-08-28, 2 packages):
@fleetbo/svro@0.0.2-0.0.42(GHSA-4hrx-gqq5-q956, ~35 versions) and@znan/wabot@0.0.5-0.2.2-beta.3(GHSA-2jxx-8fv2-h8mj, 80+ versions). The version-count pattern (many published versions over months, all now flagged) is the tell of a maintainer-account takeover or a maintainer publishing malware from the outset and only now getting caught. Any project holding either package in a lockfile should treat every historical install as compromised, not just the most recent version - Cluster L - npm
pushgitquickxscattered-version takeover (2026-08-27, 1 package):pushgitquickx@1.0.0, 1.0.4, 1.0.5, 1.0.6, 1.0.7, 1.0.8, 1.0.9, 1.0.10, 1.0.11, 1.0.12, 1.0.13, 1.0.14, 1.0.15, 1.0.16, 1.0.17(GHSA-wx29-h78g-ww4f). The unusual gap (1.0.0 flagged, 1.0.1-1.0.3 clean, then 1.0.4-1.0.17 all flagged) is consistent with a maintainer-account takeover mid-release-train: an attacker got the publish token and shipped every subsequent patch until the account was locked.git-themed name (push-git-quick-x) suggests targeting developers looking forgit-related tooling - Cluster M - npm 2026-08-27 boilerplate CWE-506 tail (8 packages):
stackpaths(GHSA-6hcw-m358-fq4q),inspectstack(GHSA-xjx7-pff2-34gp),charclass(GHSA-ccgj-rp72-9hvj),deepjoin(GHSA-37cw-jw3f-qf4v),module-relpath(GHSA-pmg4-2q5x-v3x5),sigcheck(GHSA-qm8v-w5qj-32jq),morglog(GHSA-v899-gp96-p5rv),veloq(GHSA-gccc-9phc-w64p). All>= 0, all CWE-506 boilerplate with no per-package IOCs. The mix of utility-sounding names (stackpaths,inspectstack,module-relpath,sigcheck) suggests scripted name-generation targeting developer search terms rather than specific typosquats
Clean-up steps
- Grep every lockfile (
package-lock.json,yarn.lock,pnpm-lock.yaml,requirements.txt,Pipfile.lock,poetry.lock,uv.lock) for:flyteplugins-redis,flyteplugins-agento11y,flyteplugins-nsight,flyteplugins-echo,discordnv,decoris,sap-quarterly-report,ekx-report-utils,yaml-report-formatter,yamlformat-tools,yamlformatter-utils,mathkitlite,@postman-cse/okta-aio-darwin-arm64,@hd-team/app-impkg-prod,@hd-team/app-dnpkg-beta,@hd-team/app-dnpkg-three,@hd-team/app-dnpkg-prod,@hd-team/app-impkg-test,@hd-team/app-dnpkg-ten,@hd-team/app-dnpkg-test,@hd-team/app-dnpkg-eight,hydration-ui-dlx,svelte-ui-dlx,tailwindcss-3d-animate,tailwindcss-form-styles,@fleetbo/svro,@znan/wabot,pushgitquickx,stackpaths,inspectstack,charclass,deepjoin,module-relpath,sigcheck,morglog,veloq - *For Cluster A (`flyteplugins-
dependency-confusion probe)**: any organisation that runs Flyte / Union.ai internally MUST audit their pip / uv resolver configuration. Verifyflytekitplugins-andflyteplugins-resolve exclusively to the canonicalflyteorgpublisher on the internal index. Pin--index-url(not--extra-index-url) to the internal mirror for CI runs of Flyte-adjacent code, so pip cannot silently fall through to PyPI.pip install --dry-run` a Flyte requirements set against a scratch env pointing only at PyPI to see whether the confused version resolves - if 2.6.10 comes back for any of the four flagged names, the attack shape is confirmed against your naming set - For Cluster B (
discordnvDiscord+Roblox DPAPI stealer): any Windows user who ranpip install discordnv==0.8.0should reset Discord (log out all sessions, rotate token by password change), revoke Roblox sessions, and remove the persistence entry atHKCU\Software\Microsoft\Windows\CurrentVersion\Run\discordnv. Because the payload DPAPI-decrypts under the user profile, browser saved passwords for that user are also at risk - a browser password rotation from a clean host is a reasonable defensive move. Block the Discord webhook URL and the Google Apps Script endpoint at egress if you have a proxy - For Cluster C (
decorisRoblox cookie exfil): revoke Roblox sessions from a clean host, uninstall the package, and hunt for prior versions of the same operator's campaign identifier2026-06-spaysrbdatain historical pip install logs - *For Cluster D (
sap-quarterly-report+ekx-report-utils+ `yamlDNS exfil family)**: SAP finance / reporting and Python BI shops should verify these did not slip into any BI / finance-team pip install workflow. **DNS-based exfil bypasses HTTP-only egress proxies**: if your egress policy is proxy-only, verify your internal DNS resolvers do not forward externally-resolvable domains for pip-installer-user contexts; or add a DNS-egress-block for these campaign domains once IOCs are published. Because the operator is iterating onreport/format/formatter/utilsthemes across multiple publish windows, extend the block-list beyond the exact names to any-report-/format-utils/yamlformat` install requested by an environment that should never touch these - For Cluster E (
mathkitlitePROBABLY_PENTEST): uninstall from every environment.pip install --only-binary=:all:in CI helps againstsetup.pypayloads that only trigger from sdist installs - For Cluster G (
@postman-cse/okta-aio-darwin-arm64): any Postman-adjacent org should audit.npmrcfor a scope-registry pin (@postman-cse:registry=https://...) and verify that scope is not resolvable from the public registry - theokta-aio-darwin-arm64naming is exactly what a platform-specific internal binary package would look like, and a build box briefly failing over to the public registry would land the malicious version - *For Cluster H (`@hd-team/
)**: treat the entire@hd-team` scope as poisoned. If any lockfile pins a package under this scope, uninstall the whole scope rather than trying to identify which subset is malicious - all 8 flagged siblings are boilerplate CWE-506 with no per-package IOCs, and the operator can publish more under the same account until the account is locked - For Clusters I, J, K, L, M: uninstall on hit and rebuild lockfiles. For high-version-count Cluster K takeovers, treat every historical install of
@fleetbo/svroor@znan/wabotas compromised, not just the most recent version - For all
pip installruns in CI, prefer--only-binary=:all:and pin to source hashes - Clusters A, B, C, D, E all execute at install time viasetup.pyor wheel side-effects. Forflyteplugins-*shops, also lock the resolver to a single trusted index - For all
npm installruns in CI, run with--ignore-scriptswhere possible - though the@hd-teamandhydration-*clusters have no published IOCs, so scope-blocking at the private mirror is a stronger control - Verify none of these packages still resolves via your private mirror - internal caches routinely keep serving yanked tarballs after the public takedown
Sources
- GHSA-23fv-6cgr-766g - flyteplugins-redis@2.6.10 (PyPI dependency-confusion setup.py exfil)github.com
- GHSA-8cpp-43j8-xg7c - flyteplugins-agento11y@2.6.10 (PyPI dependency-confusion setup.py exfil)github.com
- GHSA-33m6-gx9h-9qv5 - flyteplugins-nsight@2.6.10 (PyPI dependency-confusion setup.py exfil)github.com
- GHSA-gcjf-mv7f-ffmf - flyteplugins-echo@2.6.10 (PyPI dependency-confusion setup.py exfil)github.com
- GHSA-89r4-hq67-cfgq - discordnv@0.8.0 (PyPI Discord token + Roblox cookie DPAPI infostealer)github.com
- GHSA-v4c9-8j66-3xg2 - decoris@0.3.0, 0.3.3 (PyPI Roblox cookie exfil, campaign 2026-06-spaysrbdata)github.com
- GHSA-3g4v-hc5w-c37x - sap-quarterly-report@1.0.0 (PyPI DNS exfil, campaign 2026-08-ekx-report-utils)github.com
- GHSA-77v5-hfrm-j4h4 - ekx-report-utils (PyPI DNS exfil, campaign 2026-08-ekx-report-utils)github.com
- GHSA-3q3w-rmgq-cq8x - yaml-report-formatter (PyPI DNS exfil, campaign 2026-08-ekx-report-utils; added 2026-08-29)github.com
- GHSA-fgh2-58j8-r2cq - yamlformat-tools (PyPI DNS exfil, campaign 2026-08-ekx-report-utils; added 2026-08-29)github.com
- GHSA-rccj-4982-7jfw - yamlformatter-utils (PyPI DNS exfil, campaign 2026-08-ekx-report-utils; added 2026-08-29)github.com
- GHSA-j3j9-38mp-8cf7 - mathkitlite@0.1.0 (PyPI PROBABLY_PENTEST setup.py exfil)github.com
- GHSA-mjhg-2cvf-w2p4 - @vapi-ai/server-sdk formal advisory (npm; backfills Phantom Gyp 0.11.1, 0.11.2, 1.2.1, 1.2.2)github.com
- GHSA-2qc4-r3x2-xh47 - @postman-cse/okta-aio-darwin-arm64 (npm internal-namespace probe)github.com
- GHSA-g7cq-7vcf-rp48 - @hd-team/app-impkg-prod (npm CWE-506)github.com
- GHSA-6p53-v557-745c - @hd-team/app-dnpkg-beta (npm CWE-506)github.com
- GHSA-qwcv-3958-fhq5 - @hd-team/app-dnpkg-three (npm CWE-506)github.com
- GHSA-35w7-82wv-vwxj - @hd-team/app-dnpkg-prod (npm CWE-506)github.com
- GHSA-hxxw-mprp-h9w7 - @hd-team/app-impkg-test (npm CWE-506)github.com
- GHSA-q7mf-7f69-7qpr - @hd-team/app-dnpkg-ten (npm CWE-506)github.com
- GHSA-6fm3-xp27-2556 - @hd-team/app-dnpkg-test (npm CWE-506)github.com
- GHSA-97qc-463w-p2jr - @hd-team/app-dnpkg-eight (npm CWE-506)github.com
- GHSA-j5x7-qc6j-xwg4 - hydration-ui-dlx (npm hydration-lookalike continuation)github.com
- GHSA-7qq8-vjh5-hpgw - svelte-ui-dlx (npm hydration-lookalike continuation)github.com
- GHSA-683p-54mf-9297 - tailwindcss-3d-animate (npm tailwindcss-* typosquat)github.com
- GHSA-8wj9-gw6r-6vqh - tailwindcss-form-styles (npm tailwindcss-* typosquat)github.com
- GHSA-4hrx-gqq5-q956 - @fleetbo/svro (npm ~35-version maintainer takeover)github.com
- GHSA-2jxx-8fv2-h8mj - @znan/wabot (npm 80+-version maintainer takeover)github.com
- GHSA-wx29-h78g-ww4f - pushgitquickx (npm scattered-version takeover)github.com
- GHSA-6hcw-m358-fq4q - stackpaths (npm CWE-506)github.com
- GHSA-xjx7-pff2-34gp - inspectstack (npm CWE-506)github.com
- GHSA-ccgj-rp72-9hvj - charclass (npm CWE-506)github.com
- GHSA-37cw-jw3f-qf4v - deepjoin (npm CWE-506)github.com
- GHSA-pmg4-2q5x-v3x5 - module-relpath (npm CWE-506)github.com
- GHSA-qm8v-w5qj-32jq - sigcheck (npm CWE-506)github.com
- GHSA-v899-gp96-p5rv - morglog (npm CWE-506)github.com
- GHSA-gccc-9phc-w64p - veloq (npm CWE-506)github.com
- GitHub Advisory Database - recent npm malware advisoriesgithub.com
- GitHub Advisory Database - recent pip malware advisoriesgithub.com
- OpenSSF malicious-packages repositorygithub.com
Check your lockfile against this and every other incident.
Paste a lockfile and it is matched on your own device against every compromised version we track. Nothing is uploaded and there is no account.