{"id":"MAL-2026-16262","kind":"package","aliases":["MAL-2026-16262"],"related":[],"title":"Malicious code in tailwindcss-form-ui (npm)","description":"---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (ba05c76200656d6746f6f200e1e45f8027d4c87bb6b2312b9690aad262ddf39c)\ntailwindcss-form-ui@0.5.8 impersonates @tailwindcss/forms: package.json sets author to '@tailwindcss' and repository to https://github.com/tailwindlabs/tailwindcss-forms while publishing under an unrelated name, and the README and plugin source are verbatim copies of the real @tailwindcss/forms with a malicious preamble added. The declared main entry src/index.js prepends ~15 KB of obfuscated code to the copied plugin. A custom deterministic string-shuffle primitive (functions named spin/peel/splitLane with hardcoded seed arrays) reconstructs the identifiers 'constructor', 'require', 'module', and 'global' at runtime, then invokes the Function constructor on a decoded code blob and immediately calls the resulting function with require bound as a local parameter: Forge('z', peel('<decoded body>'))(require). This executes attacker-controlled code with full Node module access the moment any consumer require()s the package. A Tailwind CSS plugin has no legitimate need to construct and run dynamically-decoded code at import time or to pass require into it; the obfuscation primitive exists only to hide the stager from static review.","summary":null,"severity":"critical","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"tailwindcss-form-ui","fixed":[],"affected":"= 0.5.1; = 0.5.8","ecosystem":"npm"}],"ecosystems":["npm"],"tags":["malicious","package"],"not_affected_if":[],"how_to_check":null,"fix":null,"status":"open","published_at":"2026-09-17T19:51:15+00:00","first_seen_at":"2026-11-11T21:29:24+00:00","triaged_at":"2026-11-11T21:30:27+00:00","updated_at":"2026-11-11T21:30:27+00:00","category":"package","confidence":null,"triage":null,"analyst_status":null,"analyst_note":null,"search":"'-16262':11A,14A '-2026':10A,13A '/tailwindlabs/tailwindcss-forms':52C '0.5.8':39C '15':83C 'access':153C 'add':76C 'amazon':32C 'amazon-inspector':31C 'array':105C 'attack':146C 'attacker-control':145C 'author':44C 'ba05c76200656d6746f6f200e1e45f8027d4c87bb6b2312b9690aad262ddf39c':34C 'blob':125C 'bound':134C 'call':128C 'code':2A,87C,124C,148C,177C 'construct':171C 'constructor':109C,120C 'consum':157C 'control':147C 'copi':67C,90C 'css':164C 'custom':93C 'declar':78C 'decod':123C,176C 'detail':23C 'determinist':94C 'dynam':175C 'dynamically-decod':174C 'edit':26C 'entri':80C 'execut':144C 'exist':190C 'forg':139C 'form':6A,17A,37C 'full':150C 'function':99C,119C,131C 'github.com':51C 'github.com/tailwindlabs/tailwindcss-forms':50C 'global':113C 'hardcod':103C 'hide':193C 'identifi':108C 'immedi':127C 'imperson':40C 'import':179C 'inspector':33C 'invok':117C 'kb':84C 'legitim':168C 'line':29C 'local':137C 'main':79C 'mal':9A,12A 'malici':1A,19B,74C 'modul':111C,152C 'moment':155C 'name':58C,100C 'need':169C 'node':151C 'npm':8A 'obfusc':86C,188C 'packag':20B,161C 'package.json':42C 'paramet':138C 'pass':183C 'peel':141C 'per':21C 'plugin':63C,91C,165C 'preambl':75C 'prepend':82C 'primit':98C,189C 'publish':54C 'readm':61C 'real':70C 'reconstruct':106C 'repositori':48C 'requir':110C,133C,142C,158C,184C 'result':130C 'review':198C 'run':173C 'runtim':115C 'seed':104C 'set':43C 'shuffl':97C 'sourc':22C,30C,64C 'spin/peel/splitlane':101C 'src/index.js':81C 'stager':195C 'static':197C 'string':96C 'string-shuffl':95C 'tailwind':163C 'tailwindcss':5A,16A,36C,46C 'tailwindcss-form-ui':4A,15A,35C 'tailwindcss/forms':41C,71C 'time':180C 'ui':7A,18A,38C 'unrel':57C 'verbatim':66C 'z':140C","nicknames":[],"mitigations":[],"who_affected":null,"tier":null,"verified":{},"analyst_revisit_at":null,"fix_status":null,"audience":null,"plain_action":null,"pkeys":["tailwindcssformui"],"ptokens":["form","tailwindcss","ui"],"labels":["critical","malicious","npm","package"],"campaign_type":null,"search_a":"'-16262':11A,14A '-2026':10A,13A 'code':2A 'form':6A,17A 'mal':9A,12A 'malici':1A 'npm':8A 'tailwindcss':5A,16A 'tailwindcss-form-ui':4A,15A 'ui':7A,18A","search_b":"'malici':19B 'packag':20B","search_c":"'/tailwindlabs/tailwindcss-forms':52C '0.5.8':39C '15':83C 'access':153C 'add':76C 'amazon':32C 'amazon-inspector':31C 'array':105C 'attack':146C 'attacker-control':145C 'author':44C 'ba05c76200656d6746f6f200e1e45f8027d4c87bb6b2312b9690aad262ddf39c':34C 'blob':125C 'bound':134C 'call':128C 'code':87C,124C,148C,177C 'construct':171C 'constructor':109C,120C 'consum':157C 'control':147C 'copi':67C,90C 'css':164C 'custom':93C 'declar':78C 'decod':123C,176C 'detail':23C 'determinist':94C 'dynam':175C 'dynamically-decod':174C 'edit':26C 'entri':80C 'execut':144C 'exist':190C 'forg':139C 'form':37C 'full':150C 'function':99C,119C,131C 'github.com':51C 'github.com/tailwindlabs/tailwindcss-forms':50C 'global':113C 'hardcod':103C 'hide':193C 'identifi':108C 'immedi':127C 'imperson':40C 'import':179C 'inspector':33C 'invok':117C 'kb':84C 'legitim':168C 'line':29C 'local':137C 'main':79C 'malici':74C 'modul':111C,152C 'moment':155C 'name':58C,100C 'need':169C 'node':151C 'obfusc':86C,188C 'packag':161C 'package.json':42C 'paramet':138C 'pass':183C 'peel':141C 'per':21C 'plugin':63C,91C,165C 'preambl':75C 'prepend':82C 'primit':98C,189C 'publish':54C 'readm':61C 'real':70C 'reconstruct':106C 'repositori':48C 'requir':110C,133C,142C,158C,184C 'result':130C 'review':198C 'run':173C 'runtim':115C 'seed':104C 'set':43C 'shuffl':97C 'sourc':22C,30C,64C 'spin/peel/splitlane':101C 'src/index.js':81C 'stager':195C 'static':197C 'string':96C 'string-shuffl':95C 'tailwind':163C 'tailwindcss':36C,46C 'tailwindcss-form-ui':35C 'tailwindcss/forms':41C,71C 'time':180C 'ui':38C 'unrel':57C 'verbatim':66C 'z':140C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-09-17T19:51:15+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"osv-malicious","external_id":"MAL-2026-16262","url":"https://osv.dev/vulnerability/MAL-2026-16262","severity":"critical","published_at":"2026-09-17T19:51:15+00:00","modified_at":"2026-11-11T21:15:15+00:00","first_seen_at":"2026-11-11T21:29:24+00:00","fetched_at":"2026-11-11T21:29:24+00:00","note":null}],"documents":[],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}