Comme cadeau de Noel cette annee, Microsoft a decide de nous offrir un overflow distant pre-authentification dans le service FTP de IIS 7.5 (Windows 7 et 2008 R2). Le bug est marrant. Considerons l'extrait de pseudo code C suivant:
char *src,*dst,*end;
...
while (src!=end) {
if (*(++src)==(char)0xff)
*(dst++)=(char)0xff;
*(dst++)=*src;
}
Evidemment, si dst a assez de place pour accomoder les caracteres 0xff supplementaires, tout se passe bien. Le probleme se situe dans un cas particulier ou si la taille de src plus le nombre de 0xff est inferieure ou egale a la taille du buffer courant, alors pas la peine d'allouer dst, et on se contentera de dst=src. Dans ce cas precis, si src contient deux caracteres 0xff (ou plus, et pas necessairement consecutifs), dst va commencer a ecrire des 0xff dans une portion de src pas encore lu. Le nombre de 0xff dans src n'est alors plus deux, mais trois, et ca continue a augmenter. Au final, on va deborder de dst avec plein de 0xff.
La simple chaine '\xff\xff\xff\xff'+'A'*0x200+'\r\n' fera planter le service FTP d'IIS.
Le bug est-t-il exploitable? C'est loin d'etre gagne. La taille allouee pour src est controlable, la taille du debordement est controlable, le contenu ... pas super controlable. Il se peut qu'il soit possible de faire quelque chose avec le contenu d'un chunk ecrase par une serie de 0xff avant que le processus ne parte en vrille. Ou pas.
Maintenant concernant la
terminologie: un debordement de buffer peut aboutir a un deni de service s'il n'est pas correctement exploite, les deux termes ne sont pas exclusifs.