{"id":"MAL-2026-18179","kind":"package","aliases":["MAL-2026-18179"],"related":[],"title":"Malicious code in log-sink-testmetest (npm)","description":"log-sink-testmetest 1.0.1 ships the credential stealer of data-pipeline-testmetest 2.0.1 and runs it 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`, which decrypts `data.bin` and pipes it into Bun. The payload is identical to the one in event-emitter-testmetest 5.0.0. Published by npm account `testnewtestme2` on 2026-10-21; 1.0.0 is empty.\n\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (b429dffb99ce1de5d5c43b4d59da752748d6400d53f36485ce9e78faaa6e6881)\nlog-sink-testmetest@1.0.1 ships a binding.gyp that uses GYP command expansion `<!(env node index.js...; echo stub.c)` on a target of type `none` with no C/C++ sources. Because npm invokes `node-gyp rebuild` whenever a binding.gyp is present, this expansion causes index.js to be executed on `npm install` with no `scripts` declaration. index.js itself is a String.fromCharCode array wrapped in eval() over a Caesar-shifted (shift 10) decryptor stub. The decoded stub reads the sibling data.bin (~372KB opaque blob), AES-128-GCM-decrypts it with hardcoded key/iv/aad, gunzips the result, and then either `eval`s the resulting JavaScript or spawns a Bun runtime and pipes the decrypted payload into Bun via stdin. The binding.gyp ships no native sources, so its sole purpose is to trigger execution of the encrypted payload at install time. The combination of a no-sources binding.gyp used purely as a lifecycle hook, multi-layer obfuscation (charcode → Caesar → eval → AES-GCM → gzip → eval), an opaque encrypted payload, and an alternate-runtime (Bun) execution branch to evade Node-focused inspection is a staged install-time dropper.","summary":null,"severity":"critical","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"log-sink-testmetest","fixed":[],"affected":"= 1.0.1","ecosystem":"npm"}],"ecosystems":["npm"],"tags":["malicious","package"],"not_affected_if":[],"how_to_check":null,"fix":null,"status":"open","published_at":"2026-10-21T17:30: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':91C '-128':193C '-18179':11A,14A '-2026':10A,13A '-21':92C '/dev/null':52C '1':54C '1.0.0':93C '1.0.1':25C,114C '10':179C '2':53C '2.0.1':35C '2026':90C '372kb':189C '5.0.0':83C 'account':87C 'ae':192C,269C 'aes-gcm':268C 'altern':280C 'alternate-runtim':279C 'amazon':107C 'amazon-inspector':106C 'array':169C 'b429dffb99ce1de5d5c43b4d59da752748d6400d53f36485ce9e78faaa6e6881':109C 'binding.gyp':47C,117C,147C,227C,254C 'blob':191C 'branch':284C 'bun':70C,215C,223C,282C 'c/c':136C 'caesar':176C,266C 'caesar-shift':175C 'caus':152C 'charcod':265C 'code':2A 'combin':248C 'command':121C 'credenti':28C 'data':32C 'data-pipeline-testmetest':31C 'data.bin':65C,188C 'declar':163C 'decod':183C 'decrypt':64C,196C,220C 'decryptor':180C 'detail':98C 'dropper':297C 'echo':55C,126C 'edit':101C 'either':206C 'emitt':81C 'empti':95C 'encrypt':242C,275C 'env':49C,123C 'evad':286C 'eval':172C,207C,267C,272C 'event':80C 'event-emitter-testmetest':79C 'execut':156C,239C,283C 'expans':122C,151C 'focus':289C 'gcm':195C,270C 'gcm-decrypt':194C 'gunzip':201C 'gyp':60C,120C,143C 'gzip':271C 'hardcod':199C 'hook':260C 'ident':74C 'index.js':51C,62C,125C,153C,164C 'inspect':290C 'inspector':108C 'instal':41C,44C,159C,245C,295C 'install-tim':294C 'invok':140C 'javascript':211C 'key/iv/aad':200C 'layer':263C 'lifecycl':259C 'line':104C 'log':5A,16A,22C,111C 'log-sink-testmetest':4A,15A,21C,110C 'make':57C 'mal':9A,12A 'malici':1A,19B 'multi':262C 'multi-lay':261C 'nativ':230C 'no-sourc':251C 'node':50C,59C,124C,142C,288C 'node-focus':287C 'node-gyp':58C,141C 'none':133C 'npm':8A,40C,86C,139C,158C 'obfusc':264C 'one':77C 'opaqu':190C,274C 'packag':20B 'payload':72C,221C,243C,276C 'per':96C 'pipe':67C,218C 'pipelin':33C 'present':149C 'publish':84C 'pure':256C 'purpos':235C 'read':185C 'rebuild':144C 'result':203C,210C 'run':37C,61C 'runtim':216C,281C 'script':45C,162C 'shift':177C,178C 'ship':26C,115C,228C 'sibl':187C 'sink':6A,17A,23C,112C 'sole':234C 'sourc':48C,97C,105C,137C,231C,253C 'spawn':213C 'stage':293C 'stdin':225C 'stealer':29C 'string.fromcharcode':168C 'stub':181C,184C 'stub.c':56C,127C 'target':130C 'testmetest':7A,18A,24C,34C,82C,113C 'testnewtestme2':88C 'time':246C,296C 'trigger':238C 'type':132C 'use':119C,255C 'via':224C 'whenev':145C 'without':42C 'wrap':170C","nicknames":[],"mitigations":[],"who_affected":null,"tier":"B","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-21T17:30:00+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"osv-malicious","external_id":"MAL-2026-18179","url":"https://osv.dev/vulnerability/MAL-2026-18179","severity":"critical","published_at":"2026-10-21T17:30: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"}