Developer's Guide
Content
1. Adding a new abstraction function 2. Adding a new fuzzing function 3. Using AutoFuzz logging facility 4. AutoFuzz packages description 4.1 AutoFuzzMain 4.2 BioinfoFieldExtractor 4.3 FuzzingEngine 4.4 ProtocolLearner 4.5 ProxyServer 4.6 socks 4.7 socks.server 1. Adding a new abstraction function 1. You will usually need two abstraction functions: one for input messages, another for output messages (You can also use the same abstraction function for both input and output messages). Each abstraction function must implement the AbstractionFunct interface. Name them as [ProtocolName]\AbstractionFunction.java 2. Copy two *.java files into [MainDrive]:\[ProgramFiles]\AutoFuzz\AbstractionFuncs\ 3. Compile both files using 'javac'. (Please run cmd.exe as an administrator, otherwise windows will give "access denied error" when trying to compile the files)4. Modify [MainDrive]:\[ProgramFiles]\AutoFuzz\abstractionSource.txt by adding a name of the newly added function. abstractionSource.txt:
5. You can now run AutoFuzz and it will load the new abstraction functions at the start up 2. Adding a new fuzzing function Any fuzzing function must implement FuzzingFunctionInterface or FuzzingFunctionInterface2. The parameters of the FuzzingFunction interface are a GenericMessage object (GMS) and a current input message represented as an array list of ASCII decimals. The parameters of the FuzzingFunctionInterface2 are a GenericMessage object (GMS), current input message, the protocol's FSA and the current state ID. Please note that FuzzingFunctionInterface2 is richer than the FuzzingFunctionInterface, but should be used with caution not to affect the fuzzing engine. We decribe the FuzzingFunctionInterface in more details below. 1. A fuzzing function can operate on the generic or the actual input message. GenericMessage object consists of an array list of message blocks. A message block can be either static or variable data field. Variable message blocks have also an associated type information. See more about the (GMS). 2. Name the new fuzzing function as FuzzingFunction[ArbitraryName].java 3. Copy *.java files into [MainDrive]:\[ProgramFiles]\AutoFuzz\FuzzingFunctions 4. Compile *.java file using "javac". Please note that the classpath should be set to the location of AutoFuzz[Version].jar
5. Modify [MainDrive]:\[ProgramFiles]\AutoFuzz\fuzzingSource.txt by adding a the name of the new fuzzing function. fuzzingSource.txt:
3. Using AutoFuzz logging facility AutoFuzz has built-in logging functionality that allows to record messages from anywhere within the application. To create a new type of a log file perform the following steps: 1. Add a new static log file in system Configuration Variables with set/get methods. For example:
2. Call instantiateNewSystemLogFile method of the LoggingFacility class specifying the suffix for the log file. All log files begin with AutoFuzzLog prefix.
3. Set the static File object in configuration variables to the newly created log file.
4. Use writeLogMessage method of the LoggingFacility to record messages into the log file. The parameters are: log file object, severity level and the message itself. The following severity levels are available through the configuration variables: Info, Warning, Error and Severe.
4. AutoFuzz packages description 4.1 AutoFuzzMain - The main class for AutoFuzz contains here alogn with the GUI classes, global system variables, logging facility and functions for the graphical construction of a finite state automaton. Finite state automaton builder is based on Java JUNG graph library. 4.2 BioinfoFieldExtraction - The main algorithms for extracting syntax information from the individual messages and associating it with the finite state automaton are done here. The main steps are: Step 1: Similar messages are clustered together using a new clustering technique. Step 2: Multiple sequence alignment algorithm is performed on each message cluster. Step 3: GMS is constructed for each message cluster. Step 4: Each transition in the protocol's FSA is associated with the corresponding GMS. 4.3 FuzzingEngine - The package is responsible for all fuzzing operations of AutoFuzz. The fuzzing engine contains a copy of the minimized finite state automaton and sequentially performs fuzzing functions on each transition. Each transition has a StringFuzzerEngine object associated with it, which keeps information about what fuzzing functions have been performed at this particular transition. The fuzzing engine is reinitialized every time user click on "Init. Fuzzing Engine" under the Proxy Server window. 4.4 ProtocolLearner - This package constructs the finite state automaton from a collection of network traces. The initial construction algorithm is based on the passive learning approach proposed in "A Model-based Approach to Security Flaw Detection of Network Protocol Implementations" by Yating Hsu, Guoqiang Shu and David Lee but has been slightly modified. In our implementation a input message can be mapped to a list of output messages. Therefore, each transition is uniquly identified by a state ID and an input messages associated with a list of output messages. ----------------------------------------------------------------------------------------------------------- Finite State Automaton Construction Algorithm Overview: Input: A list of message traces, Input abstraction Func, Output abstraction Func Output: Finite State Automaton Object Instantiate FSA for each trace: reset current state to the root state for each message in the trace: abstract input message abstract output messages if there is no transition from the current state with the given abstracted input message: add a new transition from the current state associate input messages and a list of output messages with it else if one or more output messages are not a part of the transition: associate all new output messages with the transition change current state to the new state associated with the abstracted input message return FSA object ----------------------------------------------------------------------------------------------------------- 4.5 ProxyServer - this package instantiates a modified version of Java SOCKS Server as a separate thread and uses it to record and modify the traffic. 4.6, 4.7 socks and socks.server - These packages are takes from java SOCKS server implementation and have been modified to support recording and modification of the network traffic.
4. Modify [MainDrive]:\[ProgramFiles]\AutoFuzz\abstractionSource.txt by adding a name of the newly added
function.
abstractionSource.txt:
5. You can now run AutoFuzz and it will load the new abstraction functions at the start up
2.
5. Modify [MainDrive]:\[ProgramFiles]\AutoFuzz\fuzzingSource.txt by adding a the name of the new fuzzing
function.
fuzzingSource.txt:
3.
2. Call instantiateNewSystemLogFile method of the LoggingFacility class specifying the suffix for
the log file. All log files begin with AutoFuzzLog prefix.
3. Set the static File object in configuration variables to the newly created log file.
4. Use writeLogMessage method of the LoggingFacility to record messages into the log file. The parameters
are: log file object, severity level and the message itself. The following severity levels are available
through the configuration variables: Info, Warning, Error and Severe.
4.