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.