vulnerabilidad c security format-string

c - vulnerabilidad - format string python



¿Cómo se puede explotar una vulnerabilidad Format-String? (5)

Ah, la respuesta está en el artículo!

La cadena de formato no controlada es un tipo de vulnerabilidad de software, descubierta en 1999, que se puede usar en exploits de seguridad. Los exploits de cadena de formato previamente inofensivos se pueden utilizar para bloquear un programa o ejecutar código dañino .

Un exploit típico utiliza una combinación de estas técnicas para forzar a un programa a sobrescribir la dirección de una función de biblioteca o la dirección de retorno en la pila con un puntero a algún shellcode malicioso. Los parámetros de relleno para formatear los especificadores se usan para controlar el número de bytes de salida y el token %x se usa para extraer bytes de la pila hasta que se alcanza el comienzo de la cadena de formato. El inicio de la cadena de formato está diseñado para contener la dirección que el token de formato %n puede sobrescribir con la dirección del código malicioso que se ejecutará .

Esto es porque %n hace que printf escriba datos en una variable , que está en la pila. Pero eso significa que podría escribir algo arbitrariamente. Todo lo que necesita es que alguien use esa variable (es relativamente fácil si se trata de un puntero a la función, cuyo valor acaba de descifrar cómo controlar) y puede hacer que ejecute cualquier cosa arbitrariamente.

Eche un vistazo a los enlaces en el artículo; se ven interesantes .

Estaba leyendo sobre vulnerabilidades en el código y me encontré con esta vulnerabilidad de formato de cadena .

Wikipedia dice:

Los errores de cadena de formato aparecen más comúnmente cuando un programador desea imprimir una cadena que contiene datos suministrados por el usuario. El programador puede escribir erróneamente printf (buffer) en lugar de printf ("% s", buffer). La primera versión interpreta el búfer como una cadena de formato y analiza cualquier instrucción de formato que pueda contener. La segunda versión simplemente imprime una cadena en la pantalla, como pretendía el programador.

Obtuve el problema con la versión printf (buffer), pero todavía no entendía cómo el atacante puede usar esta vulnerabilidad para ejecutar código dañino. ¿Puede alguien decirme cómo se puede explotar esta vulnerabilidad con un ejemplo?


AFAIK es principalmente porque puede bloquear su programa, que se considera un ataque de denegación de servicio. Todo lo que necesita es dar una dirección no válida (prácticamente se garantiza que funcionará todo con unos pocos %s ), y se convierte en un simple ataque de denegación de servicio (DoS).

Ahora, teóricamente es posible que esto desencadene algo en el caso de un manejador de excepción / señal / interrupción, pero averiguar cómo hacer eso está más allá de mí, necesita averiguar cómo escribir datos arbitrarios en la memoria también.

Pero, ¿por qué a alguien le importa si el programa falla, podría preguntar? ¿Eso no solo molesta al usuario (quién lo merece de todos modos)?

El problema es que varios usuarios acceden a algunos programas, por lo que bloquearlos tiene un costo no despreciable. O a veces son fundamentales para el funcionamiento del sistema (o tal vez están en el medio de hacer algo muy crítico), en cuyo caso esto puede ser perjudicial para sus datos. Por supuesto, si bloqueas el Bloc de notas, a nadie le puede importar, pero si bloqueas el CSRSS (que creo que en realidad tenía un tipo similar de error, un error doblemente gratis, específicamente), entonces sí, todo el sistema está bajando contigo .

Actualizar:

Vea este enlace para el error CSRSS al que me refería.

Editar:

¡Tenga en cuenta que leer datos arbitrarios puede ser tan peligroso como ejecutar código arbitrario! Si lee una contraseña, una cookie, etc., entonces es tan grave como la ejecución de un código arbitrario, y esto es trivial si solo tiene tiempo suficiente para intentar cadenas de formato suficientes.


Es interesante que nadie haya mencionado la notación n$ admitida por POSIX. Si puede controlar la cadena de formato como atacante, puede usar notaciones tales como:

"%200$p"

para leer el artículo 200 en la pila (si hay uno). La intención es que debe enumerar todos los n$ números de 1 al máximo, y proporciona una forma de resecuenciar cómo aparecen los parámetros en una cadena de formato, que es útil cuando se trata de I18N (L10N, G11N, M18N * ).

