GitHub Advisory PyPI malware sweep, 18 October 2026
GHSA 2026-10-17/18 PyPI-only batch (10 advisories, 0 npm). leakdeep ships a 5-version Windows browser-credential and Discord-token stealer with XOR-obfuscated webhook C2. ukraine69 ships an 8-version destructive payload that hijacks saved Telegram vault credentials and calls account.deleteAccount on the victim. Eight TTS/ASR lures continue the 2026-10-voxeval cryptominer campaign under a new 2026-10-emberlytts slug.
Published 18 Oct 2026
Every version named by the advisory is in the scanner, so a lockfile check finds it directly.
- Severity
- High
- Type
- Advisory sweep
- Published
- 18 Oct 2026
- Ecosystems
- PyPI
- Detected by
- GitHub Advisory Database, OpenSSF malicious-packages, kam193/bad-packages, Amazon Inspector, PyPI security
- Also known as
- 2026-10-18 GHSA PyPI sweep, leakdeep PyPI Windows credential + Discord stealer, 2026-10-ukraine69 destructive Telegram campaign
- 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
Between 2026-10-17 06:00 UTC (yesterdays sweep cutoff) and 2026-10-18 06:00 UTC (todays ingest-window start), the GitHub Advisory Database and OpenSSF malicious-packages published 10 fresh PyPI malware advisories not already in yesterday`s sweep. No new npm, RubyGems, Go, Packagist, NuGet, Crates, or GitHub Actions malware advisories were published in this window - the first PyPI-only 24h sweep since the daily cadence began.
Headlines
leakdeep multi-version Windows infostealer (Cluster A): a self-described OSINT and credential-leak intelligence tool, 5 live versions on PyPI (2.5.0, 2.5.2, 2.6.0, 2.6.4, 2.6.6), ships a Windows background harvester that decrypts Chrome / Edge / Brave browser-saved credentials, cookies, autofill data, Discord authentication and MFA tokens from leveldb, grabs a desktop screenshot, correlates installer host public IP via ipify, and uploads the archive to an XOR-obfuscated webhook URL in leakdeep/config.py. Confirmed by Amazon Inspector.
ukraine69 multi-version destructive Telegram account deletion payload (Cluster B): 8 live versions on PyPI (1.2.0 through 1.2.8 excluding 1.2.4), presents a benign Ukrainian-locale API, imports to spawn detached Python agents that walk ~/.hotaru/** + ~/.local/share/hotaru/** + ~/**/*.vault for Telegram vault files, decrypts them with embedded helpers, connects to Telegram data-centre IPs, and calls account.deleteAccount under the harvested MTProto credentials. A _gc_script waits 45 seconds and removes the package itself to cover tracks. The package self-describes as a "Hotaru sandbox-escape payload". Cross-confirmed by kam193 and Amazon Inspector.
2026-10-emberlytts campaign (Cluster C): 8 fresh single-version lure packages (driftwavets, emberlytts, glassbeakasr, novalithtts, pyrechoasr, quasitonnts, tonemaptts, voltswannts), all 0.1.0, all with "audio-analysis profiles" placeholder marketing and a single remote-script-download-and-execute function body with the URL deliberately not embedded. OSSF explicitly links the wave to the earlier 2026-10-voxeval Monero cryptominer campaign (12 slugs catalogued across our 2026-10-03 and 2026-10-04 sweeps) based on identical wording and the same kam193 reporter.
Classification
sweep. Severity high taken as a whole, driven by Cluster A (confirmed multi-vector browser-credential and Discord-token stealer, five live versions) and Cluster B (confirmed destructive Telegram account-deletion payload, eight live versions). Cluster C is medium on its own (confirmed remote-script primitive but URL not embedded means specific payload is unverified at analysis time) and does not raise sweep severity above high. No cluster today would independently merit critical - all three are first-publish lures without hijack of an existing legitimate upstream and without confirmed worm propagation beyond their single lure names.
Discovery
GitHub Advisory Database, OpenSSF malicious-packages, kam193/bad-packages (Clusters B and C, cross-confirmed as reporter), Amazon Inspector (Clusters A and B, source hashes).
10 packages 21 versions
- PyPIdriftwavets0.1.0→
- PyPIemberlytts0.1.0→
- PyPIglassbeakasr0.1.0→
- PyPIleakdeep2.5.02.5.22.6.02.6.42.6.6→
- PyPInovalithtts0.1.0→
- PyPIpyrechoasr0.1.0→
- PyPIquasitonnts0.1.0→
- PyPItonemaptts0.1.0→
- PyPIukraine691.2.01.2.11.2.21.2.31.2.51.2.61.2.71.2.8→
- PyPIvoltswannts0.1.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
leakdeepmulti-version Windows browser-credential and Discord-token infostealer (malicious-package, confirmed install-time + CLI-time credential-stealing payload, 5 versions published across the 2.5.x and 2.6.x branches, Amazon Inspector finder):leakdeep@2.5.0,leakdeep@2.5.2,leakdeep@2.6.0,leakdeep@2.6.4,leakdeep@2.6.6(GHSA-4pw5-gqh4-v2pj, MAL-2026-17921). The package self-describes as an OSINT and credential-leak intelligence tool and ships a stubSearchEngine.searchthat always returns an empty list. Every CLI invocation callsSystemInfo.initialize_background_process, which spawns a background Windows-only harvester: iterates Chrome, Edge, and Brave profile stores, decrypts saved passwords, cookies, and autofill data, writes plaintext to a temp directory, then zips and uploads the archive to an attacker-controlled webhook URL. The webhook URL is stored XOR-encoded (key0x5A) inleakdeep/config.pyand reassembled at runtime byget_webhook(). The harvester also walks%APPDATA%\discord*\Local Storage\leveldbfor Discord authentication and MFA tokens, grabs a desktop screenshot, and fetches the installer host public IP viaipify. Evidence file hashes:leakdeep/core/system.pysha2560634ec699de39d30fdd902c9b64c4c1587b2ec6d063e071093d7ae206af10dc8,leakdeep/config.pysha256fe0752ff79816a2f2150da9ba2458e761e49019cfa4c421b63e161e57cb8fee6,leakdeep/cli.pysha256abae927c786a194318cc4203a118a24b9c1107ddff22d52b61de2413d19e9054. Per-version wheel/sdist integrity in MAL-2026-17921. Severityhighfor this cluster (confirmed multi-vector credential-stealing primitive, five live versions, but reach limited to Windows installers who run the CLI; no evidence of self-propagation or hijack of an existing legitimate upstream) - Cluster B - PyPI
ukraine69multi-version destructive Telegram account deletion payload (malicious-package, confirmeddestructive-actions+covering-tracksOSSF reasons, 8 versions published across the 1.2.x branch, kam193 reporter + Amazon Inspector cross-confirmation):ukraine69@1.2.0,1.2.1,1.2.2,1.2.3,1.2.5,1.2.6,1.2.7,1.2.8(GHSA-j83x-9pxh-rrgp, MAL-2026-17919, campaign2026-10-ukraine69). The package presents a benign Ukrainian-locale API (transliterate,flag,month_name,format_date). On import,ukraine69/__init__.py(sha2566b36b90468c442a02d0cc6aaf3b401a96d54d34d85f6aac49b2bcb074aea44e6) spawns detached Python agents viasys.executable -I -c+start_new_session=Truethat search the installer filesystem for Telegram*.vaultfiles at~/.hotaru/**,~/.local/share/hotaru/**,~/**/*.vault, decrypt them, and extract MTProto credentials. The agents then connect to Telegram data-centre IPs (149.154.175.53,149.154.167.51,149.154.175.100,149.154.167.91,91.108.56.130) and callaccount.deleteAccountagainst the victims Telegram account under those credentials. A follow-up_gc_scriptwaits 45 seconds and removes the packages own site-packages and cache files to cover tracks. The package self-describes as a "Hotaru sandbox-escape payload" that "executes at import time". Severityhighfor this cluster (confirmed destructive payload against a real target product (Telegram accounts), eight live versions, Hotaru is the vault-storage client the campaign specifically targets so reach extends to anyone running the Hotaru client with saved credentials and happens to install the package; no evidence of worm propagation beyond the single lure name) - Cluster C - PyPI 8-package audio TTS/ASR lure wave extending the
2026-10-voxevalcryptominer campaign under a new2026-10-emberlyttsslug (malicious-package, confirmedDownloads and executes a remote malicious scriptOSSF reason, remote-script URL deliberately not embedded in the package so the payload cannot be IOC-matched at analysis time, kam193 reporter):driftwavets@0.1.0(GHSA-fm3q-3w2v-hcmf, MAL-2026-17912),emberlytts@0.1.0(GHSA-h24x-x3hv-v34p, MAL-2026-17913),glassbeakasr@0.1.0(GHSA-8g3x-4h23-v3xp, MAL-2026-17914),novalithtts@0.1.0(GHSA-xf3f-g2fj-wr92, MAL-2026-17915),pyrechoasr@0.1.0(GHSA-xvjf-fj8r-fjcf, MAL-2026-17916),quasitonnts@0.1.0(GHSA-ghmx-wq8v-9683, MAL-2026-17917),tonemaptts@0.1.0(GHSA-22rf-pvvq-mghv, MAL-2026-17918),voltswannts@0.1.0(GHSA-r8cm-478x-h626, MAL-2026-17920). All 8 published to PyPI between 2026-10-16 and 2026-10-17 with placeholder "audio-analysis profiles" loader marketing and a single-function body that downloads and executes a remote script whose URL is reassembled at import time (not embedded in the sdist). OSSF explicitly notes the campaign is likely linked to the earlier2026-10-voxevalcryptominer wave (voxeval+ 11 siblingsvoxcpmruntime/voxcpmui4/voxcpmkit/voxcpmintel/voxcpmeval/voxcpmui3/voxcpmtts3/voxel-tts/caoxiltts/infrabench, catalogued across our 2026-10-03 + 2026-10-04 sweeps), based on identical wording in the package marketing and the same reporter (kam193). This wave uses an-asr/-tts/-tsnaming suffix that targets audio speech-recognition and text-to-speech tooling. Severitymediumfor this cluster (confirmed install-time remote-script execution primitive but no embedded URL means the specific payload is unverified at analysis time; the earlier2026-10-voxevalwave had a confirmed Monero cryptominer so the operator`s baseline deliverable is cryptomining with upgrade path to anything the remote server returns; 8-package single-version first-publish lures means reach is limited to developers tricked into installing a specific slug) - Operator continuity: this sweep continues the week-running
2026-10-voxevalcryptominer campaign (12 slugs catalogued 2026-10-02 through 2026-10-03 under thevoxevalfamily) into a 2026-10-16/17 wave of 8 new slugs under the fresh2026-10-emberlyttscampaign slug (Cluster C). Same reporter (kam193), same remote-script-not-embedded delivery pattern, same single-version 0.1.0 first-publish shape, same AI-adjacent brand-impersonation naming (speech recognition and text-to-speech instead of speech-synthesis-eval).kam193remains top PyPI reporter - all 10 PyPI advisories in todays batch came through kam193 or were cross-confirmed by Amazon Inspector. **No new npm, RubyGems, Go, Packagist, NuGet, Crates, or GitHub Actions advisories** were published in the GHSA feed between 2026-10-17 06:00 UTC and 2026-10-18 06:00 UTC - the first PyPI-only 24h window since the daily sweep began. **No new activity** from:conx3993operator (yesterdays wave 2 quiet -realwbx.comC2 unchanged),@flexmrdep-confusion operator (yesterdays wave 2 quiet -artifacts.creditslib.comC2 unchanged),@beloved-lenora/opencode-AI-coding-tool lure (yesterdays 7-package wave quiet), Baileys-lure operator (yesterdays@xatancchii/natabaileyswave 5 quiet),agentaix(py-worm/py-wormgpt/py-sock2quiet), Wix dep-confusion wave 3,seapy-ops,getpubip,proxyrubika,tailwindcss-form/-uniform` typosquat operator. TensorLake AI maintainer compromise (2026-10-08 carve-out) remains confirmed-recovered; no wave-2 malicious republish. No new disclosed attacker-controlled hosts today* (theleakdeepwebhook is XOR-obfuscated and not extractable from the OSSF record; theukraine69C2 is Telegram`s own data-centre IPs which cannot be denylisted; the Cluster C remote-script URL is deliberately not embedded)
Clean-up steps
- For Cluster A (
leakdeepPyPI Windows browser + Discord stealer, 5 versions): grep everyrequirements.txt,pyproject.toml,Pipfile.lock,poetry.lock,uv.lock,pdm.lock,conda envforleakdeepat any of versions2.5.0,2.5.2,2.6.0,2.6.4,2.6.6. On ANY hit on a Windows installer host: assume Chrome / Edge / Brave saved passwords, cookies, and autofill data have been decrypted and uploaded to the attackers webhook; assume Discord authentication tokens and MFA tokens from%APPDATA%\discord*\Local Storage\leveldbhave been uploaded; assume a desktop screenshot and system fingerprint were captured; assume the host public IP has been correlated viaipify. Rotate ALL browser-saved credentials on the host (every website login), revoke all Discord authentication tokens (log out of all sessions in Discords security settings), rotate any secret that was in the installer process environment, and image the host for forensic review before clean-rebuild. The webhook URL is XOR-encoded with key0x5Ainleakdeep/config.py- decode locally to recover the specific exfiltration host for your IOC feed. Add egress blocks:ipify.orgon untrusted CI / build hosts (already in standing denylist - keep it). Report the specific webhook URL to the hosting provider abuse channel. Keep a watch on PyPI for a wave 2 under similar OSINT / credential-intelligence lure names (leakdeepis a credible OSINT tool slug - expect sibling publications underleakcheck,leaklookup,credintelor similar) - For Cluster B (
ukraine69PyPI destructive Telegram account deletion, 8 versions): grep everyrequirements.txt,pyproject.toml,Pipfile.lock,poetry.lock,uv.lockforukraine69at any of versions1.2.0,1.2.1,1.2.2,1.2.3,1.2.5,1.2.6,1.2.7,1.2.8. On ANY hit on a host where the Hotaru Telegram client was installed with saved credentials: assume the Hotaru vault at~/.hotaru/**,~/.local/share/hotaru/**, or~/**/*.vaulthas been decrypted and MTProto credentials extracted, assume the installer hosts Telegram account has been issued anaccount.deleteAccountRPC against one of the Telegram data-centre IPs (149.154.175.53,149.154.167.51,149.154.175.100,149.154.167.91,91.108.56.130) and the account is destroyed. The account-deletion is final once Telegram processes the RPC - any installer who left Hotaru running during the exposure window should verify the Telegram account status (log into app on a different device; if the account is unreachable or shows "Account deleted" it has been destroyed). Preserve any post-45-second host state for forensics before_gc_scriptfinishes removing its own traces:~/.cache/hotaru/module-deps/<id>/,~/.cache/pip/wheels,~/.cache/pip/http-v2,~/.cache/uv,/tmp/hotaru,/tmp/probe-. Watch environment variablesHOTARU_ACCOUNT_ROOTandHOTARU_ACCOUNT_SESSIONfor lingering references. Rotate every Telegram session on any host where the package ran. If your org runs the Hotaru Telegram client across a dev fleet, scope-pin PyPI installs through an internal mirror that blocksukraine69` until the campaign cools - For Cluster C (8-package audio TTS/ASR lure wave,
2026-10-emberlyttsextension of2026-10-voxevalcryptominer campaign): grep everyrequirements.txt,pyproject.toml,Pipfile.lock,poetry.lock,uv.lock,pdm.lock,conda envfordriftwavets,emberlytts,glassbeakasr,novalithtts,pyrechoasr,quasitonnts,tonemaptts,voltswannts(all0.1.0). On hit: the packages single function body has downloaded and executed a remote script from a URL reassembled at import time. The baseline deliverable in the parent2026-10-voxevalcampaign was a Monero cryptominer, so audit host CPU / GPU utilisation and process trees for mining-pool connections (Monero / XMR / CryptoNight pool domains and ports); image the host if you cannot rule out running processes. Treat the installer host as credential-compromised until a vendor publishes an IOC-level analysis of the specific remote-script content. The campaign naming shape (ts,tts,asr) targets AI speech-recognition and text-to-speech tooling - teach contributors (and any coding-agent that reads this record) that the real speech-tooling packages are published under upstream-known names (openai-whisper,elevenlabs,coqui-tts,piper-tts,vosk,whisper-jax,faster-whisper) and any newly-created-tts/-asr/ts` slug under a maintainer with no prior release history is suspect by default. Watch for a wave 3 under additional AI-speech-brand-impersonation names - NEW outbound denylist entries today: NONE directly disclosable from today
s advisories - theleakdeepwebhook is XOR-obfuscated and must be decoded fromleakdeep/config.pylocally per deployment, theukraine69C2 is Telegrams own authenticated data-centre IPs which cannot be egress-denied without breaking legitimate Telegram clients, and the Cluster C audio TTS/ASR remote-script URL is deliberately not embedded in the sdist. Keep prior egress blocks in place:realwbx.comapex +/ip.php+/ippaths (2026-10-15 and 2026-10-17),artifacts.creditslib.comapex +/npm/*paths (2026-10-17),login.fromthehotel.comapex +/muse+/api/poems/code+/api/art/downloads/*paths (2026-10-17),googleforum.pythonanywhere.comexact subdomain (2026-10-11),space-z.aiapex +preview-chat-960504a9-b4e0-4b69-bc80-6ac3d4fa4ae0.space-z.ai+b196q82k8891-d.space-z.aisubdomains (2026-10-14),dxpoc.gt.tcapex (2026-10-09),raw.githubusercontent.com/anonrider404/pypl/*path (2026-10-16),api-bsx.pages.devapex +/downloadpath (2026-10-16),177.7.60.239:48080+oob.recon.dev(2026-10-16),uncoder.eu.orgapex +/cc-checker/api.phppath (2026-10-15),accenture-npm.azurewebsites.net,limbomail.comapex +github.com/lunexindonesia/node-net-pool+github.com/trktgq0wbre1/node-net-pool,github.com/unicodeces/font-atlas,collector.oob.s4yhii.com+*.oob.s4yhii.com+s4yhii.comapex,64.181.165.115/dc,167.88.172.33:8087+jsonspack.com,goxtools.shopapex,minhdong.siteapex + GitHub userVangBanLaNhat,45.138.12.177:8089,185.158.107.175:8787,ltidi.storage.googleapis.com/depenconf/,oob.s4yhii.com:9999/native,*.oast.pro/*.oast.me/*.oast.fun/*.oast.site/*.oastify.com,frjmzbjbhwvtdnsuodmu.supabase.co,api.npoint.ioapex,tele.metry.orgin.net,morroncr0w.io,api.telegram.orgon untrusted CI/build hosts (does not apply to Cluster B because the operator uses raw Telegram data-centre IPs, not the HTTP bot API),appsecc.com,webhook.site/*,nfjbill.ren,storage.googleapis.com/depenconf/,10.0.19.0/24+10.0.49.0/24,api.nm-streetwear.space, Discord webhook URL pattern,ipify.org+ifconfig.me(relevant to Cluster A),gitflic.ru,api.wagmiwallet.org,backend-cybersecuritydashboard.onrender.com, Monero mining pools (relevant to Cluster C upgrade path from the parent2026-10-voxevalcampaign), Ethereum/Sepolia/Arbitrum/Polygon RPC endpoints,chinazhangsan.ccwu.cc,fabric-npm.gm-service.xyz,jsonkeeper.com,npm-canary.aveliscare.com,meta.brs.cx,s3://pkusinski-external/, AWS account631484165566, Slack bot-token exfil patterns,s85r5k14qk.execute-api.us-east-1.amazonaws.com/prod/hook,tuamaeaquelaursa.com,45.138.0.0/16RubyGems wgkit CIDRs
Sources
- GitHub Advisory Database - recent PyPI malware advisoriesgithub.com
- GHSA-4pw5-gqh4-v2pj - pypi leakdeep (Cluster A - 5-version Windows browser-credential + Discord-token infostealer, Amazon Inspector finder, MAL-2026-17921, CWE-506)github.com
- OSSF malicious-packages MAL-2026-17921 raw record (leakdeep IOCs: XOR-key 0x5A webhook URL in leakdeep/config.py reassembled by get_webhook(), Chrome/Edge/Brave credential harvester in leakdeep/core/system.py, Discord leveldb token harvester, ipify public-IP leak, per-version Amazon Inspector source hashes)raw.githubusercontent.com
- pypi.org release page for leakdeep 2.5.0 (Cluster A - oldest live malicious version)pypi.org
- pypi.org release page for leakdeep 2.6.6 (Cluster A - newest live malicious version)pypi.org
- GHSA-j83x-9pxh-rrgp - pypi ukraine69 (Cluster B - 8-version destructive Telegram account deletion payload, kam193 + Amazon Inspector cross-confirmation, campaign 2026-10-ukraine69, MAL-2026-17919)github.com
- OSSF malicious-packages MAL-2026-17919 raw record (ukraine69 IOCs: Telegram DC IPs 149.154.175.53/167.51/175.100/167.91 + 91.108.56.130, Hotaru vault paths, account.deleteAccount RPC, _gc_script 45s self-removal, destructive-actions + covering-tracks reasons)raw.githubusercontent.com
- kam193 bad-packages entry for ukraine69 (reporter detail page)bad-packages.kam193.eu
- pypi.org release page for ukraine69 1.2.1 (Cluster B - representative malicious release)pypi.org
- GHSA-fm3q-3w2v-hcmf - pypi driftwavets (Cluster C - audio-analysis-profiles lure, remote-script-not-embedded, kam193 reporter, campaign 2026-10-emberlytts extending 2026-10-voxeval, MAL-2026-17912)github.com
- GHSA-h24x-x3hv-v34p - pypi emberlytts (Cluster C - same wave, campaign-naming slug, MAL-2026-17913)github.com
- GHSA-8g3x-4h23-v3xp - pypi glassbeakasr (Cluster C - same wave, ASR-suffix naming, MAL-2026-17914)github.com
- GHSA-xf3f-g2fj-wr92 - pypi novalithtts (Cluster C - same wave, TTS-suffix naming, MAL-2026-17915)github.com
- GHSA-xvjf-fj8r-fjcf - pypi pyrechoasr (Cluster C - same wave, ASR-suffix naming, MAL-2026-17916)github.com
- GHSA-ghmx-wq8v-9683 - pypi quasitonnts (Cluster C - same wave, nts-suffix naming, MAL-2026-17917)github.com
- GHSA-22rf-pvvq-mghv - pypi tonemaptts (Cluster C - same wave, TTS-suffix naming, MAL-2026-17918)github.com
- GHSA-r8cm-478x-h626 - pypi voltswannts (Cluster C - same wave, nts-suffix naming, MAL-2026-17920)github.com
- OSSF malicious-packages MAL-2026-17913 raw record (emberlytts - the campaign-naming slug, explicit link to 2026-10-voxeval wording)raw.githubusercontent.com
- kam193 bad-packages entry for emberlytts (reporter detail page for the Cluster C campaign-naming slug)bad-packages.kam193.eu
- DependencyWatch: multi-2026-10-17-ghsa-malware-sweep (yesterday`s context - itsa-react legacy maintainer compromise, conx3993 wave 2, @flexmr wave 2 bare-URL deps, @beloved-lenora opencode AI-coding-tool lure, Baileys wave 5, PyPI marocolor + fromthehotel-poems)dependencywatch.io
- DependencyWatch: multi-2026-10-03-ghsa-malware-sweep (origin of the 2026-10-voxeval cryptominer campaign - voxeval was Cluster E, PyPI, campaign slug first disclosed)dependencywatch.io
- DependencyWatch: multi-2026-10-04-ghsa-malware-sweep (2026-10-voxeval cryptominer campaign siblings - 10 voxcpm/voxel-tts/caoxiltts/infrabench + 1 echogen, Cluster A)dependencywatch.io
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.