The Art of Fuzzing Slides
The Art of Fuzzing Slides
The Art of Fuzzing Slides
© fotolia 41706530
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Introduction
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
ADVISOR FOR YOUR INFORMATION SECURITY
Vilnius | LT
Berlin| DE
Montreal | CA Moscow | RU
Zurich | CH
Vienna (HQ) | AT
Wiener Neustadt | AT
Founded 2002
Leading in IT-Security Services and Singapore | SG
Consulting
Bangkok | TH
Strong customer base in Europe and Asia
70+ Security experts
SEC Consult Offices
400+ Security audits per year SEC Consult Clients
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Fuzzing
© fotolia 62904980
Fuzzing
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Why do we need Fuzzing?
Source: https://www.microsoft.com/en-us/SDL/process/verification.aspx
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Why do we need Fuzzing?
Where input to file parsing code could have crossed a trust boundary, file fuzzing
must be performed on that code. […]
• An Optimized set of templates must be used. Template optimization is based on
the maximum amount of code coverage of the parser with the minimum number of
templates. Optimized templates have been shown to double fuzzing effectiveness
in studies. A minimum of 500,000 iterations, and have fuzzed at least 250,000
iterations since the last bug found/fixed that meets the SDL Bug Bar.
Source: https://msdn.microsoft.com/en-us/library/windows/desktop/cc307418.aspx
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Fuzzing
• Advantages:
• Very fast (in most cases much faster than manual source code review)
• You don’t have to pay a human, only the power consumption of a computer
• It runs 24 hours / 7 days, a human works only 8 hours / 5 days
• Scalable (want to find more bugs? Start 100 fuzzing machines instead of 1)
• Disadvantages:
• Deep bugs (lots of pre-conditions) are hard to find
• Typically you can’t find business logic bugs
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
© fotolia 62904980
Successful Fuzzing Examples
Demo Time!
Runtime: 29 sec
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Exploitability of the vulnerability
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
AutoIt
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
AutoIt Demo Source Code
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
AutoIt
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Recap
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
© fotolia 62904980
Feedback-based Fuzzing
Feedback based fuzzing
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Full input:
foobar
Full output:
Please enter some command
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Full input:
FOOBAR
Full output:
Please enter some command
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Full input:
command
Full output:
Please enter some command
You entered command!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Full input:
Command
123
Full output:
Please enter some command
You entered command!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Full input:
foobar
123
Full output:
Please enter some command
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Full input:
command
subcommand
Full output:
Please enter some command
You entered command!
You entered subcommand!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Fuzzing Queue:
Consider this pseudocode:
{A,B,C}
Full input:
Command
subcommand
trigger
Full output:
Please enter some command
You entered command!
You entered subcommand!
You entered trigger!
Crash
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
• Example:
• SECCON 2016 CTF – Chat binary ; nearly all CTF binaries
• Embedded hardware admin console (text-based applications)
• Pro:
• Very simple & fast to implement
• Normal application runtime during fuzzing (no performance lose)
• Con:
• Not always applicable (application does not give output messages)
• If two different behaviors do not result in different output it‘s useless
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Hooking fprintf:
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Without With
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
And so on…
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Methods to measure code-coverage
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
American Fuzzy Lop - AFL
• Strategy:
1. Start with a small min-set of input sample files
2. Mutate “random” input file from queue like a dumb fuzzer
3. If mutated file reaches new path(s), add it to queue
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
• Basic Blocks:
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Feedback based fuzzing
• Result:
Store old
register values
Instrumentation
Restore old
register values
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
American Fuzzy Lop - AFL
cur_location = <compile_time_random_value>;
bitmap[(cur_location ^ prev_location) % BITMAP_SIZE]++;
prev_location = cur_location >> 1;
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
American Fuzzy Lop - AFL
cur_location = <compile_time_random_value>;
bitmap[(cur_location ^ prev_location) % BITMAP_SIZE]++;
prev_location = cur_location >> 1;
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
American Fuzzy Lop - AFL
Source:
http://lcamtuf.coredump.cx/afl_
gzip.png
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Corpus Distillation
• We can either start fuzzing with an empty input folder or with downloaded /
generated input files
• Empty file:
• Let AFL identify the complete format (unknown target binaries)
• Can be very slow
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
American Fuzzy Lop - AFL
3. Start fuzzing:
./afl-fuzz -i testcase_dir -o findings_dir
-- /path/to/tested/program [...program's cmdline...] @@
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
American Fuzzy Lop - AFL
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
AFL with CVE-2009-0385 (FFMPEG)
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
AFL with CVE-2009-0385 (FFMPEG)
• AFL input with invalid 4xm file (strk chunk changed to strj)
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
LibFuzzer
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
LibFuzzer
Source: http://tutorial.libfuzzer.info
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Runtime: 41 sec
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Methods to measure code-coverage
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
AFL qemu mode
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
AFL qemu mode
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
AFL qemu mode
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Methods to measure code-coverage
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Topic: Breakpoint
instrumentation of Adobe
Reader
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Code-Coverage via Breakpoints
• Disadvantage:
• It’s very slow
• Statically setting breakpoints can speedup the process, but it’s still
slow because of the debugger process switches
• Only really applicable if we remove a breakpoint after the first hit
We only measure code-coverage (without a hit-count), edge-
coverage not possible or extremely slow
• On-disk files are modified (statically), which can be detected with
checksums (e.g. Adobe Reader .api files)
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Code-Coverage via Breakpoints
• Advantage:
• Minset calculation
• Detection if a new file has new code-coverage is very fast (native
runtime) because we statically set breakpoints for unexplored code
and run the application without a debugger
• If it crashes we know it hit one of our breakpoints and therefore
contains unexplored code
• Often useful during reverse engineering (E.g. dump registers at
every breakpoint, see later demo)
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Methods to measure code-coverage
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Dynamic Instrumentation Frameworks
• Register callbacks, which are trigger at specific events (new basic block / instruction which
gets moved into code cache, load of module, exit of process, …)
• At callback (e.g. new basic block), we can further add instructions to the basic block which
get executed every time the basic block gets executed!
• Transformation time (Instrumentation Function): Analyzing a BB the first time (called once)
• Execution time (Analysis Function): Executed always before instruction gets executed
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
DynamoRIO
Transformation time
Execution time
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
DynamoRIO
• Nudges can be send to the process & callbacks can react on them
• Example: Turn logging on after the application started
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
DynamoRIO
• Example: Start Adobe Reader, load PDF file, exit Adobe Reader, extract coverage data
(Processing 25 PDFs with one single CPU core)
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
DynamoRio vs PIN
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Topic: Instrumentation of
Adobe Reader with
DynamoRio
Description: Use
DynamoRio to extract code-
coverage of a closed-source
application using only a
simple command.
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
WinAFL
• Two modes:
• DynamoRio: Source code not required
• Syzygy: Source code required
• Alternative: You can easily modify WinAFL to use PIN on Windows
• Windows does not use COW (Copy-on-Write) and therefore fork-like mechanisms are not
efficient on Windows!
• On Linux AFL heavily uses a fork-server
• On Windows WinAFL heavily uses in-memory fuzzing
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Fuzzing and exploiting mimikatz
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Methods to measure code-coverage
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Methods to measure code-coverage
Fuzzer
Results
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Areas which influence fuzzing results
Fuzzer speed
Fuzzer
Results
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Fuzzer Speed
1. Fork Server
4. Prevent process switches (between target application and the Fuzzer) by injecting the Fuzzer
code into the target process
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
GUI automation – Example HashCalc
Question 1:
What is the maximum MD5
fuzzing speed with GUI
automation?
Question 2:
How many MD5 hashes can
you calculate on a CPU per
second?
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
WinAFL
1. Measure code coverage (drrun –t drcov) in two program invocations, one should
trigger the function, one not. Then substract both traces (IDA Pro lighthouse)
2. Log all calls and returns together with register and stack values to a logfile. Then
search for the correct input / output combination (IDA Pro funcap or a simple
DynamoRio / PIN tool)
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
GUI automation
• In-Memory with DynamoRio (no instr.): ~170 000 - 200 000 exec / sec
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Areas which influence fuzzing results
Input filesize
Fuzzer
Results
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Input file size
• Smaller files
• Have a higher likelihood to change the correct bit / byte during fuzzing
• Are faster processed by deterministic fuzzing
• Are faster loaded by the target application
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Input file size
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Heat map of the memory dump (mimikatz access)
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Heat map of the memory dump (mimikatz access) - Zoomed
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Fuzzing and exploiting mimikatz
See below link for in-depth discussion how I fuzzed mimikatz with WinAFL:
https://www.sec-consult.com/en/blog/2017/09/hack-the-hacker-fuzzing-mimikatz-on-windows-with-winafl-
heatmaps-0day/index.html
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Creation of heatmaps
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
How my tool for heatmap creation work
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Combine Call-Graph with Taint-Analysis
We can write a DynamoRio/PIN tool which tracks calls and taint status
Automatically detect target fuzz function
_start
func1 Target
func2 func3
Function func4 func1
to fuzz
access access
func5 func6 func7 func8 func9
access
access access
access
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Fuzzing with taint analysis
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
The power of dynamic instrumentation frameworks
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Areas which influence fuzzing results
Fuzzer
Results
Mutators
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
AFL Mutation
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
AFL Mutation
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Radamsa
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Radamsa
• Test 1: Before every execution we mutate the input with a call to radamsa
• Result: Execution speed is ~17 executions per second
• Always create multiple output files (e.g.: 100 or 1000) or use IP:Port output
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Radamsa
• Testcases as input:
test1.txt test2.txt test3.txt
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Radamsa
Possible output
Only variations of
the current input file
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Radamsa
Combination of
multiple input files!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Radamsa vs. Ni
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Speed comparision
• The following table gives a speed comparison between different test setups for
mutating data
• Numbers in the table are generated testcases per second
• Table does not contain fuzzing or file read/write times (only generation of fuzz data)
• TC stands for number of test cases
• RD stands for RAM disk for files & programs
• Test program was a Python script
• Radamsa fast mode uses the following mutators:
• -m bf,bd,bi,br,bp,bei,bed,ber,sr,sd
• Taken from FAQ from https://github.com/aoh/radamsa
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Speed comparision – input small text files
Type of test Radamsa ext. Radamsa fast ext. Ni ext. Ni library (ctypes)
Input stdin (1 tc), output
~ 265 ~ 345 (no stdin support) -
stdout (1 tc)
Input files (3 tc), output
~ 255 ~300 ~775 -
stdout (1 tc)
Input files (3 tc), output via
~1100 ~1930 ~7300 -
files (100 tc)
Input via files (3 tc), output
~1100 ~2150 ~8350 -
via files (1000 tc)
Input files (3 tc), output via
~1220 ~2740 ~7300 -
files (100 tc); RD
Input files (3 tc), output via
~1230 ~3100 ~8400 -
files (1000 tc); RD
Input 3 samples, output
- - - ~4000
one (all in-memory)
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
The problem of the search space
The following input triggers the second Use-After-Free flaw in the chat binary:
Depth 1
register send_private_message
user1 user2
register Depth 10
content
user2 delete_user
login login
Depth 6
user1 user2
Depth 13
view_messages
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
The problem of the search space
empty
<empty>
register
register user1 user2 login send…
user1
register
register user1 user2 login send… user1
register
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
The problem of the search space
• We need at least 7 distinct inputs to find the flaw (register, user1, user2, login,
send_private_message, delete_user, view_message)
• During real fuzzing we have way more inputs (all possible commands, special
chars, long strings, special numbers, ….)
• After every input line we can again select one from the 7 possible inputs
• We have to find 13 inputs in the correct order to trigger the bug!
• For 13 inputs we have 7^13 = 96 889 010 407 possibilities
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
The problem of the search space
• Initial Start-Sequence (Create Users) (This can be seen as our “input corpus”)
• Initial End-Sequence (Check public and private messages of all users)
• Encode the format into the fuzzer
• Example: send_message(username, random_string_msg))
• Peach Fuzzer
• But that was basically what we wanted to avoid (Fuzzer should work without modification)
• Instead of adding one command per iteration, add many commands (inputs)
• Same when fuzzing web browsers Add thousands of html, svg, JavaScript, CSS, …
lines to one test case and check for a crash
• Important: Too many commands can create invalid inputs (e.g. invalid command Exit
application)
• Additional feedback to “choose” promising entries (E.g.: prefer text output which was not
seen yet, prefer fuzzer queue entries which often produce new output, …)
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
The problem of the search space
The following input triggers the second Use-After-Free flaw in the chat binary:
register send_private_message
user1 user2
register Depth 4
content
user2 delete_user
login login
user1 user2
view_messages
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Chat CTF Fuzzer
• UAF1 was removed from patched binary because UAF1 would trigger before UAF2
• This fuzzer also works for any other CTF binary!!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Areas which influence fuzzing results
Fuzzer
Results
Detection rate
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Detecting not crashing vulnerabilities
Did you notice, that we triggered 3 (!) not crashing vulnerabilities during the „chat“
introduction demo?
Other real world example: Heartbleed is a read buffer overflow and does not lead
to a crash…
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Heap Overflow Detection
Meta Meta
Heap Data 1 Heap Data 2
Data Data
Heap Overflow
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Heap Overflow Detection
Heap Overflow
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Use-After-Free Detection
FREE
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Use-After-Free Detection
Access attempt
Access attempt
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Heap Library
• We can also set AFL_HARDEN=1 before make (Fortify Source & Stack Cookies)
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Libdislocator catches heap overflow
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Libdislocator catches Use-After-Free
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Demo Time!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Detecting not crashing vulnerabilities
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Detecting not crashing vulnerabilities
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Detecting not crashing vulnerabilities
send_private_message
Free() user2
Detection here! content
delete_user
login
Use after free user2
view_messages
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Overview: Areas which influence fuzzing results
Fork-server
AFL-tmin & AFL-cmin
Faster instrumentation code
Heat maps via
Static vs. Dynamic
Instrumentation
Fuzzer speed Input filesize Taint Analysis and
Shadow Memory
In-memory fuzzing
…
No process switches
… Fuzzer
Results
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
© fotolia 62904980
Some public fuzzing numbers
Some public fuzzing numbers
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Some public fuzzing numbers
Fuzzer:
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Some public fuzzing numbers
Results:
• 3 months fuzzing
• 7 Million Iterations
Crashes with unique EIP: Source: Charlie Miller „Babysitting an Army of Monkeys“
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Some public fuzzing numbers
• https://nordictestingdays.eu/files/files/jaanus_kaap_fuzzing.pdf
• Code coverage for minset calculation (no edge coverage because of speed)
• PDF initial set 400 000 files Corpus 1217 files
• DOC initial set 400 000 files Corpus 1319 files
• DOCX initial set 400 000 files Corpus 2222 files
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Some public fuzzing numbers
„What does corpus distillation look like at Google scale? Turns out we have a
large index of the web, so we cranked through 20 terabytes of SWF file
downloads followed by 1 week of run time on 2,000 CPU cores to calculate the
minimal set of about 20,000 files. Finally, those same 2,000 cores plus 3 more
weeks of runtime were put to good work mutating the files in the minimal set
(bitflipping, etc.) and generating crash cases. “
The initial run of the ongoing effort resulted in about 400 unique crash signatures,
which were logged as 106 individual security bugs following Adobe's initial triage.
• Source: https://security.googleblog.com/2011/08/fuzzing-at-scale.html
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Some public fuzzing numbers
https://googleprojectzero.blogspot.co.at/2017/09/the-great-dom-fuzz-off-of-2017.html
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Rules for fuzzing
© fotolia 62904980
Fuzzing rules
1. Start fuzzing!
2. Start with simple fuzzing, during fuzzing add more logic to the next fuzzer version
3. Use Code/Edge Coverage Feedback
4. Create a good input corpus (via download or feedback)
5. Minimize the number of sample files and the file size
6. Use sanitizers / heap libraries during fuzzing (not for corpus generation)
7. Modify the mutation engine to fit your input data
8. Skip the “initialization code” during fuzzing (fork-server, persistent mode, …)
9. Use wordlists to get a better code coverage
10. Instrument only the code which should be tested
11. Don’t fix checksums inside your Fuzzer, remove them from the target application (faster)
12. Start fuzzing!
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
A last hint…
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
Thank you for your attention!
Source: Twitter
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
For any further questions contact
your SEC Consult Expert.
René Freingruber
@ReneFreingruber
r.freingruber@sec-consult.com
+43 676 840 301 749
www.sec-consult.com
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved
SEC Consult in your Region.
AUSTRIA (HQ) GERMANY SWITZERLAND
SEC Consult Unternehmensberatung GmbH SEC Consult Deutschland SEC Consult (Schweiz) AG
Mooslackengasse 17 Unternehmensberatung GmbH Turbinenstrasse 28
1190 Vienna Ullsteinstraße 118, Turm B/8 Stock 8005 Zürich
12109 Berlin
Tel +43 1 890 30 43 0 Tel +41 44 271 777 0
Fax +43 1 890 30 43 15 Tel +49 30 30807283 Fax +43 1 890 30 43 15
Email office@sec-consult.com Email office-berlin@sec-consult.com Email office-zurich@sec-consult.com
RUSSIA THAILAND
CJCS Security Monitor SEC Consult (Thailand) Co.,Ltd.
5th Donskoy proyezd, 15, Bldg. 6 29/1 Piyaplace Langsuan Building 16th Floor, 16B
119334, Moscow Soi Langsuan, Ploen Chit Road
Lumpini, Patumwan | Bangkok 10330
Tel +7 495 662 1414
Email info@securitymonitor.ru Email office-vilnius@sec-consult.com
Title: The Art of Fuzzing| Responsible: R. Freingruber | Version / Date: V1.0/2017-11 | Confidentiality Class: public
© 2017 SEC Consult | All rights reserved