ISS vient de publier qu'une faille avait été découverte dans les transferts ASCII de proftpd.
Tous les sources sur le site FTP de proftpd ont disparus (pratique pour les Gentoo et BSD qui recompilent à partir des sources). A la place, il y a des versions patchées à l'arrache. Il reste meme les fichiers .orig dans les .tar.gz
Le correctif appliqué est très bizarre. La fonction qui traite les conversions ASCII a beaucoup changée, peut-être pour que le bogue soit plus dur à trouver ?
Car à première vue le seul "problème" concerne la taille d'un buffer (session.xfer.buf) auquel il faudrait ajouter deux octets.
C'est dans src/data.c, le pcalloc() de la ligne 160 :
session.xfer.buf = pcalloc(session.xfer.p, session.xfer.bufsize);
Il manque un "+2" après bufsize.
Ajouter deux caractères aurait suffit à faire un tel correctif, pas besoin de réecrire la fonction.
La faille a vraiment l'air exploitable. Les pcalloc() sont libérés juste après (via destroy_pool()) et on doit pouvoir changer la taille des blocs. Je suis en tout cas arrivé très facilement à modifier free_blk->h.next.
Ca peut être un peu plus dur à exploiter sur les BSD que sur les Linux à cause de PKMalloc. Par contre quelque soit l'OS c'est trivial de ce servir de cette faille pour provoquer un déni de service. Downloadez un fichier de 1044 octets en ASCII => la charge du CPU reste à 100% et le seul moyen d'en sortir est un killall -9 proftpd.