{"id":"MAL-2026-18177","kind":"package","aliases":["MAL-2026-18177"],"related":[],"title":"Malicious code in data-pipeline-testmetest (npm)","description":"data-pipeline-testmetest 2.0.1 is a self-spreading credential stealer that runs on `npm install` without an install script: its `binding.gyp` source `<!(env node index.js >/dev/null 2>&1; echo stub.c)` makes node-gyp run `index.js`, an obfuscated loader that decrypts a 939 KB payload and pipes it into Bun (downloaded from GitHub if missing). The payload steals GitHub, npm, PyPI, RubyGems and cloud credentials, commits them to a public repository it creates in the victim's GitHub account (description `project-utils`), and republishes the victim's packages with the same hook. Published by npm account `testnewtestme2` on 2026-10-21.\n\nIf it finds a GitHub token it installs a `net-health-checker` user service that runs `rm -rf ~/` once the token is revoked. Remove `~/.local/bin/net-health-checker.sh` and its systemd unit or LaunchAgent before revoking the token, then rotate all reachable credentials.\n\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (8975c3fc55ad84db15b5c688966a64a3befb41447d1c6c1ad0acf50df93fe409)\nThe package ships a binding.gyp whose target type is `none` with no C/C++ sources, and whose `sources` field uses GYP command expansion `<!(env node index.js...; echo stub.c)` to invoke the package's own index.js during the implicit `node-gyp rebuild` that npm runs whenever a binding.gyp is present. This provides install-time code execution without declaring a lifecycle script. index.js is not readable source for the advertised 'test pipeline utilities' purpose: its top-level body is `eval(ROT13(charCodeArray))`, where the decoded code constructs an AES-128-GCM decipher with hardcoded hex key/IV/authTag and executes the resulting ~1.8MB plaintext. The package also declares `bun ^1.2.18` as a runtime dependency, pulling in the Bun runtime installer alongside the obfuscated loader. The combination of a binding.gyp whose only purpose is to run an embedded obfuscated loader, a multi-layer ROT13+AES-GCM-wrapped eval payload with no legible source, and an unrelated alternate-runtime dependency is a loader/dropper structure, not a utility library.","summary":null,"severity":"critical","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"data-pipeline-testmetest","fixed":[],"affected":"= 2.0.1","ecosystem":"npm"}],"ecosystems":["npm"],"tags":["malicious","package"],"not_affected_if":[],"how_to_check":null,"fix":null,"status":"open","published_at":"2026-10-21T16:00:00+00:00","first_seen_at":"2026-10-26T20:51:49+00:00","triaged_at":"2026-10-26T20:59:55+00:00","updated_at":"2026-10-26T21:05:48+00:00","category":"package","confidence":null,"triage":null,"analyst_status":null,"analyst_note":null,"search":"'-10':123C '-128':269C '-18177':11A,14A '-2026':10A,13A '-21':124C '/.local/bin/net-health-checker.sh':150C '/dev/null':48C '1':50C '1.2.18':288C '1.8':280C '2':49C '2.0.1':25C '2026':122C '8975c3fc55ad84db15b5c688966a64a3befb41447d1c6c1ad0acf50df93fe409':179C '939':65C 'account':101C,119C 'advertis':248C 'ae':268C,324C 'aes-gcm-wrap':323C 'alongsid':299C 'also':285C 'altern':337C 'alternate-runtim':336C 'amazon':177C 'amazon-inspector':176C 'binding.gyp':43C,184C,226C,307C 'bodi':257C 'bun':72C,287C,296C 'c/c':192C 'charcodearray':261C 'checker':137C 'cloud':86C 'code':2A,234C,265C 'combin':304C 'command':200C 'commit':88C 'construct':266C 'creat':95C 'credenti':31C,87C,165C 'data':5A,16A,22C 'data-pipeline-testmetest':4A,15A,21C 'deciph':271C 'declar':237C,286C 'decod':264C 'decrypt':63C 'depend':292C,339C 'descript':102C 'detail':168C 'download':73C 'echo':51C,205C 'edit':171C 'embed':315C 'env':45C,202C 'eval':259C,327C 'execut':235C,277C 'expans':201C 'field':197C 'find':127C 'gcm':270C,325C 'github':75C,81C,100C,129C 'gyp':56C,199C,219C 'hardcod':273C 'health':136C 'hex':274C 'hook':115C 'implicit':216C 'index.js':47C,58C,204C,213C,241C 'inspector':178C 'instal':37C,40C,132C,232C,298C 'install-tim':231C 'invok':208C 'kb':66C 'key/iv/authtag':275C 'launchag':156C 'layer':321C 'legibl':331C 'level':256C 'librari':347C 'lifecycl':239C 'line':174C 'loader':61C,302C,317C 'loader/dropper':342C 'make':53C 'mal':9A,12A 'malici':1A,19B 'mb':281C 'miss':77C 'multi':320C 'multi-lay':319C 'net':135C 'net-health-check':134C 'node':46C,55C,203C,218C 'node-gyp':54C,217C 'none':189C 'npm':8A,36C,82C,118C,222C 'obfusc':60C,301C,316C 'packag':20B,111C,181C,210C,284C 'payload':67C,79C,328C 'per':166C 'pipe':69C 'pipelin':6A,23C,250C 'pipeline':17A 'plaintext':282C 'present':228C 'project':104C 'project-util':103C 'provid':230C 'public':92C 'publish':116C 'pull':293C 'purpos':252C,310C 'pypi':83C 'reachabl':164C 'readabl':244C 'rebuild':220C 'remov':149C 'repositori':93C 'republish':107C 'result':279C 'revok':148C,158C 'rf':143C 'rm':142C 'rot13':260C,322C 'rotat':162C 'rubygem':84C 'run':34C,57C,141C,223C,313C 'runtim':291C,297C,338C 'script':41C,240C 'self':29C 'self-spread':28C 'servic':139C 'ship':182C 'sourc':44C,167C,175C,193C,196C,245C,332C 'spread':30C 'steal':80C 'stealer':32C 'structur':343C 'stub.c':52C,206C 'systemd':153C 'target':186C 'test':249C 'testmetest':7A,18A,24C 'testnewtestme2':120C 'time':233C 'token':130C,146C,160C 'top':255C 'top-level':254C 'type':187C 'unit':154C 'unrel':335C 'use':198C 'user':138C 'util':105C,251C,346C 'victim':98C,109C 'whenev':224C 'whose':185C,195C,308C 'without':38C,236C 'wrap':326C","nicknames":[],"mitigations":[],"who_affected":null,"tier":"B","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-21T16:00:00+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"osv-malicious","external_id":"MAL-2026-18177","url":"https://osv.dev/vulnerability/MAL-2026-18177","severity":"critical","published_at":"2026-10-21T16:00:00+00:00","modified_at":"2026-10-22T06:45:04+00:00","first_seen_at":"2026-10-26T20:51:49+00:00","fetched_at":"2026-10-26T20:51:49+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"}