Vulnerabilidades de cadenas de formato
Explote cadenas de formato de printf para leer memoria arbitraria y escribir en direcciones arbitrarias.
Vulnerabilidades de cadenas de formato es una lección gratuita de Cyber Security Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Cyber Security Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Cyber Security Academy incluye 4 lecciones en total.
¿Qué es una vulnerabilidad de cadena de formato?
Una vulnerabilidad de cadena de formato ocurre cuando la entrada del usuario se pasa directamente como argumento de cadena de formato a printf() o a funciones similares. El atacante puede leer memoria, filtrar direcciones de la pila y escribir valores arbitrarios.
El patrón vulnerable
Vulnerable frente a seguro:
// VULNERABLE - user controls the format string:
printf(user_input);
fprintf(stderr, user_input);
// SAFE - user input is a data argument:
printf("%s", user_input);Lectura de memoria con %x y %p
Los especificadores de formato sin argumentos correspondientes leen valores de la pila:
# Input: %p.%p.%p.%p.%p
# Output: 0x7ffd12345678.0x400580.0x0.0x1.0x7f3a...
# Each %p prints the next value off the stack - leaking addresses!Evasión de ASLR mediante filtraciones de cadenas de formato
La pila suele contener punteros a libc, a la pila y al binario. Al filtrar estos punteros con los especificadores %p o %lx, un atacante puede calcular las direcciones base y evadir ASLR, incluso sin ninguna otra vulnerabilidad.
Lectura de memoria arbitraria con %s
%s trata el valor de la pila como un puntero e imprime la cadena ubicada en esa dirección. Al colocar la dirección de destino en la posición correcta de la pila y utilizar el acceso a parámetros (%7$s), un atacante puede leer ubicaciones de memoria arbitrarias.
# Direct parameter access:
printf("%7$s") # prints string at 7th stack parameter
# If 7th param is an address you control, reads that memoryEscritura de memoria con %n
%n escribe en la dirección a la que apunta el argumento correspondiente el número de caracteres impresos hasta ese momento. Esto permite escribir valores controlados en direcciones arbitrarias y potencialmente sobrescribir punteros de función o direcciones de retorno.
Técnica práctica de escritura
Para escribir un valor específico mediante %n:
- Controle un puntero en la pila que apunte a la dirección de destino
- Utilice
%Xc%N$npara escribir X caracteres y, después, escriba el contador en el parámetro N (la dirección de destino)
Herramientas como pwntools automatizan la construcción de exploits de cadenas de formato.
Detección de errores de cadenas de formato
Pruebas para detectar vulnerabilidades de cadenas de formato:
# Test inputs:
%x.%x.%x
%p.%p.%p
%s%s%s
AAAA.%p.%p.%p.%p (looking for 0x41414141 in output)
# Automated testing with fuzzer:
python3 -c "print('%p.' * 20)" | ./vulnDefensa: corrija el código
La solución es muy sencilla: pase siempre la entrada del usuario como argumento de datos, nunca como cadena de formato.
// WRONG:
printf(buffer);
// RIGHT:
printf("%s", buffer);
// Compiler warning:
// gcc -Wformat-security will flag thisCadenas de formato en otros lenguajes
Las vulnerabilidades de cadenas de formato aparecen en muchos lenguajes:
- C:
printf(input) - Python: no es lo mismo, pero el formateo con
%y una entrada de tipo diccionario puede exponer variables - Java:
String.format(input)— es menos peligroso y no permite acceder a la memoria
Ejemplos del mundo real
Los errores de cadenas de formato han afectado a:
- ProFTPD — permitió la ejecución remota de código mediante comandos FTP
- WU-FTPD — exploit remoto de root mediante cadenas de formato
- Varios demonios de Linux anteriores a la década de 2000
Los compiladores modernos y FORTIFY_SOURCE ayudan, pero no eliminan por completo esta clase de vulnerabilidades.
Comprobación rápida: cadenas de formato
¿Qué especificador de formato puede utilizarse para escribir en una dirección de memoria arbitraria durante un ataque de cadena de formato?
Resumen de la lección
Las vulnerabilidades de cadenas de formato aparecen cuando la entrada del usuario se utiliza directamente como cadena de formato de printf. %p/%x filtra memoria de la pila; %s lee direcciones arbitrarias; %n escribe en direcciones arbitrarias. La solución consiste en un solo carácter: printf("%s", input). Habilite -Wformat-security en las opciones del compilador para detectar estos errores.
Preguntas frecuentes
¿La lección «Vulnerabilidades de cadenas de formato» es gratis?
Sí — el texto completo de «Vulnerabilidades de cadenas de formato» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Cyber Security Academy, actualiza a CoddyKit PRO. El curso de Cyber Security Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Vulnerabilidades de cadenas de formato»?
Explote cadenas de formato de printf para leer memoria arbitraria y escribir en direcciones arbitrarias. Practicas Cyber Security Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Cyber Security Academy?
No se requiere experiencia previa. Cyber Security Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Vulnerabilidades de cadenas de formato»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Cyber Security Academy?
Sí. Cada lección de Cyber Security Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Desbordamientos de búfer en la pila
- Programación orientada al retorno (ROP)
- Vulnerabilidades de cadenas de formato
- Explotación del heap: Use-After-Free y heap spraying