55
Browser Fuzzing with a Twist (and a Shake) Jeremy Brown, 2015

Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Embed Size (px)

Citation preview

Page 1: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Browser Fuzzing with a Twist (and a Shake)

Jeremy Brown, 2015

Page 2: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Agenda

I. IntroductionI. Target ArchitectureII. Infrastructure Notes

II. ShakeItI. Current ToolingII. InternalsIII. Incubation Results

III. Conclusion

Page 3: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

#whoami

• Jeremy Brown– Independent researcher / consultant– Formerly of Microsoft• Windows/Phone/Xbox Security• Malware Protection Center

– Also, Tenable• Nessus• RE patches

Page 4: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

What I’m not covering

• Comprehensive browser fundamentals– Just enough to get your feet wet

• Looking for bugs outside of rendering engines– There’s plenty of other attack surface, but this one

is really juicy & often no user interaction required• Sandbox escapes– This is needed post-compromise of renderer

Page 5: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015
Page 6: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

What I’m covering

• The fuzzing engine part of the puzzle– But ShakeIt is not a fuzzer, it is a mutator

• Working with grammar-based parsing engines– Not specific to browsers, but they’re a primary

target• Overall setup you need to do so effectively– But not claiming I fuzz as well as Ben Nagy– A lot of hard lessons learned

Page 7: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Why

• Share the research instead of just letting it sit on my box– Projects often fade away after incubation, but are

more valuable in collaboration• Not many talks detail the process and how the

engine actually works– Most engines are not rocket science– Fuzzing really has no rules, any method fair game

Page 8: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Attack Surface Overview

Page 9: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Credit:Chris Rolf / LeafSR (now Yahoo!)

http://blog.leafsr.com/2012/09/09/google-native-client-attack-surface-and-vulnerabilities-part-4/

Page 10: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Reference:“Inside Adobe Reader Protected Mode - Part 1 - Design” – Security @ Adobe

http://blogs.adobe.com/security/2010/10/inside-adobe-reader-protected-mode-part-1-design.html

Page 11: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Fuzzing Options

• Generation

Reference: http://www.peachfuzzer.com

Page 12: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Fuzzing Options

• Mutation– Zzuf is the canonical example here

Reference: http://caca.zoy.org/wiki/zzuf

Page 13: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Fuzzing Options

• Code-assisted (eg. sub-evolutionary)– American Fuzzy Lop

Reference: http://lcamtuf.coredump.cx/afl/

Page 14: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Fuzzing Options

Reference: http://lcamtuf.coredump.cx/afl/

Page 15: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Infrastructure

Page 16: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Pieces to the Puzzle

• A complete fuzzing framework has– Fuzzing Engine– System Harnesses– Scaling Infrastructure– Target-specific Support– Helpers

Page 17: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Pieces to the Puzzle

• Fuzzing Engine– Generator per specifications– Mutator based on particular algorithms– Instrumentation for code-assisted fuzzing

Page 18: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Pieces to the Puzzle

• Local System Harnesses– Debug harness to catch crashes– Filesystem monitor for interesting read/write– Dedicated and high performance database server• Or SSD for fast access to local sqlite db

Page 19: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Pieces to the Puzzle

• Scaling Infrastructure– High-performance machines with hypervisors– Clusters in a master/slave setup– An Army of Droids (eg. jduck)– Utilizing the online cloud providers

Page 20: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Pieces to the Puzzle

• Target-specific Support– File store for templates (eg. html, xml, pdf)• Client to add new templates / remove bad ones

• WinAppDbg– Great framework, very versatile– Provides a ton of options for instrumentation– Run into interesting issues sometimes, eg.

bottleneck with db server / attach memory errors

Page 21: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Pieces to the Puzzle

• Helpers– Pause/Restart support– Automatic repro / PoC generation– Data failure backup mechanisms– Minset support– Instrumentation / Code Coverage

Page 22: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Agenda

I. IntroductionI. Target ArchitectureII. Infrastructure Notes

II. ShakeItI. Current ToolingII. InternalsIII. Incubation Results

III. Conclusion

Page 23: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Current Tooling

• Cross_fuzz– Cross-document DOM binding fuzzer by lcamtuf– Similar concept to ShakeIt as it either selects or

reuses input fragments• Fuzzinator– Tokenizes a collection of input and builds new

tests from those

References:http://lcamtuf.coredump.cx/cross_fuzz/

http://browser.sed.hu/blog/20141023/fuzzinator-reloaded

Page 24: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Current Tooling

• Jsfunfuzz– JavaScript fuzzer from Jesse Ruderman– Uses generational method to create interesting JS

