{"id":"MAL-2026-17865","kind":"package","aliases":["MAL-2026-17865"],"related":[],"title":"Malicious code in passwordcrackv2 (npm)","description":"passwordcrackv2 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 passwordcrackv2 and passwordcracker 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 (5af882b3d847b17692c91b05e8efb4bf9947a0ec3b1ea5e04bb8681fc73f135c)\npackage.json declares its only dependency, 'node-net-pool', as an HTTPS tarball of the 'main' branch of github.com/lunexindonesia/node-net-pool, with no version pin and no integrity hash. npm install fetches whatever bytes that URL returns and runs any lifecycle scripts inside, so whoever controls that repository controls code delivered to every installer. The publisher of this package (mfasolver) does not match the dependency owner (lunexindonesia), so an unrelated third party controls the fetched content. lib/cache.js further wraps the dependency load as try{module['require']('node-net-pool')}catch(_){}, so the remote dependency is pulled in on normal library use via initMFA/cache.get() and any failure is silently swallowed. The package itself is advertised as Discord MFA/token-abuse tooling (PATCH /api/v9/guilds/0/vanity-url, POST /api/v9/mfa/finish, Cloudflare-bypass host rotation, TLS verification disabled via rejectUnauthorized:false); that capability targets operator-chosen Discord accounts rather than the installer directly, but the mutable-branch dependency is a direct install-time and import-time code-execution path against the installer regardless of how the stated API is used.","summary":null,"severity":"critical","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"passwordcrackv2","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-09T22:04:05+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 '-17865':8A,11A '-2026':7A,10A,114C '/api/v9/guilds/0/vanity-url':269C '/api/v9/mfa/finish':271C '/lunexindonesia/node-net-pool,':169C '2026':128C,132C '5af882b3d847b17692c91b05e8efb4bf9947a0ec3b1ea5e04bb8681fc73f135c':148C 'account':118C,290C 'advertis':263C 'amazon':101C,146C 'amazon-inspector':145C 'api':324C 'appdata':73C 'attach':64C 'attack':33C 'branch':165C,300C 'bypass':274C 'byte':182C 'capabl':284C 'catch':50C,239C 'check':95C 'chosen':288C 'cloudflar':273C 'cloudflare-bypass':272C 'code':2A,126C,198C,313C 'code-execut':312C 'content':224C 'control':194C,197C,221C 'declar':150C 'deliv':199C 'depend':20C,153C,213C,229C,243C,301C 'dependency-fre':19C 'detail':137C 'direct':295C,304C 'disabl':279C 'discord':22C,110C,265C,289C 'discord-mfa-solv':109C 'download':58C 'edit':140C 'everi':98C,201C 'execut':52C,314C 'failur':255C 'fals':282C 'fetch':180C,223C 'free':21C 'github':35C 'github.com':168C 'github.com/lunexindonesia/node-net-pool,':167C 'hash':177C 'hidden':70C,81C 'hkcu':85C 'host':275C 'hour':100C 'https':160C 'ident':125C 'import':310C 'import-tim':309C 'index.js':57C 'initmfa/cache.get':252C 'insid':191C 'inspector':102C,147C 'instal':179C,202C,294C,306C,318C 'install-tim':305C 'integr':176C 'kingsiz':119C 'lib/cache.js':41C,225C 'librari':24C,249C 'lifecycl':189C 'limbomail.com':63C 'line':143C 'load':40C,230C 'loader':106C 'localappdata':74C 'lunexindonesia':215C 'lunexindonesia/node-net-pool':37C 'main':164C 'mal':6A,9A,113C 'malici':1A,13B 'match':211C 'mfa':23C,111C 'mfa/token-abuse':266C 'mfasolv':208C 'modul':44C,233C 'mutabl':299C 'mutable-branch':298C 'net':29C,48C,156C,237C 'node':28C,47C,155C,236C 'node-net-pool':27C,46C,154C,235C 'normal':248C 'npm':5A,117C,178C 'oper':287C 'operator-chosen':286C 'owner':214C 'packag':14B,207C,260C 'package.json':149C 'parti':220C 'passwordcrack':123C 'passwordcrackv2':4A,12A,15C,121C 'patch':268C 'path':315C 'per':135C 'persist':83C 'pin':173C 'pool':30C,49C,157C,238C 'pose':16C 'post':270C 'publish':120C,204C 'pull':26C,245C 'rather':291C 're':94C 're-check':93C 'regardless':319C 'rejectunauthor':281C 'remot':242C 'repo':36C 'report':103C 'repositori':196C 'requir':45C,234C 'return':185C 'rotat':276C 'run':42C,77C,187C 'run/runonce':86C 'save':66C 'script':60C,190C 'shortcut':91C 'silent':257C 'solver':112C 'sourc':136C,144C 'startup':90C 'state':323C 'stub':107C 'swallow':258C 'tarbal':161C 'target':285C 'temp':76C 'third':219C 'time':307C,311C 'tls':277C 'tool':267C 'tri':43C,232C 'two':99C 'unrel':218C 'updat':97C 'url':65C,184C 'use':250C,326C 'userinitmprlogonscript':87C 'verif':278C 'version':172C 'via':79C,251C,280C 'whatev':181C 'whoever':193C 'window':55C 'winsvc.js':71C 'winsvchost.vbs':82C 'wrap':227C","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-09T22:04:05+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"osv-malicious","external_id":"MAL-2026-17865","url":"https://osv.dev/vulnerability/MAL-2026-17865","severity":"critical","published_at":"2026-10-09T22:04:05+00:00","modified_at":"2026-10-29T13:48:11+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"}