<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.owasp.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fthiery</id>
		<title>OWASP - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.owasp.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fthiery"/>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php/Special:Contributions/Fthiery"/>
		<updated>2026-04-26T15:05:48Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.2</generator>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Guide_Introduction&amp;diff=17903</id>
		<title>Guide Introduction</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Guide_Introduction&amp;diff=17903"/>
				<updated>2007-04-18T11:50:40Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Guide Table of Contents]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Welcome to the OWASP Guide 3.0! &lt;br /&gt;
&lt;br /&gt;
Web application security is an essential component of any successful project, whether open source PHP applications, web services such as straight through processing, or proprietary business web sites. Hosters (rightly) shun insecure code, and users shun insecure services that lead to fraud. &lt;br /&gt;
&lt;br /&gt;
The aim of this Guide is to allow businesses, developers, designers and solution architects to produce secure web applications. If done from the earliest stages, secure applications cost about the same to develop as insecure applications, but are far more cost effective in the long run.&lt;br /&gt;
&lt;br /&gt;
==Developing Secure Applications ==&lt;br /&gt;
&lt;br /&gt;
Unlike other forms of security (such as firewalls and secure lockdowns), web applications have the ability to make a skilled attacker rich, or make the life of a victim a complete misery. At this highest level of the OSI software map, traditional firewalls, and other controls simply do not help. The application itself must be self-defending. The Guide can help you get there. &lt;br /&gt;
&lt;br /&gt;
The Guide has been written to cover all forms of web application security issues, from old hoary chestnuts such as SQL injection, through modern concerns such as AJAX, phishing, credit card handling, session fixation, cross-site request forgeries, compliance, and privacy issues.&lt;br /&gt;
&lt;br /&gt;
==Improvements in this edition ==&lt;br /&gt;
&lt;br /&gt;
This latest edition of the Guide builds upon the successful release of the Guide 2.0 at BlackHat Las Vegas in July 2005. With fearless editing by our publisher, No Starch Press, this edition aims to be concise and accurate. There are three new chapters, and a great deal of new content throughout. &lt;br /&gt;
&lt;br /&gt;
Each chapter is organized into roughly three sections:&lt;br /&gt;
&lt;br /&gt;
* Best practices – Practices or features every application should possess&lt;br /&gt;
* Secure patterns – Optional secure patterns, such as the best way to do password self-help&lt;br /&gt;
* Anti-patterns – if you have these in your code, you are more insecure&lt;br /&gt;
&lt;br /&gt;
==How to use this Guide ==&lt;br /&gt;
&lt;br /&gt;
This Guide is a large work as it aims for completeness. The best way to treat the Guide is as a dictionary of best practices. However, web application security is like a language – without some form of context – it is nearly impossible to speak it well. Therefore, readers are well advised to read the “Security Principles” chapter in its entirety.  &lt;br /&gt;
&lt;br /&gt;
==Updates and errata ==&lt;br /&gt;
&lt;br /&gt;
The Guide will likely have errors and deficiencies. We will publish errata on our web site from time to time if you’d like to keep your copy up to date.&lt;br /&gt;
&lt;br /&gt;
If you have any comments or suggestions on the Guide, please e-mail the Guide mail list (see our web site for details) or contact me directly. &lt;br /&gt;
&lt;br /&gt;
==With thanks ==&lt;br /&gt;
&lt;br /&gt;
I wish to extend my thanks to the many authors, reviewers, and editors for their hard work in producing this guide. We stand on the shoulders of giants, and this Guide is no exception.&lt;br /&gt;
&lt;br /&gt;
Lastly, I wish to thank No Starch Press, particularly our editors and Bill Pollock for believing in us, and bringing our community’s text into a publishable state. &lt;br /&gt;
&lt;br /&gt;
Andrew van der Stock, vanderaj@owasp.org&lt;br /&gt;
Melbourne, Australia&lt;br /&gt;
December, 2005&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Guide Table of Contents]]&lt;br /&gt;
[[Category:OWASP_Guide_Project]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=17393</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=17393"/>
				<updated>2007-03-22T15:26:19Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools. Generators usually use combinations of static fuzzing vectors (known-to-be-dangerous values), or totally random data. New generation fuzzers use genetic algorithms to link injected data and observed impact. Such tools are not public yet.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
* Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''conformance testing oriented'' fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common, but tend to appear these days; some examples:&lt;br /&gt;
&lt;br /&gt;
* A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
* Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
* One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
Recent fuzzing initiatives:&lt;br /&gt;
&lt;br /&gt;
- The Month of Kernel Bugs[http://projects.info-pull.com/mokb/], which revealed an Apple Wireless flaw; see here[http://kernelfun.blogspot.com/]; mainly used file system fuzzing tools&lt;br /&gt;
&lt;br /&gt;
- The Month of Browser Bugs[http://browserfun.blogspot.com/] (review here[http://osvdb.org/blog/?p=127]); number of bugs found: MSIE: 25 Apple Safari: 2 Mozilla: 2 Opera: 1 Konqueror: 1; used DHTML, Css, DOM, ActiveX fuzzing tools&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
Huge tools list @ scadasec [http://www.scadasec.net/secwiki/FuzzingTools]&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15745</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15745"/>
				<updated>2007-01-23T10:20:13Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Why Fuzz? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools. Generators usually use combinations of static fuzzing vectors (known-to-be-dangerous values), or totally random data. New generation fuzzers use genetic algorithms to link injected data and observed impact. Such tools are not public yet.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
* Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''conformance testing oriented'' fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common, but tend to appear these days; some examples:&lt;br /&gt;
&lt;br /&gt;
* A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
* Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
* One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
Recent fuzzing initiatives:&lt;br /&gt;
&lt;br /&gt;
- The Month of Kernel Bugs[http://projects.info-pull.com/mokb/], which revealed an Apple Wireless flaw; see here[http://kernelfun.blogspot.com/]; mainly used file system fuzzing tools&lt;br /&gt;
&lt;br /&gt;
- The Month of Browser Bugs[http://browserfun.blogspot.com/] (review here[http://osvdb.org/blog/?p=127]); number of bugs found: MSIE: 25 Apple Safari: 2 Mozilla: 2 Opera: 1 Konqueror: 1; used DHTML, Css, DOM, ActiveX fuzzing tools&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15744</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15744"/>
				<updated>2007-01-23T10:19:08Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Why Fuzz? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools. Generators usually use combinations of static fuzzing vectors (known-to-be-dangerous values), or totally random data. New generation fuzzers use genetic algorithms to link injected data and observed impact. Such tools are not public yet.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
* Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''conformance testing oriented'' fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common, but tend to appear these days; some examples:&lt;br /&gt;
&lt;br /&gt;
* A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
* Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
* One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
Recent fuzzing initiatives:&lt;br /&gt;
&lt;br /&gt;
- The Month of Kernel Bugs[http://projects.info-pull.com/mokb/], which revealed an Apple Wireless flaw; see here[http://kernelfun.blogspot.com/]; mainly used file system fuzzing tools&lt;br /&gt;
&lt;br /&gt;
- The Month of Browser Bugs[http://browserfun.blogspot.com/] (review here[http://osvdb.org/blog/?p=127]); number of bugs found: MSIE: 25 Apple Safari: 2 Mozilla: 2 Opera: 1 Konqueror: 1; used DHTML, ActiveX fuzzing tools&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15743</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15743"/>
				<updated>2007-01-23T10:18:14Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Why Fuzz? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools. Generators usually use combinations of static fuzzing vectors (known-to-be-dangerous values), or totally random data. New generation fuzzers use genetic algorithms to link injected data and observed impact. Such tools are not public yet.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
* Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''conformance testing oriented'' fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common, but tend to appear these days; some examples:&lt;br /&gt;
&lt;br /&gt;
* A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
* Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
* One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
Recent fuzzing initiatives:&lt;br /&gt;
&lt;br /&gt;
- The Month of Kernel Bugs[http://projects.info-pull.com/mokb/], which revealed an Apple Wireless flaw; see here[http://kernelfun.blogspot.com/]; mainly used file system fuzzing tools&lt;br /&gt;
&lt;br /&gt;
- The Month of Browser Bugs (review here[http://osvdb.org/blog/?p=127]); number of bugs found: MSIE: 25 Apple Safari: 2 Mozilla: 2 Opera: 1 Konqueror: 1; used DHTML, ActiveX fuzzing tools&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15742</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15742"/>
				<updated>2007-01-23T10:17:17Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* File format fuzzing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools. Generators usually use combinations of static fuzzing vectors (known-to-be-dangerous values), or totally random data. New generation fuzzers use genetic algorithms to link injected data and observed impact. Such tools are not public yet.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
* Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''conformance testing oriented'' fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common, but tend to appear these days; some examples:&lt;br /&gt;
&lt;br /&gt;
* A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
* Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
* One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
Recent fuzzing initiatives:&lt;br /&gt;
&lt;br /&gt;
- The Month of Kernel Bugs[http://projects.info-pull.com/mokb/], which revealed an Apple Wireless flaw; see here[http://kernelfun.blogspot.com/]&lt;br /&gt;
&lt;br /&gt;
- The Month of Browser Bugs (review here[http://osvdb.org/blog/?p=127]); number of bugs found: MSIE: 25 Apple Safari: 2 Mozilla: 2 Opera: 1 Konqueror: 1&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15741</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15741"/>
				<updated>2007-01-23T10:16:11Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* File format fuzzing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools. Generators usually use combinations of static fuzzing vectors (known-to-be-dangerous values), or totally random data. New generation fuzzers use genetic algorithms to link injected data and observed impact. Such tools are not public yet.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
* Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''conformance testing oriented'' fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common;&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
Recent fuzzing initiatives:&lt;br /&gt;
&lt;br /&gt;
- The Month of Kernel Bugs[http://projects.info-pull.com/mokb/], which revealed an Apple Wireless flaw; see here[http://kernelfun.blogspot.com/]&lt;br /&gt;
&lt;br /&gt;
- The Month of Browser Bugs (review here[http://osvdb.org/blog/?p=127]); number of bugs found: MSIE: 25 Apple Safari: 2 Mozilla: 2 Opera: 1 Konqueror: 1&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15740</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15740"/>
				<updated>2007-01-23T10:15:34Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Attack types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools. Generators usually use combinations of static fuzzing vectors (known-to-be-dangerous values), or totally random data. New generation fuzzers use genetic algorithms to link injected data and observed impact. Such tools are not public yet.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
* Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''conformance testing oriented'' fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common;&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
Recent fuzzing initiatives:&lt;br /&gt;
&lt;br /&gt;
- The Month of Kernel Bugs[http://projects.info-pull.com/mokb/], which revealed an Apple Wireless flaw; see here[http://kernelfun.blogspot.com/]&lt;br /&gt;
&lt;br /&gt;
- The Month of Browser Bugs (review here[http://osvdb.org/blog/?p=127]); number of bugs found: MSIE: 25 Apple Safari: 2 Mozilla: 2 Opera: 1 Konqueror: 1&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15739</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15739"/>
				<updated>2007-01-23T10:13:58Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Comparison with cryptanalysis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools. Generators usually use combinations of static fuzzing vectors (known-to-be-dangerous values), or totally random data. New generation fuzzers use genetic algorithms to link injected data and observed impact. Such tools are not public yet.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
* Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common;&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
Recent fuzzing initiatives:&lt;br /&gt;
&lt;br /&gt;
- The Month of Kernel Bugs[http://projects.info-pull.com/mokb/], which revealed an Apple Wireless flaw; see here[http://kernelfun.blogspot.com/]&lt;br /&gt;
&lt;br /&gt;
- The Month of Browser Bugs (review here[http://osvdb.org/blog/?p=127]); number of bugs found: MSIE: 25 Apple Safari: 2 Mozilla: 2 Opera: 1 Konqueror: 1&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15738</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15738"/>
				<updated>2007-01-23T10:13:06Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Why Fuzz? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools. Generators usually use combinations of static fuzzing vectors (known-to-be-dangerous values), or totally random data. New generation fuzzers use genetic algorithms to link injected data and observed impact. Such tools are not public yet.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common;&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
Recent fuzzing initiatives:&lt;br /&gt;
&lt;br /&gt;
- The Month of Kernel Bugs[http://projects.info-pull.com/mokb/], which revealed an Apple Wireless flaw; see here[http://kernelfun.blogspot.com/]&lt;br /&gt;
&lt;br /&gt;
- The Month of Browser Bugs (review here[http://osvdb.org/blog/?p=127]); number of bugs found: MSIE: 25 Apple Safari: 2 Mozilla: 2 Opera: 1 Konqueror: 1&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15737</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15737"/>
				<updated>2007-01-23T09:57:23Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Comparison with cryptanalysis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools. Generators usually use combinations of static fuzzing vectors (known-to-be-dangerous values), or totally random data. New generation fuzzers use genetic algorithms to link injected data and observed impact. Such tools are not public yet.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common;&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15736</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15736"/>
				<updated>2007-01-23T09:56:38Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Fuzzer implementations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools. Generators usually use combinations of static fuzzing vectors (known-to-be-dangerous values), or totally random data. New generation fuzzers use genetic algorithms to link injected data and observed impact. Such tools are not public yet.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common;&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15735</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15735"/>
				<updated>2007-01-23T09:56:11Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Fuzzer implementations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
Generators usually use combinations of static fuzzing vectors (known-to-be-dangerous values), or totally random data.&lt;br /&gt;
&lt;br /&gt;
New generation fuzzers use genetic algorithms to link injected data and observed impact. Such tools are not public yet.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common;&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15734</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15734"/>
				<updated>2007-01-23T09:50:28Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* History */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing, and shows that modern operating systems are vulnerable to even simple fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common;&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15733</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15733"/>
				<updated>2007-01-23T09:48:46Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Application fuzzing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app: urls, forms, user-generated content, RPC requests, ...&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common;&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15732</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15732"/>
				<updated>2007-01-23T09:46:34Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* File format fuzzing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
One example of file format related vulnerabilities: MS04-028[http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx] (KB833987) Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common;&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15731</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15731"/>
				<updated>2007-01-23T09:43:47Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Fuzzers limitations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common;&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to find simple bugs; plus, the more a fuzzer is protocol-aware, the less weird errors it will find. This is why the exhaustive / random approach is still popular among the fuzzing community.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability (no debugging possibilities).&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15730</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15730"/>
				<updated>2007-01-23T09:38:43Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* File format fuzzing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common;&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15729</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15729"/>
				<updated>2007-01-23T09:36:20Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* File format fuzzing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not that common.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer : Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
Zzuf can act as a fuzzed file generator, http://sam.zoy.org/zzuf/&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15728</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=15728"/>
				<updated>2007-01-23T09:33:40Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
&lt;br /&gt;
- the command-line options&lt;br /&gt;
&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not common.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14357</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14357"/>
				<updated>2006-12-14T14:25:58Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Attack types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life fuzzing vectors examples and methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
- the command-line options&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not common.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;br /&gt;
&lt;br /&gt;
Beyond Security's beSTORM product: [http://www.beyondsecurity.com/bestorm_overview.html]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14250</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14250"/>
				<updated>2006-12-12T15:49:54Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Comparison with cryptanalysis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
First, because the fuzzer has to connect to the input channel, which is bound to the target.&lt;br /&gt;
&lt;br /&gt;
Second, because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
- the command-line options&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not common.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14244</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14244"/>
				<updated>2006-12-12T10:17:37Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* File format fuzzing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
- the command-line options&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not common.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14243</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14243"/>
				<updated>2006-12-12T10:16:43Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* File format fuzzing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
- the command-line options&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not common, but shall see a regain of interest.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14242</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14242"/>
				<updated>2006-12-12T10:16:30Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* File format fuzzing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
- the command-line options&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot; (from the author)&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
Surprisingly, file format fuzzers are not common, but shall see a regain of interest.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14241</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14241"/>
				<updated>2006-12-12T10:14:56Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Attack types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
- the command-line options&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14240</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14240"/>
				<updated>2006-12-12T10:14:41Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Attack types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
- the command-line options&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14239</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14239"/>
				<updated>2006-12-12T10:14:15Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* History */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/ ; it's mainly oriented towards command-line and UI fuzzing.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
- the command-line options&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14238</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14238"/>
				<updated>2006-12-12T10:13:37Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application fuzzing ==&lt;br /&gt;
&lt;br /&gt;
Whatever the fuzzed system is, the attack vectors are within it's I/O. For a desktop app:&lt;br /&gt;
- the UI (testing all the buttons sequences / text inputs)&lt;br /&gt;
- the command-line options&lt;br /&gt;
- the import/export capabilities (see file format fuzzing below)&lt;br /&gt;
&lt;br /&gt;
For a web app, urls and forms are the inputs, and eventually (especially for user-generated content websites) media files.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14237</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14237"/>
				<updated>2006-12-12T09:45:23Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* History */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their (continued) work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14235</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14235"/>
				<updated>2006-12-12T09:39:19Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* File format fuzzing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the program's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14234</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14234"/>
				<updated>2006-12-12T09:39:03Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* File format fuzzing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the programm's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14233</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14233"/>
				<updated>2006-12-12T09:38:33Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the programm's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14232</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14232"/>
				<updated>2006-12-12T09:37:20Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Fuzzer implementations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the programm's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14231</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14231"/>
				<updated>2006-12-12T09:36:58Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocol fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested application, or eventually acts as a proxy, modifying requests on the fly and replaying them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File format fuzzing ==&lt;br /&gt;
&lt;br /&gt;
A file format fuzzer generates multiple malformed samples, and opens them sequentially. When the program crashes, debug information is kept for further investigation.&lt;br /&gt;
&lt;br /&gt;
One can attack:&lt;br /&gt;
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, ...&lt;br /&gt;
- the codec/application layer: lower-level attacks, aiming at the programm's deeper internals&lt;br /&gt;
&lt;br /&gt;
Example found vulnerability: Microsoft's JPEG GDI+ vulnerability was a zero sized comment field, without content.&lt;br /&gt;
&lt;br /&gt;
A generic file format fuzzer is Ilja van Sprundel's mangle.c[http://www.digitaldwarf.be/products/mangle.c]; &amp;quot;it's usage is very simple, it takes a filename and headersize as input. it will then change approximatly between 0 and 10% of the header with random bytes.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
One may use tools like Hachoir[http://hachoir.org/] as a generic parser for file format fuzzers development.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14229</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14229"/>
				<updated>2006-12-12T09:19:33Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Fuzzers advantages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14228</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14228"/>
				<updated>2006-12-12T09:18:59Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Fuzzers advantages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
''The great advantage of fuzz testing is that the test design is extremely simple, and free of preconceptions about system behavior'' (from Wikipedia [http://en.wikipedia.org/wiki/Fuzz_testing#Advantages_and_disadvantages]).&lt;br /&gt;
&lt;br /&gt;
The systematical/random approach allows this method to find bugs that would have often been missed by human eyes. Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14227</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14227"/>
				<updated>2006-12-12T09:16:43Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Fuzzers advantages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
One of the important aspects of a fuzzer is that one doesn't need to look at the internals of the tested system: the systematical/random approach allows this method to find bugs that would have often been missed by human eyes.&lt;br /&gt;
&lt;br /&gt;
Plus, when the tested system is totally closed (say, a SIP phone), fuzzing is one of the only means of reviewing it's quality.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14226</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14226"/>
				<updated>2006-12-12T09:14:48Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
One of the important aspects of a fuzzer is that one doesn't need to look at the internals of the tested system: the systematical/random approach allows this method to find bugs that would have often been missed by human eyes.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
The purpose of fuzzing relies on the assumption that there are bugs within every program, which are waiting to be discovered. Therefore, a systematical approach should find them sooner or later.&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14225</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14225"/>
				<updated>2006-12-12T09:06:12Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Attack types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
- for integers: zero, possibly negative or very big numbers&lt;br /&gt;
&lt;br /&gt;
- for chars: escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...)&lt;br /&gt;
&lt;br /&gt;
- for binary: random ones&lt;br /&gt;
&lt;br /&gt;
Please refer to OWASP's Fuzz Vector's resource[http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
One of the important aspects of a fuzzer is that one doesn't need to look at the internals of the tested system: the systematical/random approach allows this method to find bugs that would have often been missed by human eyes.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14224</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14224"/>
				<updated>2006-12-12T09:04:44Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
For integers, zero, possibly negative or very big numbers.&lt;br /&gt;
&lt;br /&gt;
For chars, escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...).&lt;br /&gt;
&lt;br /&gt;
For binary, random ones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
One of the important aspects of a fuzzer is that one doesn't need to look at the internals of the tested system: the systematical/random approach allows this method to find bugs that would have often been missed by human eyes.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14223</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14223"/>
				<updated>2006-12-12T09:01:04Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
For integers, zero, possibly negative or very big numbers.&lt;br /&gt;
&lt;br /&gt;
For chars, escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...).&lt;br /&gt;
&lt;br /&gt;
For binary, random ones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
One of the important aspects of a fuzzer is that one doesn't need to look at the internals of the tested system: the systematical/random approach allows this method to find bugs that would have often been missed by human eyes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14222</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14222"/>
				<updated>2006-12-12T08:59:41Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Fuzzers limitations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
For integers, zero, possibly negative or very big numbers.&lt;br /&gt;
&lt;br /&gt;
For chars, escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...).&lt;br /&gt;
&lt;br /&gt;
For binary, random ones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
One of the important aspects of a fuzzer is that one doesn't need to look at the internals of the tested system: the systematical/random approach allows this method to find bugs that would have often been missed by human eyes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity/impact of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
Hachoir, a generic parser: could be quite a good starting point for file format fuzzing [http://www.hachoir.org]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14221</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14221"/>
				<updated>2006-12-12T08:58:24Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a Black Box software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Fuzz testing was developed at the University of Wisconsin Madison in 1989 by Professor Barton Miller and his students. Their work can be found at http://www.cs.wisc.edu/~bart/fuzz/&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
For integers, zero, possibly negative or very big numbers.&lt;br /&gt;
&lt;br /&gt;
For chars, escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...).&lt;br /&gt;
&lt;br /&gt;
For binary, random ones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fuzzers advantages ==&lt;br /&gt;
&lt;br /&gt;
One of the important aspects of a fuzzer is that one doesn't need to look at the internals of the tested system: the systematical/random approach allows this method to find bugs that would have often been missed by human eyes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why Fuzz? ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing can add another point of view to classical software testing techniques (hand code review, debugging) because of it's non-human approach. It doesn't replace them,  but is a reasonable complement, thanks to the limited work needed to put the procedure in place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fuzzers from OWASP ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing with WebScarab [http://www.owasp.org/index.php/Fuzzing_with_WebScarab]: a framework for analysing applications that communicate using the HTTP and HTTPS protocols&lt;br /&gt;
&lt;br /&gt;
JBroFuzz [http://www.owasp.org/index.php/JBroFuzz]: a stateless network protocol fuzzer&lt;br /&gt;
&lt;br /&gt;
WSFuzzer [http://www.owasp.org/index.php/WSFuzzer]: real-world manual SOAP pen testing tool&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
Hachoir, a generic parser: could be quite a good starting point for file format fuzzing [http://www.hachoir.org]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14197</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14197"/>
				<updated>2006-12-12T00:40:23Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Attack types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection: it's a type of Black Box Testing, which means testing a closed system on the comportemental point of view.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
For integers, zero, possibly negative or very big numbers.&lt;br /&gt;
&lt;br /&gt;
For chars, escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...).&lt;br /&gt;
&lt;br /&gt;
For binary, random ones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them; forbidden/reserved values, linked parameters, field sizes. That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
Hachoir, a generic parser: could be quite a good starting point for file format fuzzing [http://www.hachoir.org]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14196</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14196"/>
				<updated>2006-12-12T00:39:19Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Attack types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection: it's a type of Black Box Testing, which means testing a closed system on the comportemental point of view.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
For integers, zero, possibly negative or very big numbers.&lt;br /&gt;
&lt;br /&gt;
For chars, escaped, interpretable characters / instructions (ex: For SQL Requests, quotes / commands...).&lt;br /&gt;
&lt;br /&gt;
For binary, random ones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them: forbidden/reserved values, linked parameters, field sizes (a lot of implementations are said not to verify field sizes). That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
Hachoir, a generic parser: could be quite a good starting point for file format fuzzing [http://www.hachoir.org]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14195</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14195"/>
				<updated>2006-12-12T00:38:04Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Comparison with cryptanalysis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection: it's a type of Black Box Testing, which means testing a closed system on the comportemental point of view.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
For integers, zero, possibly negative or very big numbers.&lt;br /&gt;
For chars, escaped, interpretable characters / instructions.&lt;br /&gt;
For binary, random ones.&lt;br /&gt;
For SQL Requests, quotes / commands...&lt;br /&gt;
&lt;br /&gt;
See [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them: forbidden/reserved values, linked parameters, field sizes (a lot of implementations are said not to verify field sizes). That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
Hachoir, a generic parser: could be quite a good starting point for file format fuzzing [http://www.hachoir.org]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14194</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14194"/>
				<updated>2006-12-12T00:37:33Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Comparison with cryptanalysis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection: it's a type of Black Box Testing, which means testing a closed system on the comportemental point of view.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests, i.e. the values we already know that there's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
For integers, zero, possibly negative or very big numbers.&lt;br /&gt;
For chars, escaped, interpretable characters / instructions.&lt;br /&gt;
For binary, random ones.&lt;br /&gt;
For SQL Requests, quotes / commands...&lt;br /&gt;
&lt;br /&gt;
See [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them: forbidden/reserved values, linked parameters, field sizes (a lot of implementations are said not to verify field sizes). That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
Hachoir, a generic parser: could be quite a good starting point for file format fuzzing [http://www.hachoir.org]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14193</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14193"/>
				<updated>2006-12-12T00:36:52Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Comparison with cryptanalysis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection: it's a type of Black Box Testing, which means testing a closed system on the comportemental point of view.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests: the values we already know that here's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
For integers, zero, possibly negative or very big numbers.&lt;br /&gt;
For chars, escaped, interpretable characters / instructions.&lt;br /&gt;
For binary, random ones.&lt;br /&gt;
For SQL Requests, quotes / commands...&lt;br /&gt;
&lt;br /&gt;
See [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them: forbidden/reserved values, linked parameters, field sizes (a lot of implementations are said not to verify field sizes). That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
Hachoir, a generic parser: could be quite a good starting point for file format fuzzing [http://www.hachoir.org]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14192</id>
		<title>Fuzzing</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Fuzzing&amp;diff=14192"/>
				<updated>2006-12-12T00:36:15Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Fuzzer implementations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuzz testing'' or ''Fuzzing'' is a software testing technique, which basically consists in finding implementation bugs using malformed/semi-malformed data injection: it's a type of Black Box Testing, which means testing a closed system on the comportemental point of view.&lt;br /&gt;
&lt;br /&gt;
== A trivial example: ==&lt;br /&gt;
&lt;br /&gt;
Lets's consider an integer in a program, which stores the result of a user's choice between 3 questions. When the user picks one, the choice will be 0, 1 or 2. Which makes three practical cases. But what if we transmit 3, or 255 ? We can, because integers are stored a static size variable. If the default switch case hasn't been implemented securely, the program may crash and lead to &amp;quot;classical&amp;quot; security issues: (un)exploitable buffer overflows, DoS, ...&lt;br /&gt;
&lt;br /&gt;
Fuzzing is the art of automatic bug finding, and it's role is to find software implementation faults, and identify them if possible.&lt;br /&gt;
&lt;br /&gt;
== Fuzzer implementations ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer is a program which injects automatically semi-random data into a program/stack and detect bugs.&lt;br /&gt;
The data-generation part is made of generators, and vulnerability identification relies on debugging tools.&lt;br /&gt;
&lt;br /&gt;
A protocol fuzzer sends forged packets to the tested system, and a file format fuzzer generates files and opens them one after another, an application fuzzer sends forged data.&lt;br /&gt;
&lt;br /&gt;
== Comparison with cryptanalysis ==&lt;br /&gt;
&lt;br /&gt;
The number of possible tryable solutions is ''the explorable solutions space''. The aim of Cryptanalysis is to reduce this space, which means finding a way of having less keys to try than pure bruteforce to decrypt something. &lt;br /&gt;
&lt;br /&gt;
Most of the fuzzers are:&lt;br /&gt;
&lt;br /&gt;
- protocol/file-format dependant&lt;br /&gt;
&lt;br /&gt;
- data-type dependant&lt;br /&gt;
&lt;br /&gt;
Why? &lt;br /&gt;
&lt;br /&gt;
Because a program only understands structured-enough data. If you connect to a web server in a raw way, it will only respond to listed commands such as GET (or eventually crash). It will take less time to start the string with &amp;quot;GET &amp;quot;, and fuzz the rest, but the drawback is that you'll skip all the tests on the first verb.&lt;br /&gt;
&lt;br /&gt;
In this regard, Fuzzers try to reduce the number of unuseful tests: the values we already know that here's little chance they'll work: you reduce impredictibility, in favor of speed.&lt;br /&gt;
&lt;br /&gt;
== Attack types ==&lt;br /&gt;
&lt;br /&gt;
A fuzzer would try combinations of attacks on:&lt;br /&gt;
&lt;br /&gt;
- numbers (signed/unsigned integers/float...)&lt;br /&gt;
&lt;br /&gt;
- chars (urls, command-line inputs)&lt;br /&gt;
&lt;br /&gt;
- metadata : user-input text (id3 tag)&lt;br /&gt;
&lt;br /&gt;
- pure binary sequences&lt;br /&gt;
&lt;br /&gt;
A common approach to fuzzing is to define lists of &amp;quot;known-to-be-dangerous values&amp;quot; (''fuzz vectors'') for each type, and to inject them or recombinations.&lt;br /&gt;
&lt;br /&gt;
For integers, zero, possibly negative or very big numbers.&lt;br /&gt;
For chars, escaped, interpretable characters / instructions.&lt;br /&gt;
For binary, random ones.&lt;br /&gt;
For SQL Requests, quotes / commands...&lt;br /&gt;
&lt;br /&gt;
See [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors] for real-life examples.&lt;br /&gt;
&lt;br /&gt;
Protocols and file formats imply norms, which are sometimes blurry, very complicated or badly implemented : that's why developers sometimes mess up in the implementation process (because of time/cost constraints). That's why it can be interesting to take the opposite approach: take a norm, look at all mandatory features and constraints, and try all of them: forbidden/reserved values, linked parameters, field sizes (a lot of implementations are said not to verify field sizes). That would be ''hand-fuzzing''.&lt;br /&gt;
&lt;br /&gt;
== Fuzzers limitations ==&lt;br /&gt;
&lt;br /&gt;
Fuzzers usually tend to try one-level-imbrication-level attacks, which means changing only one parameter at a time. Therefore, fuzzing tools can detect trivial errors, but are less gifted with deep ones.&lt;br /&gt;
&lt;br /&gt;
Another problem is that when you do some black-box-testing, you usually attack a closed system, which increases difficulty to evaluate the dangerosity of the found vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Technical resources on OWASP  ==&lt;br /&gt;
&lt;br /&gt;
Fuzzing vectors [http://www.owasp.org/index.php/OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia article [http://en.wikipedia.org/wiki/Fuzz_testing]&lt;br /&gt;
&lt;br /&gt;
Fuzzing-related papers [http://www.threatmind.net/secwiki/FuzzingPapers]&lt;br /&gt;
&lt;br /&gt;
== Fuzzing tools ==&lt;br /&gt;
&lt;br /&gt;
The ultimate fuzzers list @ infosec [http://www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html]&lt;br /&gt;
&lt;br /&gt;
Another list @ hacksafe&lt;br /&gt;
[http://www.hacksafe.com.au/blog/2006/08/21/fuzz-testing-tools-and-techniques/]&lt;br /&gt;
&lt;br /&gt;
Hachoir, a generic parser: could be quite a good starting point for file format fuzzing [http://www.hachoir.org]&lt;br /&gt;
&lt;br /&gt;
The fuzzing mailing list [http://www.whitestar.linuxbox.org/mailman/listinfo/fuzzing]&lt;br /&gt;
&lt;br /&gt;
== Commercial products ==&lt;br /&gt;
&lt;br /&gt;
Codenomicon's product suite: [http://www.codenomicon.com/products/all.shtml]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	</feed>