“how i learned to stop fuzzing and find more bugs.” · how i learned to stop fuzzing and find...

48
How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 Las Vegas

Upload: duongtu

Post on 01-Apr-2018

220 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

How I Learned to Stop Fuzzing and Find More Bugs

Jacob West Fortify Software

August 3-5, 2007 Las Vegas

Page 2: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Agenda

Introduction to fuzzingWhat we mean by fuzzingChallenges with fuzzing

Introduction to static analysisHow static analysis worksExamples of bugs static analysis is good at findingUntapped potential: Customization

ExperimentFuzzing versus static analysis

Conclusion

Page 3: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

What is Fuzzing?

Encompasses runtime testing that attempts to induce faults in software systems by inputting random or semi-random valuesIntroduced by Barton Miller at the University of Wisconsin, Madison in 1990 (cs.wisc.edu/~bart/fuzz/)

Page 4: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Examples of Tools

We’re talking about tools such as:SPIKE www.immunitysec.com/resources-freesoftware.shtml

Peach http://peachfuzz.sourceforge.net

PROTOS http://www.ee.oulu.fi/research/ouspg/protos/

… and many more

But not specialized black box scanning tools:CenzicSPI Dynamics (except SPI Fuzzer)Watchfire

Page 5: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

The Inventor’s Thoughts on Fuzzing

1990: “[Fuzzing] is not a substitute for a formal verification or testing procedures, but rather an inexpensive mechanism to identify bugs…”1995: “While [fuzzing] is effective in finding real bugs in real programs, we are not proposing it as a replacement for systematic and formal testing.”2000: “Simple fuzz testing does not replace more extensive formal testing procedures.”

- Barton Miller

Page 6: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Woulda, Coulda, Shoulda

SC-L Digest, Vol 3, Issue 118:

“I would assume that "smart" fuzzing could have lots of manipulations of the HH:mm:ss.f format, so this might be findable using black box testing.”

- Steve Christey

Page 7: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Woulda, Coulda, Shoulda

http://blogs.msdn.com/sdl

“It turns out none of the .ANI fuzz templates had a second “anih” record.

This is now addressed, and we are continually enhancing our fuzzing tools to make sure they add manipulations that duplicate arbitrary object elements better.”

- Michael Howard

Page 8: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

How Fuzzing Works

Identify sources of input to a programPermute or generate pseudorandom inputUse an oracle to monitor for failuresRecord the input and state that generate faults

Page 9: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Input Sources: File Formats

1. Identify all valid file formats (e.g. JPG, TIFF, PDF, DOC, XLS)

2. Collect a library of valid files3. Malform a file4. Cause the program to consume the file and

observe its execution for problems

Page 10: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Input Sources: Protocols

Create bogus messages (e.g. SMPT, TCP/IP, RPC, SOAP, HTTP)

Record-fuzz-replay1. Run a sniffer2. Collect a few thousand messages3. Fuzz the messages4. Replay the fuzzed messages

Page 11: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Dumb Fuzzing

Dumb fuzzing: Modify data randomly

Most input will be invalidMakes good error handling test casesTakes a long time to enumerate valid test casesMay test the validation logic of high-level protocols instead of the underlying application

Page 12: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Smart Fuzzing

Smart fuzzing: Aware of data structureAltering content sizeReplacing null-terminated stringsAltering numeric values or flipping signs0, 2^n +/- 1Adding invalid headers, altering header values, duplicating headers, …

Page 13: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Challenging Questions with Fuzzing

Microsoft SDL mandates that you run 100,000 iterations per file format/parser. If you find a bug, you reset to 0 and start running another 100,000 with a new seed.Why? Does this get you what you need?

How many input sources were missed? How much of the program was tested? How long did the tests take to run? How good were the tests?

Page 14: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Challenge: Nebulous File Formats / Protocols

No problem for a standard Web applicationWhat about proprietary interfaces?

Web Service APIsNetwork serversThick client software

Difficult to enumerate input sources to fuzzEven harder to generate valid input

Requires customizationTool must be tuned to specific input sources and formats

Page 15: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Challenge: Program Semantics / Reachability

