{"id":"MAL-2026-18186","kind":"package","aliases":["MAL-2026-18186"],"related":[],"title":"Malicious code in net-codec-testmetest (npm)","description":"---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (7bf1dbafca56ccfcb849f9ebb80b7a1cdf42007fd12618492620e0f7660476b2)\nThe package has no native source files but ships a binding.gyp whose sole target is type:'none' and whose sources array uses GYP command expansion (`<!(env node index.js...)`) to execute index.js during `node-gyp rebuild`, which npm invokes automatically whenever a binding.gyp is present. index.js is a Caesar-cipher-obfuscated IIFE whose decoded body imports node:crypto, reads the shipped data.bin blob, AES-128-GCM-decrypts it with hardcoded key/iv/aad, brotli-decompresses the result into a temporary file, and spawns that file under the Bun runtime (declared as the package's only dependency). The combination — binding.gyp with no native sources used purely as an install-time execution smuggler, an obfuscated eval-based loader, and an opaque encrypted payload executed under an alternate runtime — is a packed dropper with no legitimate function for a stated utility library.","summary":null,"severity":"critical","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"net-codec-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-22T06:11:48+00:00","first_seen_at":"2026-10-26T20:51:49+00:00","triaged_at":"2026-10-26T20:57:54+00:00","updated_at":"2026-10-26T21:05:48+00:00","category":"package","confidence":null,"triage":null,"analyst_status":null,"analyst_note":null,"search":"'-128':100C '-18186':11A,14A '-2026':10A,13A '7bf1dbafca56ccfcb849f9ebb80b7a1cdf42007fd12618492620e0f7660476b2':34C 'ae':99C 'altern':162C 'amazon':32C 'amazon-inspector':31C 'array':55C 'automat':74C 'base':152C 'binding.gyp':45C,77C,134C 'blob':98C 'bodi':90C 'brot':109C 'brotli-decompress':108C 'bun':123C 'caesar':84C 'caesar-cipher-obfusc':83C 'cipher':85C 'code':2A 'codec':6A,17A 'combin':133C 'command':58C 'crypto':93C 'data.bin':97C 'declar':125C 'decod':89C 'decompress':110C 'decrypt':103C 'depend':131C 'detail':23C 'dropper':167C 'edit':26C 'encrypt':157C 'env':60C 'eval':151C 'eval-bas':150C 'execut':64C,146C,159C 'expans':59C 'file':41C,116C,120C 'function':171C 'gcm':102C 'gcm-decrypt':101C 'gyp':57C,69C 'hardcod':106C 'iif':87C 'import':91C 'index.js':62C,65C,80C 'inspector':33C 'instal':144C 'install-tim':143C 'invok':73C 'key/iv/aad':107C 'legitim':170C 'librari':176C 'line':29C 'loader':153C 'mal':9A,12A 'malici':1A,19B 'nativ':39C,137C 'net':5A,16A 'net-codec-testmetest':4A,15A 'node':61C,68C,92C 'node-gyp':67C 'none':51C 'npm':8A,72C 'obfusc':86C,149C 'opaqu':156C 'pack':166C 'packag':20B,36C,128C 'payload':158C 'per':21C 'present':79C 'pure':140C 'read':94C 'rebuild':70C 'result':112C 'runtim':124C,163C 'ship':43C,96C 'smuggler':147C 'sole':47C 'sourc':22C,30C,40C,54C,138C 'spawn':118C 'state':174C 'target':48C 'temporari':115C 'testmetest':7A,18A 'time':145C 'type':50C 'use':56C,139C 'util':175C 'whenev':75C 'whose':46C,53C,88C","nicknames":[],"mitigations":[],"who_affected":null,"tier":"B","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-22T06:11:48+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"osv-malicious","external_id":"MAL-2026-18186","url":"https://osv.dev/vulnerability/MAL-2026-18186","severity":"critical","published_at":"2026-10-22T06:11:48+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"}