Saltar a contenido

Format String Vulnerability

Vulnerabilidad de cadena de formato

Descripción

La vulnerabilidad de cadena de formato (Format string vulnerability) ocurre cuando un programa no valida ni sanea adecuadamente la entrada del usuario que se utiliza como especificador de formato en una función de salida formateada. Esto puede permitir a un atacante manipular el argumento de la cadena de formato y potencialmente ejecutar código arbitrario o divulgar información sensible.

El impacto de las vulnerabilidades de cadena de formato puede ser significativo, lo que lleva a: 1. Divulgación de información: La explotación de una vulnerabilidad de cadena de formato permite a un atacante extraer información sensible de la memoria. Esto puede incluir datos confidenciales como contraseñas, claves de cifrado u otra información crítica.

  1. Ejecución remota de código (RCE): Las vulnerabilidades de cadena de formato se pueden explotar para ejecutar código arbitrario en un sistema de forma remota. Esto permite a los atacantes obtener el control del sistema, lo que podría conducir a un acceso no autorizado o al robo de datos sensibles.

  2. Denegación de servicio (DoS): Un atacante puede manipular una vulnerabilidad de cadena de formato para bloquear el programa o inducirlo a un bucle infinito. Este tipo de ataque da como resultado una denegación de servicio (DoS), lo que hace que el sistema o la aplicación sea inaccesible para los usuarios legítimos.

Ejemplos

// 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;
}

Recomendación

Para mitigar las vulnerabilidades relacionadas con los ataques de cadena de formato, es crucial seguir ciertas prácticas:

  • Evite utilizar funciones de cadena de formato que acepten directamente la entrada del usuario, y en su lugar utilice alternativas más seguras como la concatenación de cadenas o funciones de impresión formateada que no dependan de cadenas de formato controladas por el usuario.
  • Validación y saneamiento de entrada como medida de fortificación (hardening) para garantizar que los datos proporcionados por el usuario coincidan con el formato esperado.

Ejemplos de código:

#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;
}

Enlaces

Estándares

  • 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