User Tools

Site Tools


hack:testing_for_format_string

testing_guide

Résumé

Cette section décrit comment tester les attaques de format de chaîne qui peuvent être utilisées pour planter un programme ou exécuter du code nuisible. Le problème provient de l'utilisation d'entrées utilisateur non filtrées comme paramètre de format chaîne de caractères dans certaines fonctions C qui effectuent la mise en forme, telles que printf().

Description

Divers langages de style C formatent l'entée fournie au moyen de fonctions comme printf(), fprintf(), etc

Le formatage est régi par un paramètre aux fonctions appelées de type spécificateur de format, généralement %s et %c

La vulnérabilité survient lorsque les fonctions de formatage sont appelées à la valider des paramètres inadéquats dans les données contrôlées par l'utilisateur.

Un exemple simple serait printf(argv[1]). Dans ce cas, le spécificateur de type n'a pas été explicitement déclaré, permettant à un utilisateur de passer des caractères tels que%n, %s, x% à la requête au moyen de l'argument argv [1] de la ligne de commande .

Une application qui permet à u utilisateur de fournir des spécificateurs de format permet d'effectuer les actions malveillants suivantes :

Énumérer la pile du processus : Ceci permet à un adversaire de visualiser l'organisation de la pile du processus vulnérable en fournissant des chaînes de format, tels que %x ou %p, ce qui peut conduire à des fuites d'informations sensibles. Cela peut également être utilisé pour extraire des valeurs canary lorsque l'application est protégée par un mécanisme de protection de la pile. Couplé avec un débordement de pile, cette information peut être utilisée pour contourner la protection de la pile. Contrôler le flux d'exécution: Cette vulnérabilité peut aussi faciliter l'exécution de code arbitraire, car elle permet d'écrire 4 octets de données dans une adresse fournie par l'adversaire. Le spécificateur %n est très utile pour écraser les pointeurs de fonctions diverses dans la mémoire avec l'adresse de la charge utile malveillante. Lorsque ces pointeurs de fonctions écrasés sont appelés, l'exécution exécute du code malveillant. Déni de service: Si l'adversaire n'est pas en mesure de fournir du code malveillant pour l'exécution, l'application vulnérable peut être plantée en fournissant une suite de %x suivie par % n.

Test boîte noire

La clé pour tester la vulnérabilité de format de chaîne est la fourniture de spécificateurs de type de format en entrée de l'application.

Par exemple, considérons une application qui traite la chaîne d'URL http://xyzhost.com/html/en/index.htm ou qui accepte des entrées de formulaire. Si une vulnérabilité de format de chaîne existe dans une des routines de traitement de ces informations, fournir une URL de type http://xyzhost.com/html/en/index.htm%n%n%n ou passer %n dans l'un des champs du formulaire pourrait planter l'application par la prise d'un dump dans un dossier local du site d'hébergement.

Les vulnérabilités de format de chaîne se manifestent principalement dans les serveurs web, serveurs d'applications ou les applications web qui utilisent code C /C++ ou des scripts CGI écrits en C. Dans la plupart des cas, un rapport d'erreur ou des fonctions de journalisation comme syslog() seront appelées.

Lors du test des scripts CGI pour les vulnérabilités de format de chaîne, les paramètres d'entrée peuvent être manipulées pour inclure les spécificateurs de type %x ou % n. Par exemple, une demande légitime comme

http://hostname/cgi-bin/query.cgi?name=john&code=45765  

peut être modifiée en

http://hostname/cgi-bin/query.cgi?name=john%x.%x.%x&code=45765%x.%x

Si une vulnérabilité de format de chaîne existe dans la routine de traitement de cette demande, le testeur sera en mesure de voir les données d'empilement s'afficher dans le navigateur.

Si le code n'est pas disponible, le processus d'examen des fragments d'assemblage (aussi connu comme ingénierie inverse des binaires) donnerait des informations substantielles sur les bogues de format de chaîne.

Prenez l'exemple de code (1):

int main(int argc, char **argv)
{
printf("The string entered is\n");
printf(“%s”,argv[1]);
return 0;
}

lorsque le désassemblage est examinée à l'aide de l'IDA Pro, l'adresse d'un spécificateur de type de format poussé dans la pile est visible avant qu'un appel à printf ne soit fait.

D'autre part, lorsque le même code est compilé sans argument“%s”, la variation dans l'assemblage est évidente. Comme on le voit ci-dessous, il n'y a pas d'offset poussé dans la pile avant d'appeler printf.

Test boîte grise

Lors de l'examen du code, presque toutes les vulnérabilités de format de chaîne peuvent être détectées par l'utilisation d'outils d'analyse statique de code. Soumettre le code affiché dans (1) à ITS4, qui est un outil d'analyse de code statique, donne le résultat suivant.

Les fonctions qui sont principalement responsables de la vulnérabilité de format de chaîne sont celles qui traitent les spécificateurs de format en option. Par conséquent, lors de l'examen manuel du code, l'accent peut être accordé à des fonctions telles que:

printf
fprintf
sprintf
snprintf
vfprintf
vprintf
vsprintf
vsnprintf

Il peut y avoir plusieurs fonctions de mise en page qui sont spécifiques à la plate-forme de développement. Celles-ci devraient également être examinées pourvérifier l'absence de format de chaînes.

Références

Livres Blancs

Outils

hack/testing_for_format_string.txt · Last modified: 2019/02/13 13:10 by 127.0.0.1