{"id":"MAL-2026-18178","kind":"package","aliases":["MAL-2026-18178"],"related":[],"title":"Malicious code in event-emitter-testmetest (npm)","description":"event-emitter-testmetest was published by npm account `testnewtestme2` on 2026-10-21, first to test the delivery chain of data-pipeline-testmetest 2.0.1 and then to ship it. 1.0.6 and 1.0.7 ship an obfuscated `index.js` loader that decrypts a filler stage and pipes it into Bun with the full environment: 1.0.6 runs it on load, 1.0.7 on `npm install` via a `binding.gyp` source `<!(env node index.js >/dev/null 2>&1; echo stub.c)`. 4.1.0 and 5.0.0 ship rebuilds of the full stealer behind the same `binding.gyp` hook: inline in `index.js` in 4.1.0, and in an encrypted `data.bin` that `index.js` decrypts in 5.0.0. Other versions carry no executable payload.\n\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (8d4e6bad5d24d9c63960e77cc82c054c3b14704bea931cd48c86025fa4dc45c9)\nThe package's `main` (index.js) is a multi-layer obfuscated loader: a String.fromCharCode-reconstructed string is Caesar-shifted (k=19) and eval'd, which then AES-128-GCM-decrypts a hardcoded hex ciphertext using embedded key/iv/authTag and executes the plaintext via a dynamic `Function(module, require, process, Buffer, __filename, __dirname, <plaintext>)` call, giving the decrypted bytes full Node module, require, and process access. The payload is opaque to any installer. `binding.gyp` declares a target with no native source files and uses GYP command-expansion (`<!(env node index.js...)`) in `sources`, which runs the loader during `node-gyp rebuild` — npm invokes node-gyp automatically whenever `binding.gyp` is present, so the loader runs on `npm install` even though `package.json.scripts` contains no install hook. The same loader also executes whenever another module `require`s this package. The stacked charcode+Caesar+AES-GCM obfuscation and the use of a no-sources `binding.gyp` purely to trigger node-gyp are consistent only with hiding and auto-executing attacker-controlled code against the installer host.","summary":null,"severity":"critical","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"event-emitter-testmetest","fixed":[],"affected":"= 1.0.6; = 1.0.7; = 4.1.0; = 5.0.0","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:55+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':33C '-128':172C '-18178':11A,14A '-2026':10A,13A '-21':34C '/dev/null':90C '1':92C '1.0.6':52C,74C '1.0.7':54C,79C '19':165C '2':91C '2.0.1':46C '2026':32C '4.1.0':95C,113C '5.0.0':97C,123C '8d4e6bad5d24d9c63960e77cc82c054c3b14704bea931cd48c86025fa4dc45c9':143C 'access':208C 'account':29C 'ae':171C,286C 'aes-gcm':285C 'also':272C 'amazon':141C 'amazon-inspector':140C 'anoth':275C 'attack':314C 'attacker-control':313C 'auto':311C 'auto-execut':310C 'automat':250C 'behind':104C 'binding.gyp':85C,107C,216C,252C,297C 'buffer':194C 'bun':69C 'byte':201C 'caesar':162C,284C 'caesar-shift':161C 'call':197C 'carri':126C 'chain':40C 'charcod':283C 'ciphertext':179C 'code':2A,316C 'command':229C 'command-expans':228C 'consist':305C 'contain':265C 'control':315C 'd':168C 'data':43C 'data-pipeline-testmetest':42C 'data.bin':118C 'declar':217C 'decrypt':61C,121C,175C,200C 'deliveri':39C 'detail':132C 'dirnam':196C 'dynam':189C 'echo':93C 'edit':135C 'embed':181C 'emitt':6A,23C 'emitter':17A 'encrypt':117C 'env':87C,231C 'environ':73C 'eval':167C 'even':262C 'event':5A,16A,22C 'event-emitter-testmetest':4A,15A,21C 'execut':128C,184C,273C,312C 'expans':230C 'file':224C 'filenam':195C 'filler':63C 'first':35C 'full':72C,102C,202C 'function':190C 'gcm':174C,287C 'gcm-decrypt':173C 'give':198C 'gyp':227C,243C,249C,303C 'hardcod':177C 'hex':178C 'hide':308C 'hook':108C,268C 'host':320C 'index.js':58C,89C,111C,120C,148C,233C 'inlin':109C 'inspector':142C 'instal':82C,215C,261C,267C,319C 'invok':246C 'k':164C 'key/iv/authtag':182C 'layer':153C 'line':138C 'load':78C 'loader':59C,155C,239C,257C,271C 'main':147C 'mal':9A,12A 'malici':1A,19B 'modul':191C,204C,276C 'multi':152C 'multi-lay':151C 'nativ':222C 'no-sourc':294C 'node':88C,203C,232C,242C,248C,302C 'node-gyp':241C,247C,301C 'npm':8A,28C,81C,245C,260C 'obfusc':57C,154C,288C 'opaqu':212C 'packag':20B,145C,280C 'package.json.scripts':264C 'payload':129C,210C 'per':130C 'pipe':66C 'pipelin':44C 'plaintext':186C 'present':254C 'process':193C,207C 'publish':26C 'pure':298C 'rebuild':99C,244C 'reconstruct':158C 'requir':192C,205C,277C 'run':75C,237C,258C 'shift':163C 'ship':50C,55C,98C 'sourc':86C,131C,139C,223C,235C,296C 'stack':282C 'stage':64C 'stealer':103C 'string':159C 'string.fromcharcode':157C 'stub.c':94C 'target':219C 'test':37C 'testmetest':7A,18A,24C,45C 'testnewtestme2':30C 'though':263C 'trigger':300C 'use':180C,226C,291C 'version':125C 'via':83C,187C 'whenev':251C,274C","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-18178","url":"https://osv.dev/vulnerability/MAL-2026-18178","severity":"critical","published_at":"2026-10-21T16:00:00+00:00","modified_at":"2026-10-26T19:00:41+00:00","first_seen_at":"2026-10-26T20:51:55+00:00","fetched_at":"2026-10-26T20:51:55+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"}