Sin embargo, algunos (probablemente la mayoría) de los sistemas son algo indiferentes a la forma en que validan los valores de n$ y esto puede conducir a abusos por parte de los atacantes que pueden controlar la cadena de formato. Combinado con el especificador de formato %n , esto puede llevar a escribir en ubicaciones de punteros.

* Los acrónimos I18N, L10N, G11N y M18N son para internacionalización, localización, globalización y multinacionalización, respectivamente. El número representa la cantidad de letras omitidas.


Es posible que pueda explotar una vulnerabilidad de cadena de formato de muchas maneras, directa o indirectamente. Usemos lo siguiente como ejemplo (suponiendo que no hay protecciones relevantes del sistema operativo, que de todos modos es muy raro):

int main(int argc, char **argv) { char text[1024]; static int some_value = -72; strcpy(text, argv[1]); /* ignore the buffer overflow here */ printf("This is how you print correctly:/n"); printf("%s", text); printf("This is how not to print:/n"); printf(text); printf("some_value @ 0x%08x = %d [0x%08x]", &some_value, some_value, some_value); return(0); }

La base de esta vulnerabilidad es el comportamiento de las funciones con argumentos variables. Una función que implementa el manejo de un número variable de parámetros tiene que leerlos desde la pila, esencialmente. Si especificamos una cadena de formato que hará que printf() espere dos enteros en la pila, y proporcionamos solo un parámetro, el segundo tendrá que ser algo más en la pila. Por extensión, y si tenemos control sobre la cadena de formato, podemos tener las dos primitivas más fundamentales:

Lectura de direcciones de memoria arbitrarias

[EDITAR] IMPORTANTE: Estoy haciendo algunas suposiciones sobre el diseño del marco de pila aquí. Puede ignorarlos si comprende la premisa básica detrás de la vulnerabilidad, y varían de todos modos en el sistema operativo, la plataforma, el programa y la configuración.

Es posible usar el parámetro de formato %s para leer datos. Puede leer los datos de la cadena de formato original en printf(text) , por lo tanto, puede usarlo para leer cualquier cosa de la pila:

./vulnerable AAAA%08x.%08x.%08x.%08x This is how you print correctly: AAAA%08x.%08x.%08x.%08x This is how not to print: AAAA.XXXXXXXX.XXXXXXXX.XXXXXXXX.41414141 some_value @ 0x08049794 = -72 [0xffffffb8]

Escribir en direcciones de memoria arbitrarias

Puede usar el especificador de formato %n para escribir en una dirección arbitraria (casi). Nuevamente, asumamos nuestro programa vulnerable arriba, y some_value cambiando el valor de some_value , que se encuentra en 0x08049794 , como se ve arriba:

./vulnerable $(printf "/x94/x97/x04/x08")%08x.%08x.%08x.%n This is how you print correctly: ??%08x.%08x.%08x.%n This is how not to print: ??XXXXXXXX.XXXXXXXX.XXXXXXXX. some_value @ 0x08049794 = 31 [0x0000001f]

Hemos sobreescrito some_value con la cantidad de bytes escritos antes de encontrar el especificador %n ( man printf ). Podemos usar la cadena de formato en sí o el ancho del campo para controlar este valor:

./vulnerable $(printf "/x94/x97/x04/x08")%x%x%x%n This is how you print correctly: ??%x%x%x%n This is how not to print: ??XXXXXXXXXXXXXXXXXXXXXXXX some_value @ 0x08049794 = 21 [0x00000015]

Hay muchas posibilidades y trucos para probar (acceso directo a los parámetros, ancho de campo grande que permite la envoltura posible, construcción de sus propias primitivas), y esto solo toca la punta del iceberg. Sugiero leer más artículos sobre vulnerabilidades de cadenas de fmt (Phrack tiene algunos excelentes en su mayoría, aunque pueden estar un poco avanzados) o un libro que toca el tema.

Descargo de responsabilidad: los ejemplos son tomados [aunque no literalmente] del libro Hacking: The art of exploitation (2nd ed) por Jon Erickson.


Recomiendo leer this nota de la conferencia sobre la vulnerabilidad de las cadenas de formato. Describe en detalle qué sucede y cómo, y tiene algunas imágenes que pueden ayudarlo a comprender el tema.