Developpez.com

Le Club des Développeurs et IT Pro

Des chercheurs du MIT mettent au point un algorithme pour détecter les erreurs du type débordement d'entier

Ainsi qu'un outil pour les éliminer

Le 2015-03-31 23:07:40, par Stéphane le calme, Chroniqueur Actualités
Un entier ayant une taille fixe, il y a une valeur maximale qu'il peut stocker. Quand une tentative est faite de stocker une valeur supérieure à cette valeur maximale, nous parlons alors de débordement d'entier (integer overflow). Les débordements d'entiers peuvent être problématiques par exemple dans le cas où le calcul doit gérer la taille d'un tampon ou jusqu'où un index peut aller dans un tableau.

Des chercheurs du MIT s’y sont intéressés et expliquent que non seulement ils peuvent faire planter un programme mais ils peuvent également le laisser vulnérable aux attaques. « Les débordements d’entier sont une source insidieuse de défaillances logicielles et de vulnérabilités de la sécurité. Parce que des programmes comportant des erreurs latentes de débordement traitent souvent correctement les entrées, ce genre d’erreurs peut aisément échapper à la détection durant la phase de test pour apparaître plus tard dans la production » ont-ils expliqué dans un billet.

Aussi, pour résoudre ce problème, les chercheurs du laboratoire d’intelligence artificielle et de sciences informatiques du MIT ont mis au point un moteur de découverte de dépassement d’entier (DIODE – Directed Integer Overflow Discovery Engine -) afin de détecter automatiquement les bugs de dépassement d’entier. L’algorithme a été testé dans cinq programmes open-source populaires comportant trois bugs de ce type connus. DIODE a trouvé les trois … et en a décelé 11 autres.

« DIODE est conçu pour identifier les tests pertinents auxquels les entrées doivent être soumises pour déclencher des débordements sur les sites d’allocation de mémoire cible, ensuite générer ces entrées » ont expliqué les chercheurs. Ils rappellent qu’un débordement d’entier en lui-même ne fera pas planter un programme mais qu’un problème pourrait survenir lorsque le programme va essayer d’utiliser un entier ayant déjà subi un débordement. « C’est comme un compteur kilométrique de voiture. Une fois que vous êtes allé au-delà d’un certain nombre de kilomètres vous revenez à zéro », a expliqué Stelios Sidiroglou-Douskos, l’un des chercheurs.

En marge de DIODE, les chercheurs ont développé CodePhage, un système automatique de transfert de code qui élimine les erreurs du type débordement d’entier une fois que DIODE les a repérées. « La combinaison de CodePhage et DIODE apporte un système qui détecte et élimine automatiquement les erreurs de débordement d’entier. DIODE génère des entrées qui mettent en exergue les erreurs ; CodePhage utilise ces entrées pour localiser et transférer le code depuis les applications afin d’éliminer les erreurs » ont expliqué les chercheurs.

Source : blog MIT

Et vous ?

Qu'en pensez-vous ?
  Discussion forum
5 commentaires
  • Uther
    Expert éminent sénior
    Il faudrait sans doute détailler ce qu'il y a de nouveau(vitesse, analyse statique, ...) parceque pour le moment je vois pas.

    Détecter les overflows, ça fait très longtemps qu'on sait faire ça. Si ce n'est pas fait systématiquement c'est surtout parce que que ça impacte sur les performance, donc le plus souvent on ne le fait pas
  • TiranusKBX
    Expert confirmé
    je pense qu'au début de ta boucle tu teste si ta valeur est négative (dans le cas de la variable est incrémenté) et si c'est la cas tu fait un petit break
  • marsupial
    Expert éminent
    En langage machine, la contrainte pourrait peut-être disparaître ?
  • BufferBob
    Expert éminent
    si j'ai bien compris, l'algorithme fonctionne sur des binaires x86 directement (donc sur le code machine) et non sur le code source, et pas non plus pendant son exécution (ce qui est différent de détecter un overflow quand il se produit via un canary sur la stack par exemple)

    le PDF précise par ailleurs :
    Because programs with latent overflow errors often process typical inputs correctly, such errors can easily escape detection during testing only to appear later in production.
    je sais pas si ça va véritablement révolutionner l'industrie mais il est évident que ça faisait un sujet tout trouvé pour jouer avec les techniques d'exécution concolique assez récentes et très à la mode
  • Taurre
    Membre du Club
    Salut,

    Envoyé par Stéphane le calme
    Quand en tentative est faite de stocker une valeur supérieure à cette valeur maximale, nous parlons alors de débordement d'entier (integer overflow).
    Juste pour dire, un débordement d'entier intervient quand une opération (comme une addition) produit un résultat supérieur à la capacité d'un type donné. Le passage cité donne plutôt l'impression de parler d'une affectation, qui n'est précisémment pas un cas de débordement.