Aller au contenu

Format String Vulnerability

Vulnérabilité de chaîne de format

Description

La vulnérabilité de chaîne de format (Format string vulnerability) se produit lorsqu'un programme ne valide ou n'assainit pas correctement les entrées utilisateur utilisées comme spécificateur de format dans une fonction de sortie formatée. Cela peut permettre à un attaquant de manipuler l'argument de la chaîne de format et potentiellement d'exécuter du code arbitraire ou de divulguer des informations sensibles.

L'impact des vulnérabilités de chaîne de format peut être important, entraînant : 1. Divulgation d'informations : L'exploitation d'une vulnérabilité de chaîne de format permet à un attaquant d'extraire des informations sensibles de la mémoire. Cela peut inclure des données confidentielles comme des mots de passe, des clés de chiffrement ou d'autres informations critiques.

  1. Exécution de code à distance (RCE) : Les vulnérabilités de chaîne de format peuvent être exploitées pour exécuter du code arbitraire sur un système à distance. Cela permet aux attaquants de prendre le contrôle du système, entraînant potentiellement un accès non autorisé ou le vol de données sensibles.

  2. Déni de service (DoS) : Une vulnérabilité de chaîne de format peut être manipulée par un attaquant pour faire planter le programme ou l'induire dans une boucle infinie. Ce type d'attaque entraîne un déni de service (DoS), rendant le système ou l'application inaccessible aux utilisateurs légitimes.

Exemples

// gcc vulnerable.c

#include <stdio.h>
#include <unistd.h>

int main() {
    int secret_num = 0x8badf00d;

    char name[64] = {0};
    read(0, name, 64);
    printf("Hello ");
    printf(name);
    printf("! You'll never get my secret!\n");
    return 0;
}

Recommandation

Pour atténuer les vulnérabilités liées aux attaques par chaîne de format, il est crucial de suivre certaines pratiques :

  • Évitez d'utiliser des fonctions de chaîne de format qui acceptent directement les entrées utilisateur, et utilisez plutôt des alternatives plus sûres comme la concaténation de chaînes ou des fonctions d'impression formatée qui ne dépendent pas de chaînes de format contrôlées par l'utilisateur.
  • La validation et l'assainissement des entrées en tant que mesure de durcissement (hardening) pour garantir que les données fournies par l'utilisateur correspondent au format attendu.

Exemples de code :

#include <stdio.h>

int main() {
    int secret_num = 0x8badf00d;

    char name[64] = {0};

    printf("Enter your name: ");
    if (fgets(name, sizeof(name), stdin) != NULL) {
        // Remove the newline character from the input
        size_t len = strlen(name);
        if (len > 0 && name[len - 1] == '\n') {93317
            name[len - 1] = '\0';
        }

        printf("Hello %s! You'll never get my secret!\n", name);
    } else {
        // Handle error reading input
        printf("Error reading input.\n");
        return 1;
    }

    return 0;
}

Liens

Normes

  • OWASP_MASVS_L1:
    • MSTG_PLATFORM_2
  • OWASP_MASVS_L2:
    • MSTG_PLATFORM_2
  • OWASP_MASVS_v2_1:
    • MASVS_CODE_4
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_3_4
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5