The
term first originates from Barton Miller at the University of Wisconsin 1988.
Similar techniques have been used in the field of quality assurance, where they
are referred to as robustness testing, syntax testing or negative testing.
There
are two forms of fuzzing program; mutation-based and generation-based, which
can be employed as white-, grey- or black-box testing. File formats and network
protocols are the most common targets of testing, but any type of program input
can be fuzzed. Interesting inputs include environment variables, keyboard and
mouse events, and sequences of API calls. Even items not normally considered
"input" can be fuzzed, such as the contents of databases, shared
memory, or the precise interleaving of threads.
For
the purpose of security, input that crosses a trust boundary is often the most
interesting. For example, it is more important to fuzz code that handles the
upload of a file by any user than it is to fuzz the code that parses a configuration
file that is accessible only to a privileged user.
Techniques
Fuzzing
programs fall into two different categories. Mutation based fuzzers mutate
existing data samples to create test data while generation based fuzzers define
new test data based on models of the input.
The
simplest form of fuzzing technique is sending a stream of random bits to
software, either as command line options, randomly mutated protocol packets, or
as events. This technique of random inputs still continues to be a powerful tool
to find bugs in command-line applications, network protocols, and GUI-based
applications and services. Another common technique that is easy to implement
is mutating existing input (e.g. files from a test suite) by flipping bits at
random or moving blocks of the file around. However, the most successful
fuzzers have detailed understanding of the format or protocol being tested
The
understanding can be based on a specification. A specification-based fuzzer
involves writing the entire array of specifications into the tool, and then
using model-based test generation techniques in walking through the
specifications and adding anomalies in the data contents, structures, messages,
and sequences. This "smart fuzzing" technique is also known as robustness
testing, syntax testing, grammar testing, and (input) fault
injection.[10][11][12][13] The protocol awareness can also be created
heuristically from examples using a tool such as Sequitur. These fuzzers can
generate test cases from scratch, or they can mutate examples from test suites
or real life. They can concentrate on valid or invalid input, with mostly-valid
input tending to trigger the "deepest" error cases.
There
are two limitations of protocol-based fuzzing based on protocol implementations
of published specifications: 1) Testing cannot proceed until the specification
is relatively mature, since a specification is a prerequisite for writing such
a fuzzer; and 2) Many useful protocols are proprietary, or involve proprietary
extensions to published protocols. If fuzzing is based only on published
specifications, test coverage for new or proprietary protocols will be limited
or nonexistent.
Fuzz
testing can be combined with other testing techniques. White-box fuzzing uses
symbolic execution and constraint solving. Evolutionary fuzzing leverages feedback
from code coverage, effectively automating the approach of exploratory testing.
Tidak ada komentar:
Posting Komentar