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.

Format String Vulnerability

hacking

Définition

Les vulnérabilités de format string surviennent quand des fonctions de formatage C (printf, sprintf, fprintf, snprintf, vsprintf) reçoivent des données contrôlées par un attaquant directement comme chaîne de format, sans vérification. Elles permettent potentiellement la lecture et l'écriture arbitraire de mémoire, l'exécution de code, et le bypass de mécanismes de sécurité. Le problème fondamental : printf(user_input) vs printf("%s", user_input). Dans le premier cas, si user_input contient des spécificateurs de format (%x, %s, %n), printf les interprète et accède aux arguments supposément sur la pile ou dans les registres, même s'ils n'existent pas. Un attaquant peut envoyer une chaîne comme %08x.%08x.%08x.%08x pour lire 4 valeurs depuis la pile, ou %n pour écrire à l'adresse pointée par la valeur correspondante sur la pile. Les capacités d'exploitation d'une format string vulnerability incluent : la lecture de la mémoire de la pile (avec %x/%p/%s pour révéler des adresses, des valeurs de canaries, des données sensibles), l'écriture arbitraire en mémoire (avec %n qui écrit le nombre de caractères écrits jusqu'à ce point vers l'adresse sur la pile), et la construction d'un primitif d'écriture arbitraire 4-bytes via des techniques de positionnement de paramètres (%N$n pour accéder au N-ième argument). Des techniques avancées permettent d'écrire des valeurs arbitraires en mémoire en contrôlant le nombre de caractères écrits avant %n via des remplissages (%Nd pour écrire N espaces). Cibler la GOT (Global Offset Table) d'un binaire non-PIE pour overwriter l'adresse d'une fonction (ex: exit) avec l'adresse du shellcode ou d'une chaîne ROP est une exploitation classique. Ces vulnérabilités sont moins communes dans les binaires modernes compilés avec FORTIFY_SOURCE (-D_FORTIFY_SOURCE=2) qui détecte à la compilation les usages dangereux de printf, mais restent présentes dans du code legacy, des firmwares embarqués, et des applications C non maintenues.

Fonctionnement

La lecture mémoire : printf("%p %p %p %p %p %p"); avec user_input = "%p %p %p %p %p %p" affiche les 6 premières valeurs de la pile (ou registres sur x64). La technique de positionnement %7$p accède directement au 7ème argument, permettant de lire des valeurs spécifiques. L'écriture avec %N$n écrit vers l'adresse contenue dans le Nième paramètre sur la pile, permettant des overwrites ciblés.

Exploitation offensive

Sur des binaires 32-bit sans PIE et sans RELRO, une format string vulnerability permet une exploitation fiable : lire le stack canary (pour l'intégrer dans un exploit buffer overflow ultérieur), lire les adresses de bibliothèques (pour calculer les offsets ASLR), et écrire une adresse de shellcode dans la GOT pour rediriger l'exécution. CTF et challenges de sécurité utilisent fréquemment cette classe de vulnérabilités.

Détection et mitigation

La compilation avec -Wformat=2 génère des avertissements pour les usages dangereux de printf. FORTIFY_SOURCE remplace les fonctions printf par des versions sécurisées qui vérifient à l'exécution. La règle de sécurité fondamentale est : ne jamais passer de données utilisateur directement comme format string. Des outils d'analyse statique (Coverity, CodeChecker, Flawfinder) détectent ces patterns dans le code source.

Articles liés

Un projet cybersécurité ?

Expert dispo · Réponse 24h

Devis