---
id: "MAL-2026-16262"
page: "https://infrastack.ai/live/MAL-2026-16262"
kind: "package"
aliases: ["MAL-2026-16262"]
title: "Malicious code in tailwindcss-form-ui (npm)"
severity: "critical"
cvss: null
epss: null
exploited: false
status: "open"
category: "package"
products: [{"name": "tailwindcss-form-ui", "fixed": [], "affected": "= 0.5.1; = 0.5.8", "ecosystem": "npm"}]
ecosystems: ["npm"]
tags: ["malicious", "package"]
not_affected_if: []
published_at: "2026-09-17T19:51:15+00:00"
first_seen_at: "2026-11-11T21:29:24+00:00"
updated_at: "2026-11-11T21:30:27+00:00"
sources: [{"source": "osv-malicious", "url": "https://osv.dev/vulnerability/MAL-2026-16262", "first_seen_at": "2026-11-11T21:29:24+00:00"}]
exploit_sources: []
---

# Malicious code in tailwindcss-form-ui (npm)

Link for people: https://infrastack.ai/live/MAL-2026-16262 (this .md is for agents)

## Affected

- npm:tailwindcss-form-ui affected = 0.5.1; = 0.5.8 fixed no fixed version listed

## Timeline

- 2026-11-11T21:29:24+00:00 osv-malicious https://osv.dev/vulnerability/MAL-2026-16262

## From the sources

---
_-= Per source details. Do not edit below this line.=-_

## Source: amazon-inspector (ba05c76200656d6746f6f200e1e45f8027d4c87bb6b2312b9690aad262ddf39c)
tailwindcss-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.

---

_Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai_
