Pular para o conteúdo
Todos os conceitos

Billion laughs

Entidades que se referenciam em camadas crescem de forma explosiva e podem travar o parser.

As entidades podem referenciar outras entidades. Parece inofensivo, mas em camadas o crescimento é explosivo. O exemplo clássico se chama billion laughs:

<!ENTITY lol0 "lol">
<!ENTITY lol1 "&lol0;&lol0;&lol0;&lol0;&lol0;&lol0;&lol0;&lol0;&lol0;&lol0;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">

Cada nível repete o anterior dez vezes. lol1 vira 10 vezes lol0, lol2 vira 100, e assim por diante. Com nove níveis, &lol9; se expande para 10 elevado a 9, ou seja um bilhão de cópias de lol0. O arquivo tem menos de 1 KB, mas o texto expandido passaria de 1 GB. O parser que tenta montar tudo na memória trava: isso é uma negação de serviço (DoS), sem precisar ler arquivo nenhum.

Você não precisa gerar o monstro para entender: dá para contar os níveis e multiplicar (dez por nível). A defesa é limitar quantas expansões o parser aceita, ou recusar o DTD, que é onde as entidades moram.

cada nível repete o anterior dez vezes lol0 = 1 lol1 = 10 lol2 = 100 ... x10 x10 lol9 = 1 000 000 000 cópias de lol0 arquivo < 1 KB expandido > 1 GB: trava o parser
lol0 vale lol; cada nível repete o anterior dez vezes, então lol9 chega a dez elevado a nove cópias a partir de menos de 1 KB.

Aparece nestes desafios