{"id":"MAL-2026-18182","kind":"package","aliases":["MAL-2026-18182"],"related":[],"title":"Malicious code in test-brotli2-testmetest (npm)","description":"test-brotli2-testmetest 1.0.0 ships a rebuild of the data-pipeline-testmetest 2.0.1 credential stealer and runs it on `npm install`: its `install` script runs `node-gyp rebuild`, and the `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 Brotli-compressed payload and pipes it into Bun. Published by npm account `testnewtestme2` on 2026-10-21.\n\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (191cc40d7896b393d37ba01dd32b1087b769c9fc7dd7b2debb32ba4ef34de11d)\nThe package's scripts.install runs node-gyp rebuild, and binding.gyp uses GYP command-expansion (`<!(env node index.js...; echo stub.c)`) in its sources list to invoke index.js during the configure phase. The binding.gyp declares target type 'none' and ships no C/C++ sources, so there is nothing to actually build — the file exists solely to trigger execution of index.js at install. index.js is a ~586 KB Caesar-shifted (+5) character-code array passed to eval; the decoded program imports node:crypto and uses createDecipheriv('aes-128-gcm',...) to decrypt further hex ciphertext blobs and execute the plaintext. No readable logic, URLs, or purpose is exposed in source. Installing this package on a default `npm install` runs this opaque encrypted payload on the installer's machine. CWE-506.","summary":null,"severity":"critical","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"test-brotli2-testmetest","fixed":[],"affected":"= 1.0.0","ecosystem":"npm"}],"ecosystems":["npm"],"tags":["malicious","package"],"not_affected_if":[],"how_to_check":null,"fix":null,"status":"open","published_at":"2026-10-21T18: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":"'+5':177C '-10':92C '-128':195C '-18182':11A,14A '-2026':10A,13A '-21':93C '-506':236C '/dev/null':59C '1':61C '1.0.0':25C '191cc40d7896b393d37ba01dd32b1087b769c9fc7dd7b2debb32ba4ef34de11d':107C '2':60C '2.0.1':35C '2026':91C '586':172C 'account':88C 'actual':156C 'ae':194C 'amazon':105C 'amazon-inspector':104C 'array':181C 'binding.gyp':54C,118C,141C 'blob':202C 'brot':77C 'brotli-compress':76C 'brotli2':6A,17A,23C 'build':157C 'bun':84C 'c/c':149C 'caesar':175C 'caesar-shift':174C 'charact':179C 'character-cod':178C 'ciphertext':201C 'code':2A,180C 'command':122C 'command-expans':121C 'compress':78C 'configur':138C 'createdecipheriv':193C 'credenti':36C 'crypto':190C 'cwe':235C 'data':32C 'data-pipeline-testmetest':31C 'declar':142C 'decod':186C 'decrypt':74C,198C 'default':222C 'detail':96C 'echo':62C,127C 'edit':99C 'encrypt':228C 'env':56C,124C 'eval':184C 'execut':164C,204C 'exist':160C 'expans':123C 'expos':214C 'file':159C 'gcm':196C 'gyp':50C,67C,115C,120C 'hex':200C 'import':188C 'index.js':58C,69C,126C,135C,166C,169C 'inspector':106C 'instal':43C,45C,168C,217C,224C,232C 'invok':134C 'kb':173C 'line':102C 'list':132C 'loader':72C 'logic':209C 'machin':234C 'make':64C 'mal':9A,12A 'malici':1A,19B 'node':49C,57C,66C,114C,125C,189C 'node-gyp':48C,65C,113C 'none':145C 'noth':154C 'npm':8A,42C,87C,223C 'obfusc':71C 'opaqu':227C 'packag':20B,109C,219C 'pass':182C 'payload':79C,229C 'per':94C 'phase':139C 'pipe':81C 'pipelin':33C 'plaintext':206C 'program':187C 'publish':85C 'purpos':212C 'readabl':208C 'rebuild':28C,51C,116C 'run':39C,47C,68C,112C,225C 'script':46C 'scripts.install':111C 'shift':176C 'ship':26C,147C 'sole':161C 'sourc':55C,95C,103C,131C,150C,216C 'stealer':37C 'stub.c':63C,128C 'target':143C 'test':5A,16A,22C 'test-brotli2-testmetest':4A,15A,21C 'testmetest':7A,18A,24C,34C 'testnewtestme2':89C 'trigger':163C 'type':144C 'url':210C 'use':119C,192C","nicknames":[],"mitigations":[],"who_affected":null,"tier":"B","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-21T18:00:00+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"osv-malicious","external_id":"MAL-2026-18182","url":"https://osv.dev/vulnerability/MAL-2026-18182","severity":"critical","published_at":"2026-10-21T18:00:00+00:00","modified_at":"2026-10-22T06:45:05+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"}