[Español] En los últimos años el fuzzing se ha convertido en la mejor y más rápida (relativamente) técnica para descubrir fallos de seguridad, por lo que he pensado que sería un buen tema para introducir algunos conceptos y herramientas para luego entrar en más detalle en futuros posts.
[English] In recent years fuzzing has become the best and (relatively) quickest technique to discover security vulnerabilities, so I thought it would be a good topic to write a post about it to introduce some concepts and tools to then go into more details in future posts.
Aparte de mis frecuentes auditorías de código también dedico tiempo al fuzzing para identificar vulnerabilidades en todo tipo de aplicaciones con buenos resultados 🙂 Imagino que el lector a estas alturas habrá oído hablar del Microsoft SDL, donde se especifica que uno de los controles de seguridad obligatorios es hacer fuzzing de la aplicación. Es por ello que Microsoft ha desarrollo algunos de los mejores fuzzers del mercado, como son SAGE y FuzzGuru entre otros, aunque por desgracia solo están disponibles internamente en la compañía pero existen algunas interesantes alternativas como veremos en la sección de recomendados.
Apart from my frequent code reviews I also spend time fuzzing to identify vulnerabilities in all kinds of applications with good results 🙂 I assume the reader at this point has heard of Microsoft SDL, which mandates that one of the security gates is to fuzz the application. This is why Microsoft has developed some of the best fuzzers in the market, such as SAGE and FuzzGuru among others, although unfortunately only internally available in the company but there are some interesting alternatives as we will see in the section of recommended.
A la hora de realizar fuzzing debemos tener una clara estrategia para que sea efectivo o podríamos estar perdiendo el tiempo. Debemos tener claro:
- Qué interfaces de la aplicación queremos fuzzear (ficheros, protocolos, registro, etc.)
- Si nuestro fuzzer es capaz de generar datos malformados válidos para la aplicación
- Cuántas pruebas estamos ejecutando por minuto
- Si hemos definido el “número mágico” para detener las pruebas
- A qué nivel de profundidad estamos llegando en la aplicación (Code coverage)
- De qué capacidades de monitorización disponemos
- Si disponemos de herramientas apropiadas para analizar un crash
When it comes to fuzzing we must have a clear strategy to be effective or we could be wasting time. We must be clear on:
- What application interfaces we want to fuzz (files, Protocols, registry, etc.)
- If our fuzzer is able to generate valid malformed data for the application
- How many test cases are we running per minute
- If we have defined the “magic number” to stop testing
- What level of application depth we are reaching (Code coverage)
- If we have monitoring capabilities
- If we have the appropriate tools to analyze a crash
Éstas son algunas de las cuestiones que nuestra estrategia debe tener en cuenta para sacarle el mayor partido al tiempo de fuzzing ya que no es infinito. En mi caso he construido una pequeña granja fuzzing que me permite escalar y realizar diferentes pruebas al mismo tiempo, bendita sea la virtualización!
These are some of the issues that our strategy must take into account to get the most out of the fuzzing time because is not infinite. In my case I have built a small fuzzing farm that allows me to scale and perform various tests at the same time, blessed be the virtualization!
De vez en cuando hasta un fuzzer tonto es capaz de descubrir vulnerabilidades, pero por lo general obtendremos mejores resultados con un fuzzer inteligente que entienda la información que requiere la aplicación y pueda manipularla. La mayoría de fuzzers recomendados están dentro de la categoría de fuzzers inteligentes, aunque sin duda los fuzzers tontos nos pueden ser de gran utilidad también. Si tenemos tiempo es recomendable probar diferentes tipos de fuzzers para el mismo objetivo.
From time to time a dumb fuzzer is able to discover vulnerabilities but usually we get better results with a smart fuzzer who understands the data required by the application and is able to mutate it. Most of the below recommended fuzzers are within the category of smart fuzzers but certainly dumb fuzzers can be very useful too. If we have time we recommend trying different types of fuzzers for the same target.
Existen muchos más fuzzers de los aquí mencionados pero en mi opinión éstos son algunos de los mejores y estoy seguro que el lector les encontrará utilidad. Si encuentras un ODay no olvides enviármelo 😉
There are many more fuzzers of the here mentioned but in my opinion these are some of the best and I am sure the reader will find them useful. If you find an ODay don’t forget send it my way 😉
Fuzzer Frameworks y Recursos Recomendados / Fuzzer Frameworks and Recommended Resources
- Automated Whitebox Fuzz Testing (SAGE)
- From Blackbox Fuzzing to Whitebox Fuzzing towards Verification (SAGE)
- Fuzzing in Microsoft and FuzzGuru Framework
- Sulley Framework
- Peach Framework
- Fuzzing
- CERT Basic Fuzzing Framework
- Automated Penetration Testing with White-Box Fuzzing
Y tú qué fuzzer framework utilizas?
What fuzzer framework do you use?
— Simon Roses Femerling