Vigil@nce : BSD, corruption de mémoire via printf
novembre 2009 par Vigil@nce
Lorsque l’attaquant peut choisir une valeur réelle, et son format
d’affichage par une fonction de la famille printf(), il peut
provoquer une corruption de mémoire conduisant à un déni de
service ou à l’exécution de code.
– Gravité : 2/4
– Conséquences : accès/droits utilisateur, déni de service du
service, déni de service du client
– Provenance : document
– Moyen d’attaque : 1 attaque
– Compétence de l’attaquant : technicien (2/4)
– Confiance : confirmé par l’éditeur (5/5)
– Diffusion de la configuration vulnérable : élevée (3/3)
– Date création : 30/10/2009
PRODUITS CONCERNÉS
– FreeBSD
– NetBSD
– OpenBSD
DESCRIPTION DE LA VULNÉRABILITÉ
Les versions récentes de FreeBSD, NetBSD et OpenBSD utilisent la
bibliothèque gdtoa (double to ascii) pour convertir les valeurs
réelles en chaînes de caractères. Les fonctions de la famille
printf() utilisent gdtoa.
Le nombre de chiffres d’un nombre réel peut être indiqué dans le
paramètre de format. Par exemple "%2.3f" affiche 2 chiffres avant
la virgule, et 3 après. Une syntaxe avancée peut aussi être
utilisée (le caractère ’*’ indique que la taille est dans le
paramètre suivant) :
printf "%2.*f" 3 ici_le_nombre_réel
Cependant, gdtoa/printf ne vérifie pas le nombre de caractères
’*’, ce qui permet à un attaquant de dépiler trop de valeurs de la
pile, et éventuellement de corrompre la mémoire.
Lorsque l’attaquant peut choisir une valeur réelle, et son format
d’affichage par une fonction de la famille printf(), il peut donc
provoquer un débordement conduisant à un déni de service ou à
l’exécution de code.
CARACTÉRISTIQUES
– Références : BID-36884, BID-36885, VIGILANCE-VUL-9141
– Url : http://vigilance.fr/vulnerabilite/BSD-corruption-de-memoire-via-printf-9141