Example: if (!strcmp(input1, “static_string”) { strcpy(buffer2, input2);

}Need to provide value of input1 equal to “static_string” and large value of input2Requires N*M random inputs to reach bug guarded by two-variable conditionsMay be hard to satisfy some conditionals Requires customization

Number of input values needed must be narrowed

Page 16: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Shallow Bugs versus Deep Bugs

Fuzzing focuses on shallow bugs

...

...

...

T Fif (y == 5) { gets(buf1); ...

if (x == 3) { gets(buf0); ...

if (z == 7) { gets(buf2); ...

T F

FT...

foo(int x, int y, int z) {if (x == 3) { //p = 1/232gets(buf0);

if (y == 5) { //p = p * 1/232gets(buf1);

if (z == 7) { //p = p * 1/232gets(buf2);

}}

}} # of random values of x, y and z to reach each state:

gets(buf0) = 4,294,967,296gets(buf1) = 18,446,744,073,709,551,616 gets(buf2) = 79,228,162,514,264,337,593,629,020,928

...

...

...

T Fif (y == 5) { gets(buf1); ...

if (x == 3) { gets(buf0); ...

if (z == 7) { gets(buf2); ...

T F

FT...

Page 17: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Runs Necessary to Reach State Z

Each conditional adds exponentially to the number of input permutations required to hit a bugRunning time for the fuzz tests increases accordingly

Page 18: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Example: Vulnerabilities by Conditional Depth

wu-ftpd 2.6.0–Buffer Overflow–extensions.c: strcpy(curptr->dirname, cwd); Conditional depth: 4 wu-ftpd 2.6.0–format string–ftpd.c: vsnprintf(buf + (n ? 4 : 0), n ? sizeof(buf)-4 : sizeof(buf), fmt, ap); Conditional depth: 3OFBiz 1.5–XSS–CommonEvents.java: out.println(responseString); Conditional depth: 4

Page 19: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Challenge: Difficult-to-Reach States

Airline booking system – overbooked flightDifficult for a fuzzer to induce

Example:if (flight.seatsAvailable() == 0) {

// echo user input to error page – XSS vulnerability...out.println(“Flight ”

+ request.getParameter(“flightNumber”)+ “ is overbooked. Please search again.”);

...}

Page 20: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Challenge: Identifying Errors

Error reporting conventions differGood design guidelines often require programs to mask errors and error details

Requires customizationBetter oracleBinary instrumentation …

Page 21: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Finding Bugs with Fuzzing

Easy: Shallow cross-site scripting vulnerability (shallowest bugs never leave the client à la JavaScript)

Hard: Many nested conditionals that checks for hard-to-reach states like the overbooked flight

Spectrum of ease of detection with fuzzing:

Page 22: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Fuzzing Summary

AdvantagesRequires least effort to find a bugVerifiable and reproducible at runtimeScalable to programs that use the same file format or protocol

DisadvantagesVery costly to achieve completenessIncreasing coverage increases runtime (sometimes exponentially)May miss bugs due to inadequate oracle

Page 23: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Prehistoric Static Analysis Tools

Flawfinder

ITS4

RATS

Page 24: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

(+) GoodHelp security experts audit codeRepository for known-bad coding practices

(-) BadNOT BUG FINDERSNot helpful without security expertise

Flawfinder

ITS4

RATS

Prehistoric Static Analysis Tools

Page 25: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Misconceptions Prevail

Fuzzing, Page 4:

Low priorityint main(int argc, char** argv) {

char buffer[10];strcpy(buf1, “test”);

}

High priorityint main(int argc, char** argv) {

char buffer[10];strcpy(buf1, argv[1]);

}

Page 26: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Static Analysis Is Good For Security

Fast compared to manual reviewFast compared to testingComplete, consistent coverageBrings security knowledge with itMakes security review process easier for non-expertsUseful for all kinds of code, not just Web applications

Page 27: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Static Analysis: No Silver Bullet

Human limitationsRequires access to codeUser must understand code

Tool limitationsDoes not understand architectureDoes not understand application semanticsDoes not understand social context

Page 28: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

A Peek Inside a Static Analysis Tool

ModelingRules

SecurityProperties

FrontEndsrc

SystemModel

Analyzer

Analyzer

Analyzer

ResultsViewer

Page 29: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Parsing

Language supportOne language/parser is straightforwardLots of combinations is harder

Could analyze compiled code…Everybody has the binaryNo need to guess how the compiler worksNo need for rules

…but Decompilation can be difficultLoss of context hurtsWant to report line numbers

Page 30: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Analysis / Rules: Structural

Identify bugs in the program's structure

Example: calls to gets()

Structural rule:FunctionCall: function is [name == "gets"]

Page 31: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Analysis / Rules: Structural

Identify bugs in the program's structure

Example: memory leaks caused by realloc() buf = realloc(buf, 256);

Structural rule:FunctionCall c1: (

c1.function is [name == "realloc"] andc1 in [AssignmentStatement: rhs is c1 and

lhs == c1.arguments[0]]

)

Page 32: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Analysis / Rules: Dataflow Source Rule

Following interesting values through the programExample: Command injection vulnerability

Source rule:Function: getInputFromNetwork()Postcondition: return value is tainted

= getInputFromNetwork();

copyBuffer( , );

exec( );

buff

buffnewBuff

newBuff

Page 33: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Analysis / Rules: Dataflow Pass-Through Rule

Following interesting values through the programExample: Command injection vulnerability

Pass-through rule:Function: copyBuffer()Postcondition: if the second argument is tainted, then the first argument becomes tainted

= getInputFromNetwork();

copyBuffer( , );

exec( );

buff

buffnewBuff

newBuff

Page 34: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Analysis / Rules: Dataflow Sink Rule

= getInputFromNetwork();

copyBuffer( , );

exec( );

buff

buffnewBuff

newBuff

Following interesting values through the programExample: Command injection vulnerability

Sink rule:Function: exec()Precondition: the first argument must not be tainted

Page 35: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Analysis / Rules: Control Flow

Look for dangerous sequencesExample: Double-free

free(x)

free(x)

initialstate

freed

error

start

(other operations)

(other operations)

while ((node = *ref) != NULL) {*ref = node->next;free(node);

if (!unchain(ref)) {break;

}

}if (node != 0) {free(node);

return UNCHAIN_FAIL;

}

Page 36: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Analysis / Rules: Control Flow

Look for dangerous sequencesExample: Double-free

free(x)

free(x)

initialstate

freed

error

start

(other operations)

(other operations)

while ((node = *ref) != NULL) {*ref = node->next;free(node);

if (!unchain(ref)) {break;

}

}if (node != 0) {free(node);

return UNCHAIN_FAIL;

}

Page 37: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Analysis / Rules: Control Flow

Look for dangerous sequencesExample: Double-free

free(x)

free(x)

initialstate

freed

error

start

(other operations)

(other operations)

while ((node = *ref) != NULL) {*ref = node->next;free(node);

if (!unchain(ref)) {break;

}

}if (node != 0) {free(node);

return UNCHAIN_FAIL;

}

Page 38: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Only Two Ways to Go Wrong

False positivesIncomplete/inaccurate modelConservative analysisMissing rules

False negativesIncomplete/inaccurate model“Forgiving” analysisMissing rules

The tool thatcried “wolf!” Missing a

detail can kill.

Developer Auditor

Page 39: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Untapped Potential: Customization

Improve tool understanding of the programModel the behavior of third-party librariesDescribe program semantics

Identify program-specific vulnerabilitiesCall out targets for manual review Enforce specific coding standardsFind vulnerabilities in custom interfaces

Page 40: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Scope vs. Performance

Page 41: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Experiment

Select project: open source mail daemonqwik-smtpd version .3Contains multiple known vulnerabilities

Select tools: fuzzing and static analysisFuzzing: @stake SMTP Fuzz 0.9.16

Customized for SMTP protocolStatic analysis: Fortify

The one we have sitting around

Collect data:Run fuzzing tool on SMTP protocolRun static analysis tool on C source code

Page 42: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

What We Found

Identified four remotely exploitable bugsTwo buffer overflows Two format string vulnerabilities

And numerous other locally exploitable vulnerabilities, including:

Buffer overflowsFormat string vulnerabilitiesCommand injectionMemory errorsResource leaks…

Page 43: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Results

Fuzzing found both remotely exploitable format string bugs, but missed both remotely exploitable buffer overflowsStatic analysis: Found all four vulnerabilities

Format String 1

Format String 2

Buffer Overflow 1

Buffer Overflow 2

Format String 1

Format String 2

Buffer Overflow 1

Buffer Overflow 2

Fuzzing Static Analysis

Page 44: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Conclusions

Fuzzing…Found exploitable vulnerabilities fastMissed critical bugs within its reachMissed vulnerabilities from non-SMTP sourcesWould miss bugs behind complex conditions (bugs hidden behind multiple header conditions)

Page 45: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Advantages of Fuzzing over Static Analysis

Less involvedDoes not require access to or understanding of code

Access to contextDoes not requires customization to understand program semantics and context

The last stepProduces a demonstrable exploit or test case without further human efforts

Page 46: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Advantages of Static Analysis Over Fuzzing

ThoroughnessConsiders every source of inputConsiders every path through the program

SpeedDoesn’t require running the codeCustomization has almost no impact on performance

VisibilityIdentifies vulnerabilities hidden by error handlingFinds vulnerabilities evidenced through that may be hidden

Page 47: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

Summary

Static analysis is spot-on for securityImportant attributes

Language supportAnalysis techniquesRule setPerformanceResults management

CustomizationDescribe program semanticsModel program context

Page 48: “How I Learned to Stop Fuzzing and Find More Bugs.” · How I Learned to Stop Fuzzing and Find More Bugs Jacob West Fortify Software August 3-5, 2007 ... Difficult to enumerate

<end>

PDF of talk will be available here:http://www.fortify.com/presentations

Send me email!Jacob West <[email protected]>

Secure Programming with Static Analysis