css4j / css4j

CSS parser with Event and Object Model APIs, a DOM wrapper and a CSS-aware DOM implementation. Written in the Java™ language.

Home Page:https://css4j.github.io/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

var() substitution in computed values was vulnerable to DoS attack

carlosame opened this issue · comments

When computing a value that depended on the evaluation of a var() function, a denial of service attack similar to the "billion laughs attack" was possible.

Affected versions:

  • 2.0: from 2.0.0 to 2.0.4.
  • 1.0: from 1.0.0 to 1.0.6.

The issue was fixed in 2.0.5 and 1.0.7, released on July 28, 2020.

A new test, VarBLATest.java, was added to verify that the code is no longer vulnerable. The following CSS is tested:

body {
  --bla0: lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol;
  --bla1: var(--bla0) var(--bla0) var(--bla0) var(--bla0) var(--bla0) var(--bla0) var(--bla0);
  --bla2: var(--bla1) var(--bla1) var(--bla1) var(--bla1) var(--bla1) var(--bla1) var(--bla1);
  --bla3: var(--bla2) var(--bla2) var(--bla2) var(--bla2) var(--bla2) var(--bla2) var(--bla2);
  --bla4: var(--bla3) var(--bla3) var(--bla3) var(--bla3) var(--bla3) var(--bla3) var(--bla3);
  --bla5: var(--bla4) var(--bla4) var(--bla4) var(--bla4) var(--bla4) var(--bla4) var(--bla4);
  --bla6: var(--bla5) var(--bla5) var(--bla5) var(--bla5) var(--bla5) var(--bla5) var(--bla5);
  --bla7: var(--bla6) var(--bla6) var(--bla6) var(--bla6) var(--bla6) var(--bla6) var(--bla6);
  --bla8: var(--bla7) var(--bla7) var(--bla7) var(--bla7) var(--bla7) var(--bla7) var(--bla7);
  --bla9: var(--bla8) var(--bla8) var(--bla8) var(--bla8) var(--bla8) var(--bla8) var(--bla8);
  --bla10: var(--bla9) var(--bla9) var(--bla9) var(--bla9) var(--bla9) var(--bla9) var(--bla9);
  --bla11: var(--bla10) var(--bla10) var(--bla10) var(--bla10) var(--bla10) var(--bla10) var(--bla10);
  --bla12: var(--bla11) var(--bla11) var(--bla11) var(--bla11) var(--bla11) var(--bla11) var(--bla11);
  --bla13: var(--bla12) var(--bla12) var(--bla12) var(--bla12) var(--bla12) var(--bla12) var(--bla12);
  --bla14: var(--bla13) var(--bla13) var(--bla13) var(--bla13) var(--bla13) var(--bla13) var(--bla13);
  --bla15: var(--bla14) var(--bla14) var(--bla14) var(--bla14) var(--bla14) var(--bla14) var(--bla14);
  --bla16: var(--bla15) var(--bla15) var(--bla15) var(--bla15) var(--bla15) var(--bla15) var(--bla15);
  --bla17: var(--bla16) var(--bla16) var(--bla16) var(--bla16) var(--bla16) var(--bla16) var(--bla16);
  --bla18: var(--bla17) var(--bla17) var(--bla17) var(--bla17) var(--bla17) var(--bla17) var(--bla17);
  --bla19: var(--bla18) var(--bla18) var(--bla18) var(--bla18) var(--bla18) var(--bla18) var(--bla18);
  --bla:  var(--bla19) var(--bla19) var(--bla19) var(--bla19) var(--bla19) var(--bla19) var(--bla19);
}
div {
  margin-left: var(--bla) var(--bla) var(--bla) var(--bla) var(--bla) var(--bla) var(--bla);
}

With CSS like the above and old versions of this library, an attacker could put in trouble any VM trying to compute styles from it.

It is believed that most users have already upgraded to more recent versions, and anyone who didn't is encouraged to use the latest available releases (currently 3.1, 2.2 and 1.1).