Fuzzing mudo
Estoy empezando a aprender sobre el fuzzing y he creado un fuzzer tonto que cambia varios bytes aleatorios en un archivo pdf a valores aleatorios, lo abre y detecta si Acrobat Reader se ha bloqueado. ¿Qué tipos de errores puedo encontrar al usar este método?
Ninguna. Tal fuzzing "tonto" tiene una cobertura increíblemente limitada. Me sorprendería mucho si esa aplicación se bloqueara solo porque algunos bytes en la entrada cambiaron aleatoriamente. Este sería el caso incluso si el fuzzer estuviera probando millones de muestras por segundo. Sin embargo, también dices que tu fuzzer lo abre y ve si se bloquea. Esto solo conseguiría que, unos pocos intentos por segundo? ¿Un intento cada pocos segundos? Ni siquiera cerca de valerlo.
La forma en que el trabajo de algunos fuzzers profesionales está generando un proceso, pausando su estado de memoria justo antes de que esté a punto de analizar los datos de destino (para omitir el estado de arranque) y luego reanudarlo. Si no se bloquea dentro de varias decenas de milisegundos, vuelve al estado de pausa en el que estaba antes. Esto permite realizar fuzzing a cientos de veces por segundo a la velocidad más lenta, o decenas de miles a la velocidad más rápida.
Supongo que se podría encontrar una vulnerabilidad de cadena de formato en caso de que el tonto fuzzer inserte un parámetro de cadena de formato en el lugar correcto. También supongo que se podrían encontrar desbordamientos de enteros. Pero, ¿qué más se puede encontrar?
Esto depende de cómo funciona el analizador. Sin tener el código fuente de Acrobat Reader, ni siquiera podía comenzar a responder esta pregunta. Desbordamientos de búfer, vulnerabilidades de formato de cadena, desbordamientos de enteros, errores lógicos, etc. son posibles. También debe tener en cuenta que no todas las vulnerabilidades serán fáciles de descubrir, ya que algunas partes de la entrada pueden estar protegidas con una suma de comprobación, un número mágico complejo o pueden estar comprimidas.
Imagina que tienes un campo protegido con una suma de comprobación simple. Las posibilidades de que los cambios aleatorios resulten en una colisión son bastante bajas, ya que para eso está diseñada la suma de comprobación, y como resultado, es posible que nunca se tome una ruta de código vulnerable. Sin embargo, un exploit real podría simplemente asegurarse de que la suma de comprobación sea válida. Este es un problema común con los nuevos usuarios que difuminan el formato rar. Todo el archivo está cubierto con una suma de comprobación, por lo que no importa lo ingenuo que sea la falsificación de alguien, nunca se bloqueará. Cuando se elimina el código de suma de comprobación, resulta ser bastante defectuoso y fácil de bloquear. Para evitar este problema, debe comprender el formato y eliminar el código de suma de comprobación o asegurarse de que su entrada siempre use las sumas de comprobación correctas.
¿Es posible encontrar desbordamientos de búfer? Como solo cambio unos pocos bytes aleatorios, asumo que la posibilidad de desbordar un búfer es en realidad pequeña o nula. ¿O me equivoco?
Si cambia un valor que termina especificando el tamaño de un búfer, incluso si no cambia el tamaño del búfer, puede producirse un desbordamiento. Por ejemplo, tome un contenido de memoria hipotético here is some text17
. Esto se compone de un búfer, here is some text
, y un tamaño, 17
. Una permutación que modifica el tamaño para que sea más bajo resultaría en el desbordamiento del búfer una vez que se procesa. Ahora no es probable que Acrobat Reader tenga algo tan obvio, pero un error podría generar hipotéticamente un resultado interno similar. Podría imaginar varias posibilidades.
Fuzzing inteligente
Los fuzzers profesionales no solo lanzan entradas aleatorias a un programa para ver si se bloquea. Modifican la entrada en formas específicas que probablemente resulten en cambios en el comportamiento objetivo. El programa se compila con un código especial insertado que hace que informe su estado interno al fusible en cada rama, lo que permite al usuario saber cuándo una entrada dada dio lugar a una ruta de código diferente, incluso si su comportamiento externo no cambia. Esta es la técnica utilizada por AFL , uno de los fuzzers de propósito general más populares. Es lo suficientemente inteligente como para un archivo JPEG válido desde el aire , simplemente mediante el examen del estado de un decodificador JPEG a medida que lo alimenta.
Para escribir un fuzzer que encuentre errores de la vida real, necesitarías usar instrumentación binaria como AFL con la capacidad de analice automáticamente el formato , o escriba un difusor que tenga en cuenta el formato específico de la aplicación (es decir, uno que esté muy al tanto de los detalles específicos del formato PDF y que sea capaz de crear permutaciones sobre una base de palabra clave por sintaxis en lugar de por byte byte ).