GHSA-wxhq-pm8v-cw75
NoneCVSS
—
EPSS
—
Published
Jun 5, 2019
CISA due date
—
Cloudanix analysis
An older stylesheet compressor can be forced to freeze when it processes certain style sheets, which can stop websites or build jobs until they are restarted.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Moderate
- Impact
- Denial Of Service
- Component
- Library
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Low
- Patch risk
- Low
What it actually does
Vulnerable clean-css versions use regular expressions that can exhibit catastrophic backtracking when minifying or parsing certain CSS. A single crafted stylesheet can pin a Node.js thread at 100% CPU, block the event loop, and stall all other work in that process until timeout or restart. The flaw is availability-only: it does not yield code execution, authentication bypass, or direct data disclosure.
Why it matters to the business
Build pipelines, asset CDNs, and any runtime that minifies CSS on the fly can hang, delaying releases or taking down user-facing features until processes are recycled. Impact is highest where untrusted or third-party stylesheets are processed. The advisory is from 2019, is not in CISA KEV, is not associated with ransomware, and has no published exploit maturity, so mass in-the-wild abuse is unlikely; leftover risk is mainly unmaintained npm trees still pinning clean-css below 4.1.11.
How an attack unfolds
An attacker who can influence CSS that reaches clean-css—via an upload, a user-controlled theme, a style injection, or a compromised upstream package—submits input that forces a vulnerable regular expression into catastrophic backtracking. The minifier never completes; the hosting Node.js process stops handling other requests and appears hung. The attacker repeats or parallelizes submissions to extend the outage. This path does not by itself steal data or implant malware.
How to fix it
Upgrade the npm package clean-css to 4.1.11 or later in every direct and transitive dependency (package.json and lockfile). Rebuild and redeploy so runtime node_modules no longer contains vulnerable copies. Where immediate upgrade is blocked, isolate CSS minification behind strict size/time limits and do not feed untrusted stylesheets to clean-css. Prefer a currently maintained clean-css major line rather than remaining on 4.1.x indefinitely.
How to confirm the fix worked
Run npm ls clean-css (and inspect package-lock.json/yarn.lock/pnpm-lock.yaml) and confirm every installed instance is 4.1.11 or newer. Search container images and build artifacts for nested node_modules/clean-css. After upgrade, process representative and oversized CSS fixtures under a CPU/time cap and confirm minification completes without event-loop stalls.
Typical attack path
- Discover an application, CI job, or service that minifies CSS with clean-css older than 4.1.11
- Obtain a channel to supply or inject stylesheet content into that minification path
- Submit CSS crafted to trigger catastrophic regular-expression backtracking
- Saturate CPU and block the Node.js event loop so legitimate minify and application traffic fail
- Repeat or fan out requests to prolong denial of service until operators restart the process
How to detect it
There are no public in-the-wild campaigns or named threat actors for this 2019 ReDoS, and exploit maturity is none, so confirmed historical compromise is unlikely. Hunt for past availability incidents rather than malware artifacts: Node.js processes at sustained 100% CPU during CSS minify/build steps, minify HTTP endpoints with multi-minute durations or timeouts, worker restarts coinciding with stylesheet uploads, and application logs showing clean-css or css minification hanging then crashing. Review npm install history and lockfiles to see whether a vulnerable version was present at the time of any outage.
What your security team should do
- Inventory all applications and CI images for clean-css versions older than 4.1.11, including transitive installs
- Upgrade to clean-css 4.1.11 or later and commit refreshed lockfiles
- Fail builds that reintroduce vulnerable clean-css via dependency scanning
- Apply request size limits and hard timeouts around any runtime CSS minify path that accepts external input
- Treat leftover copies in abandoned services as availability debt and schedule removal or isolation
The record
Regular Expression Denial of Service in clean-css
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| NuGet | MIDIator.WebClient | 1.0.100 | No fix |
| NuGet | NorDroN.AngularTemplate | 0.1.5 | No fix |
| NuGet | PugViewEngine | 0.0.3 | No fix |
| NuGet | Sheeler.AngularTemplate | 0.0.1 | No fix |
| NuGet | Sheelersoft.AngularTemplate | 0.0.2 | No fix |
| NuGet | cloudscribe.templates | 3.0.1 | No fix |
| NuGet | dotnetng.template | 1.0.0.3 | No fix |
| npm | clean-css | 0 | 4.1.11 |
| npm | clean-css | 4.1.10 | No fix |
| nuget | MIDIator.WebClient | 1.0.100 | No fix |
| nuget | NorDroN.AngularTemplate | 0.1.5 | No fix |
| nuget | PugViewEngine | 0.0.3 | No fix |
| nuget | Sheeler.AngularTemplate | 0.0.1 | No fix |
| nuget | Sheelersoft.AngularTemplate | 0.0.2 | No fix |
| nuget | cloudscribe.templates | 3.0.1 | No fix |
| nuget | dotnetng.template | 1.0.0.3 | No fix |
Related vulnerabilities
- CVE-2026-112901 Pillow is a Python imaging library. CWE-1333
- CVE-2026-106454 Twisted is an event-based framework for internet applications, supporting Python 3.6+. CWE-1333
- CVE-2026-77387 geopy is a geocoding library for Python. CWE-1333
- CVE-2026-102990 basic-ftp is an FTP client for Node.js. CWE-1333
- CVE-2026-102473 A flaw was found in dash. CWE-1333
- CVE-2026-102270 PyJWT is a Python implementation of JSON Web Token standards. CWE-1333
- CVE-2026-101906 Axios is a promise-based HTTP client for the browser and Node.js. CWE-1333
- CVE-2026-101903 Axios is a promise-based HTTP client for the browser and Node.js. CWE-1333