• LangFuzz– Grammar-based fuzzer by Mozilla / Saarland Uni– Utilizes the ANTLR suite for parsing– Like Cross_fuzz, it can reuse input fragments

References: https://github.com/MozillaSecurity/funfuzz/blob/master/js/jsfunfuzz/README.md

https://www.st.cs.uni-saarland.de/publications/files/holler-usenix-2012.pdf

Page 25: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Deviations from ShakeIt

• Dictionary– Defining a dictionary of valid tokens and replacing

them with either randomly generated or oracle input

• Nesting– Duplicating or multiplying tokens to create nesting

in random or strategic locations

Page 26: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

ShakeIt Algorithm

Page 27: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

High-level Diagram

Page 28: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

How it works

• Collection of tokens or “changeables”– Data– Position

• Switch the data a random positions• Fix it all back up and generate new test case• Idea is simple, but implementation is more

complex

Page 29: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Process

• Step 1– Feed it templates (HTML, XML, JS, PDF + JS, etc)– Can handle simple or complex input

Page 30: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Implementation Details

• Consume template– Modes for HTML/JS or PDF/JS

• Call Shake.It– It calls Token.Find to find all the tokens– We need at least (2) to perform mutation– Token.Find uses extensive set of regex’s

Page 31: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Implementation Details

• Token.Match successful, save it and continue• Once complete, Shake.Shuffle all the tokens– Iterate from the end, choosing random index and

removing items from the pool until exhaustion

Page 32: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Implementation Details

• After Shuffle, now build out the mutation– Find each shuffled position, insert new data and

append all other template content appropriately

Page 33: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Implementation Details

• Write to output and repeat n iterations!– We use .NET threads to utilize computing power– SHA1 for *unique filenames

• * We don’t care about collisions here

Page 34: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Example Template

Page 35: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015
Page 36: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Fuzzing Strategy

• Tries to “confuse” the rendering engine• Mixes types, parameters, values, objects• Tries to put the browser in a weird state and

force it to make bad decisions– “Shaking the memory corruption tree”

Page 37: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Mutated Examples

Page 38: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015
Page 39: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015
Page 40: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015
Page 41: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Process

• Step 2– Store mutated collection on file or web server– Make it accessible to a browser

Page 42: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Process

• Step 3– Setup target with harness, iterate over collection– Store results in database for sorting, repros on

network share for debugging promising crashes

Page 43: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Implementation

• Written in C#– Algorithm is portable though

• Available after this talk

Page 44: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Incubation

Page 45: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Incubation Results

• Interesting Chrome/Opera crashes– Sadly hard to save repros per infrastructure issues– Could not determine if crashes can from render

bugs or attach/synchronization issues

Page 46: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Incubation Results

• Multiple crashes in WebKit/GTK+– Only 2 / 4 repro’d– Suspected invalid access on garbage collection

Page 47: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Incubation Results

• Unremarkable crash in KHTML– Continuous memory allocations and copies

Page 48: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Incubation Results

• Likely exploitable memory corruption bug in Netsurf (popular embedded device browser)– Corruption of internal structure pointer– Triggered by mutated tag property

Page 49: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Incubation Results

• Interesting crash in Phonon (VLC @ web)– Triggered by parsing multimedia content / tags

Page 50: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Challenges / Lessons Learned

• Comprehensive fuzzing harnesses enable a smooth process

• Without a complete system, it’s tough to be successful– Bandwidth, resources or tooling are bottlenecks

Page 51: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Agenda

I. IntroductionI. Target ArchitectureII. Infrastructure Notes

II. ShakeItI. Current ToolingII. InternalsIII. Incubation Results

III. Conclusion

Page 52: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Future Work

• Enable ShakeIt in scalable environment OR• Port it to existing fuzzing frameworks– Joxean’s Nightmare Fuzzer– <insert your custom fuzzing framework @ home>– Perhaps even a Metasploit auxiliary module

Page 53: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Conclusion

• Fuzzing is more than a mutation engine– Strategy and infrastructure matter too

• Investment in tooling is paramount– But don’t micro-manage ROI!

• More complexity == more fuzzing bugs– Code review for complex operations is expensive– Manually pen-testing is great for logic bugs– Does anyone seeing software becoming simpler?

Page 54: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

Conclusion

• Sandboxes cannot save you from bugs– You just need +1 more bug

• SDL cannot save you from bugs– Too much old code, too much new code, not

enough eyes or interested people to throw at it• Mitigations cannot save you from bugs– They only make them +n days harder to exploit

• Managed code is a positive step forward

Page 55: Browser Fuzzing with a Twist (and a Shake) -- ZeroNights 2015

The End

Questions?