Explotabilidad de uso después de vulnerabilidades libres

8

Los errores de uso después de liberarse son una clase particular de errores de seguridad de memoria. ¿Con qué frecuencia son explotables, en la práctica? Cuando encuentras un error de uso después de un programa gratuito, ¿es a menudo explotable, rara vez explotable o varía en función de algún otro factor que estoy pasando por alto?

Estoy particularmente interesado en la frecuencia con la que se pueden explotar los errores de uso después de la liberación en C (específicamente C, en lugar de C ++). ¿Con qué frecuencia se pueden explotar los errores de uso después de la liberación en los programas de C? Si descubro un error de uso después de la liberación en un programa de C que estoy probando, ¿qué debería estimar si es probable que sea explotable? 90%? 50%? 10%? Al realizar triaciones de errores (por ejemplo, Fuzzer se bloquea, advertencias de Valgrind, advertencias de herramientas de análisis estático), ¿qué tan alto debo priorizar la solución de errores de uso después de la liberación, en comparación con otros tipos de errores de seguridad de la memoria?

La investigación que he hecho. He estado haciendo algunas investigaciones. Parece que los errores de uso después de liberarse en los programas de C ++ a menudo son explotables (debido a que el diseño de memoria de un objeto de C ++ siempre contiene un puntero a un vtable, y sobrescribe este conduce fácilmente a la inyección de códigos). Bien. Ahora, ¿qué pasa con los programas de C?

También puedo ver cómo pueden explotarse los errores de uso después de la liberación en ciertos casos especiales. Por ejemplo, los errores de uso después de la libertad en los navegadores u otros programas con scripts controlables por el usuario parecen a menudo se puede explotar , debido a la facilidad de pulverización en pilas y el gran control sobre el contenido de los objetos almacenados en la memoria . Y, sí, he visto algunos métodos sofisticados de explotar errores de uso después de la liberación en ciertos casos especiales (por ejemplo, usarlos para la divulgación de información, que luego le permite desasealar ASLR, después de lo cual ...), pero esos parecen bastante específico de la aplicación y como es posible que tengas que tener suerte para que el ataque funcione, e incluso entonces sería necesario un montón de trabajo para construir el exploit. Pero me interesa saber qué aspecto tiene el "caso típico", en lugar de los casos especiales en los que el atacante tiene suerte.

    
pregunta D.W. 21.03.2014 - 21:24
fuente

1 respuesta

2

Los ataques de uso después de liberados requieren que el atacante pueda asignar algo de memoria de manera confiable en el montón.

Supongamos que tengo un objeto que toma 16 bytes y que se asigna en la memoria a 0xb00000004 (números completamente inventados aquí). Borro este objeto y la memoria se devuelve al montón. Ahora solicito otra asignación de pila para 16 bytes (una cadena, por ejemplo) y la pila la asigna en 0xb0000004. Ahora, un puntero que hace referencia al objeto antiguo llama al nuevo objeto, sin siquiera darse cuenta.

Como mencionó anteriormente, esto es popular entre los lenguajes de scripting por una razón. La razón es que los lenguajes de script pueden confiablemente asignar memoria en el montón.

Por lo tanto, para saber si va a ser vulnerable, debe evaluar lo difícil que sería para un atacante poder asignar memoria, y si ese atacante podría asignarlo de manera confiable.

En un programa en C, el riesgo potencial parece es menor, ya que cualquiera de estos punteros o referencias estarán en tipos de datos básicos, no en objetos. ¿Cómo va a ejecutar un atacante un código arbitrario cuando el programa lo trata como datos? En ese caso, necesita analizar si sus datos son confiables.

Por ejemplo, supongamos que su programa almacena una cadena " enlace program.zip", y tiene código para descargar, extraer y ejecutalo. Si un atacante es capaz de sobrescribir esa cadena en enlace ", su programa podría estar instalando un shell involuntariamente.

    
respondido por el Thebluefish 22.03.2014 - 22:24
fuente

Lea otras preguntas en las etiquetas