Aller au contenu principal
Expert Cybersécurité & IAv9.0
Centres de ressources conformité
Besoin d'un accompagnement expert ?
Devis personnalisé sous 24h — audit, conformité, incident
Checklists Sécurité — Audit & Durcissement
Formats disponibles
📄 PDF 📊 Excel 🌐 Web

11 checklists professionnelles couvrant 2 200+ points de contrôle. Téléchargement gratuit, aucune inscription.

Integer Overflow

hacking

Définition

Un integer overflow est une condition d'erreur qui survient quand une opération arithmétique produit un résultat qui dépasse la capacité de représentation du type entier utilisé. Sur les systèmes en complément à deux, le débordement d'un entier signé provoque un wraparound (4294967295 + 1 = 0 pour un uint32), ce qui peut avoir des conséquences graves sur la sécurité quand ces valeurs sont utilisées pour des calculs de taille mémoire ou des indices de tableau. Les integer overflows deviennent des vulnérabilités de sécurité dans plusieurs scénarios : le calcul de taille incorrecte menant à un heap overflow (si len*sizeof_elem overflowe, malloc() reçoit une valeur petite et alloue un buffer insuffisant, mais le code copie ensuite plus de données que le buffer ne peut contenir), les index hors limites dans des tableaux (si un index négatif est utilisé comme positif après une conversion, il peut pointer hors des limites du tableau), et les comparaisons signées/non-signées (comparer un int signé à un size_t non signé peut produire des comportements inattendus). Des exemples historiques emblématiques : la vulnérabilité MaYANG dans libpng (integer overflow dans le calcul de la taille de décompression, menant à un heap overflow), les vulnérabilités liées à ASN.1 dans OpenSSL (longueur d'objet overflowing lors du parsing), et de nombreuses vulnérabilités dans des parsers de fichiers image/audio/vidéo. Le célèbre Phrack article 'Integer Overflows: The Evil You (Probably) Don't Know' a popularisé cette classe de vulnérabilités. La détection des integer overflows lors du développement utilise : UBSan (Undefined Behavior Sanitizer, option -fsanitize=integer pour GCC/Clang), les entiers sûrs (fonctions __builtin_add_overflow, __builtin_mul_overflow de GCC), les bibliothèques de safe arithmetic, et les analyses statiques (Coverity, Frama-C, CBMC). Les revues de code doivent particulièrement vérifier les opérations arithmétiques sur des valeurs provenant de l'utilisateur avant leur utilisation pour des calculs de taille.

Fonctionnement

L'overflow classique : size_t total = count * item_size; où count et item_size sont contrôlés par l'attaquant. Si count=0xFFFFFFFF et item_size=2, total = 0x1FFFFFFFE qui troncate à 0xFFFFFFFE (32-bit) ou 0x1FFFFFFFE (64-bit). Si suivi de malloc(total) puis memcpy(buf, src, count * item_size), l'allocation est insuffisante mais la copie utilise la vraie taille, causant un heap overflow.

Exploitation offensive

Les integer overflows dans les parsers de protocoles réseau (longueurs de champs, compteurs) sont particulièrement dangereux car ils peuvent être déclenchés à distance. Un parser d'image (JPEG, PNG, GIF) vulnérable peut être exploité via une image malformée provoquant un integer overflow lors du calcul de la taille du buffer de décompression, suivi d'un heap overflow avec des données contrôlées.

Détection et mitigation

UBSan détecte les overflows en développement. En production : utilisation de types à taille fixe appropriés (uint32_t vs size_t), vérifications de bornes avant opérations (if(a > SIZE_MAX/b) error;), bibliothèques SafeInt ou IntegerSafeOps, et compilation avec -ftrapv (génère un SIGABRT sur overflow signé). Les langages modernes (Rust) gèrent les overflows avec panic! en mode debug et wrapping arithmétique explicite en production.

Articles liés

Un projet cybersécurité ?

Expert dispo · Réponse 24h

Devis