{"id":"MAL-2026-17864","kind":"package","aliases":["MAL-2026-17864"],"related":[],"title":"Malicious code in passwordcracker (npm)","description":"passwordcracker poses as a dependency-free Discord MFA library but pulls node-net-pool from the attacker's GitHub repo lunexindonesia/node-net-pool, and on load lib/cache.js runs `try{module['require']('node-net-pool')}catch(_){}` to execute it. On Windows, that index.js downloads a script from a limbomail.com attachment URL, saves it as a hidden winsvc.js under %APPDATA%, %LOCALAPPDATA% or %TEMP%, runs it via a hidden WinSvcHost.vbs, persists through HKCU Run/RunOnce, UserInitMprLogonScript and a Startup shortcut, and re-checks for updates every two hours. Amazon Inspector reported the same loader stub in discord-mfa-solver (MAL-2026-16100). The npm account kingsize published passwordcracker and passwordcrackv2 with identical code on 2026-10-09 and 2026-10-10.\n\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (b3aa1deb3b0d3ec4ce0e4694f806b9887b286764b96f177bc41deec309b9ddc3)\npackage.json at line 41 declares the sole runtime dependency `node-net-pool` as an off-registry HTTPS tarball pointing at the `main` branch of https://github.com/trktgq0wbre1/node-net-pool/archive/refs/heads/main.tar.gz, with no version pin, no commit SHA, and no integrity hash. On `npm install`, npm fetches whatever that mutable branch currently contains and installs it, running any lifecycle scripts inside the resulting package. The GitHub account hosting the tarball is unrelated to any established publisher, and the shipped source references pool functionality that is not implemented locally, so the external tarball supplies code that this package depends on at runtime. The package also ships an index.js that targets Discord's `/api/v9/mfa/finish` and vanity-url endpoints with caller-supplied token and password values and disables TLS verification against discord.com, canary.discord.com, and ptb.discord.com — an offensive tool operating on operator-supplied credentials rather than installer-owned data, which does not by itself attack the installer but confirms the package's hostile posture.","summary":null,"severity":"critical","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"passwordcracker","fixed":[],"affected":"all versions","ecosystem":"npm"}],"ecosystems":["npm"],"tags":["malicious","package"],"not_affected_if":[],"how_to_check":null,"fix":null,"status":"open","published_at":"2026-10-10T00:14:23+00:00","first_seen_at":"2026-10-29T14:24:37+00:00","triaged_at":"2026-10-29T14:25:47+00:00","updated_at":"2026-10-29T14:25:47+00:00","category":"package","confidence":null,"triage":null,"analyst_status":null,"analyst_note":null,"search":"'-09':130C '-10':129C,133C,134C '-16100':115C '-17864':8A,11A '-2026':7A,10A,114C '/api/v9/mfa/finish':258C '/trktgq0wbre1/node-net-pool/archive/refs/heads/main.tar.gz,':177C '2026':128C,132C '41':152C 'account':118C,213C 'also':250C 'amazon':101C,146C 'amazon-inspector':145C 'appdata':73C 'attach':64C 'attack':33C,301C 'b3aa1deb3b0d3ec4ce0e4694f806b9887b286764b96f177bc41deec309b9ddc3':148C 'branch':173C,197C 'caller':266C 'caller-suppli':265C 'canary.discord.com':278C 'catch':50C 'check':95C 'code':2A,126C,240C 'commit':183C 'confirm':305C 'contain':199C 'credenti':289C 'current':198C 'data':295C 'declar':153C 'depend':20C,157C,244C 'dependency-fre':19C 'detail':137C 'disabl':273C 'discord':22C,110C,256C 'discord-mfa-solv':109C 'discord.com':277C 'download':58C 'edit':140C 'endpoint':263C 'establish':221C 'everi':98C 'execut':52C 'extern':237C 'fetch':193C 'free':21C 'function':229C 'github':35C,212C 'github.com':176C 'github.com/trktgq0wbre1/node-net-pool/archive/refs/heads/main.tar.gz,':175C 'hash':188C 'hidden':70C,81C 'hkcu':85C 'host':214C 'hostil':309C 'hour':100C 'https':167C 'ident':125C 'implement':233C 'index.js':57C,253C 'insid':207C 'inspector':102C,147C 'instal':191C,201C,293C,303C 'installer-own':292C 'integr':187C 'kingsiz':119C 'lib/cache.js':41C 'librari':24C 'lifecycl':205C 'limbomail.com':63C 'line':143C,151C 'load':40C 'loader':106C 'local':234C 'localappdata':74C 'lunexindonesia/node-net-pool':37C 'main':172C 'mal':6A,9A,113C 'malici':1A,13B 'mfa':23C,111C 'modul':44C 'mutabl':196C 'net':29C,48C,160C 'node':28C,47C,159C 'node-net-pool':27C,46C,158C 'npm':5A,117C,190C,192C 'off-registri':164C 'offens':282C 'oper':284C,287C 'operator-suppli':286C 'own':294C 'packag':14B,210C,243C,249C,307C 'package.json':149C 'password':270C 'passwordcrack':4A,15C,121C 'passwordcracker':12A 'passwordcrackv2':123C 'per':135C 'persist':83C 'pin':181C 'point':169C 'pool':30C,49C,161C,228C 'pose':16C 'postur':310C 'ptb.discord.com':280C 'publish':120C,222C 'pull':26C 'rather':290C 're':94C 're-check':93C 'refer':227C 'registri':166C 'repo':36C 'report':103C 'requir':45C 'result':209C 'run':42C,77C,203C 'run/runonce':86C 'runtim':156C,247C 'save':66C 'script':60C,206C 'sha':184C 'ship':225C,251C 'shortcut':91C 'sole':155C 'solver':112C 'sourc':136C,144C,226C 'startup':90C 'stub':107C 'suppli':239C,267C,288C 'tarbal':168C,216C,238C 'target':255C 'temp':76C 'tls':274C 'token':268C 'tool':283C 'tri':43C 'two':99C 'unrel':218C 'updat':97C 'url':65C,262C 'userinitmprlogonscript':87C 'valu':271C 'vaniti':261C 'vanity-url':260C 'verif':275C 'version':180C 'via':79C 'whatev':194C 'window':55C 'winsvc.js':71C 'winsvchost.vbs':82C","nicknames":[],"mitigations":[],"who_affected":null,"tier":null,"verified":{},"analyst_revisit_at":null,"fix_status":null,"audience":null,"plain_action":null,"first_public_at":"2026-10-10T00:14:23+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"osv-malicious","external_id":"MAL-2026-17864","url":"https://osv.dev/vulnerability/MAL-2026-17864","severity":"critical","published_at":"2026-10-10T00:14:23+00:00","modified_at":"2026-10-29T13:48:10+00:00","first_seen_at":"2026-10-29T14:24:37+00:00","fetched_at":"2026-10-29T14:24:37+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}