Article de reference

Chaîne de format non contrôlée

La chaîne de format non contrôlée est un type de vulnérabilité d'injection de code découverte vers 1989 qui peut être utilisée dans des exploits de sécurité . Initialement consi...

La chaîne de format non contrôlée est un type de vulnérabilité d'injection de code découverte vers 1989 qui peut être utilisée dans des exploits de sécurité . Initialement considérées comme inoffensives, les exploits de chaîne de format peuvent être utilisés pour planter un programme ou pour exécuter du code nuisible. Le problème provient de l'utilisation d' une entrée utilisateur non contrôlée comme paramètre de chaîne de format dans certaines fonctions C qui effectuent le formatage, telles que . Un utilisateur malveillant peut utiliser les jetons de format et , entre autres, pour imprimer des données à partir de la pile d'appels ou éventuellement d'autres emplacements en mémoire. On peut également écrire des données arbitraires à des emplacements arbitraires à l'aide du jeton de format, qui commande et des fonctions similaires pour écrire le nombre d'octets formatés à une adresse stockée sur la pile. printf()%s%x%nprintf()

Détails

Un exploit typique utilise une combinaison de ces techniques pour prendre le contrôle du pointeur d'instruction (IP) d'un processus, par exemple en forçant un programme à écraser l'adresse d'une fonction de bibliothèque ou l'adresse de retour sur la pile avec un pointeur vers un shellcode malveillant . Les paramètres de remplissage des spécificateurs de format sont utilisés pour contrôler le nombre d'octets de sortie et le %xjeton est utilisé pour extraire des octets de la pile jusqu'à ce que le début de la chaîne de format elle-même soit atteint. Le début de la chaîne de format est conçu pour contenir l'adresse que le %njeton de format peut ensuite écraser avec l'adresse du code malveillant à exécuter.

Il s'agit d'une vulnérabilité courante, car les bogues de format étaient auparavant considérés comme inoffensifs et ont entraîné des vulnérabilités dans de nombreux outils courants. Le projet CVE du MITRE répertorie environ 500 programmes vulnérables en juin 2007, et une analyse des tendances le classe au 9e rang des types de vulnérabilité les plus signalés entre 2001 et 2006.

Les bogues de chaîne de format apparaissent le plus souvent lorsqu'un programmeur souhaite générer une chaîne contenant des données fournies par l'utilisateur (soit dans un fichier, soit dans un tampon, soit à l'utilisateur). Le programmeur peut écrire par erreur printf(buffer)au lieu de printf("%s", buffer). La première version interprète buffercomme une chaîne de format et analyse toutes les instructions de formatage qu'elle peut contenir. La deuxième version imprime simplement une chaîne à l'écran, comme le programmeur l'avait prévu. Les deux versions se comportent de manière identique en l'absence de spécificateurs de format dans la chaîne, ce qui permet au développeur de passer facilement inaperçu.

Les bogues de format surviennent parce que les conventions de passage d'arguments de C ne sont pas sûres en termes de type . En particulier, le varargsmécanisme permet aux fonctions d'accepter n'importe quel nombre d'arguments (par exemple printf) en « extrayant » autant d'arguments qu'elles le souhaitent de la pile d'appels , en faisant confiance aux premiers arguments pour indiquer combien d'arguments supplémentaires doivent être extraits et de quels types.

Des bogues de chaîne de format peuvent survenir dans d'autres langages de programmation en plus de C, tels que Perl, bien qu'ils apparaissent moins fréquemment et ne puissent généralement pas être exploités pour exécuter le code choisi par l'attaquant.

Histoire

Les bogues de format ont été détectés pour la première fois en 1989 par les travaux de tests fuzz effectués à l'Université du Wisconsin, qui ont découvert un « effet d'interaction » dans le shell C (csh) entre son mécanisme d'historique des commandes et une routine d'erreur qui supposait une entrée de chaîne sûre.

L'utilisation de bogues de chaîne de format comme vecteur d'attaque a été découverte en septembre 1999 par Tymm Twillman lors d'un audit de sécurité du démon ProFTPD . L'audit a découvert un snprintfqui transmettait directement des données générées par l'utilisateur sans chaîne de format. Des tests approfondis avec des arguments artificiels pour des fonctions de style printf ont montré que l'utilisation de cela pour l'escalade des privilèges était possible. Cela a conduit à la première publication en septembre 1999 sur la liste de diffusion Bugtraq concernant cette classe de vulnérabilités, y compris un exploit de base. Il a fallu encore plusieurs mois, cependant, avant que la communauté de sécurité ne prenne conscience de tous les dangers des vulnérabilités de chaîne de format, car des exploits pour d'autres logiciels utilisant cette méthode ont commencé à faire surface. Les premiers exploits qui ont fait connaître le problème au grand public (en fournissant un accès root à distance via l'exécution de code) ont été publiés simultanément sur la liste Bugtraq en juin 2000 par Przemysław Frasunek et une personne utilisant le pseudo tf8 . Ils ont été rapidement suivis d'une explication, postée par une personne utilisant le pseudo lamagra . "Format bugs" a été posté sur la liste Bugtraq par Pascal Bouchareine en juillet 2000. L'article fondateur "Format String Attacks" de Tim Newsham a été publié en septembre 2000 et d'autres articles d'explication technique détaillés ont été publiés en septembre 2001 tels que Exploiting Format String Vulnerabilities , par l'équipe Teso .

Prévention dans les compilateurs

De nombreux compilateurs peuvent vérifier statiquement les chaînes de format et générer des avertissements pour les formats dangereux ou suspects. Dans la collection de compilateurs GNU , les indicateurs de compilateur pertinents sont , -Wall, -Wformat, -Wno-format-extra-args, -Wformat-security, -Wformat-nonliteralet -Wformat=2.

La plupart de ces paramètres ne sont utiles que pour détecter les chaînes de format incorrectes connues au moment de la compilation. Si la chaîne de format peut provenir de l'utilisateur ou d'une source externe à l'application, l'application doit valider la chaîne de format avant de l'utiliser. Il faut également faire attention si l'application génère ou sélectionne des chaînes de format à la volée. Si la bibliothèque GNU C est utilisée, le -D_FORTIFY_SOURCE=2paramètre peut être utilisé pour détecter certains types d'attaques se produisant au moment de l'exécution. La -Wformat-nonliteralvérification est plus stricte.

Détection

Contrairement à de nombreux autres problèmes de sécurité, la cause principale des vulnérabilités des chaînes de format est relativement facile à détecter dans les exécutables compilés x86 : pour printfles fonctions de la famille -, une utilisation correcte implique un argument séparé pour la chaîne de format et les arguments à formater. Les utilisations défectueuses de telles fonctions peuvent être repérées en comptant simplement le nombre d'arguments passés à la fonction ; une « déficience d'argument » est alors un indicateur fort que la fonction a été mal utilisée.

Détection dans les binaires compilés x86

Le comptage du nombre d'arguments est souvent facilité sur x86 grâce à une convention d'appel où l'appelant supprime les arguments qui ont été poussés sur la pile en les ajoutant au pointeur de pile après l'appel, de sorte qu'un simple examen de la correction de la pile donne le nombre d'arguments passés à la printffonction -family.'

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index