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.