· author: daniel teuchert created date: 2/26/2019 4:37:45 pm

73
Fishing for Deep Bugs with Grammars Daniel Teuchert

Upload: others

Post on 16-May-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Fishing for Deep Bugs with Grammars

Daniel Teuchert

Page 2:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Fuzzing

1

...

0

... 0

...

1

...

Daniel Teuchert

Page 3:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Fuzzing1

...

0

... 0

...

1

...

Daniel Teuchert

Page 4:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Fuzzing1

...

0

... 0

...

1

...

Daniel Teuchert

Page 5:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Fuzzing1

...

0

... 0

...

1

...

Daniel Teuchert

Page 6:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Fuzzing

1

...

0

... 0

...

1

...

Daniel Teuchert

Page 7:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Fuzzing1

...

0

... 0

...

1

...

Daniel Teuchert

Page 8:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL

0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 9:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 10:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 11:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL

0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 12:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 13:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 14:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 15:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 16:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 17:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 18:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 19:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 20:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 21:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 22:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 23:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 24:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 25:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

AFL0

...

1

...

0

...

1

...0

...

1

...

0

...

1

...

0

...

1

...

0

...

1

...

Daniel Teuchert

Page 26:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

if !input.parse() { exit()}

if !input.check() { exit()}

do_stuff()

Daniel Teuchert

Page 27:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

if !input.parse() { exit()}

if !input.check() { exit()}

do_stuff()

Daniel Teuchert

Page 28:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

if !input.parse() { exit()}

if !input.check() { exit()}

do_stuff()

Daniel Teuchert

Page 29:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

if !input.parse() { exit()}

if !input.check() { exit()}

do_stuff()

Daniel Teuchert

Page 30:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

if !input.parse() { exit()}

if !input.check() { exit()}

do_stuff()

Daniel Teuchert

Page 31:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Grammars +

Feedback

Context-Free GrammarsPROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

PROG

STMT

VAR

a

= EXPR

NUM

1

"a=1"

Daniel Teuchert

Page 32:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Grammars +

Feedback

Context-Free Grammars

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

PROG

STMT

VAR

a

= EXPR

NUM

1

"a=1"

Daniel Teuchert

Page 33:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Grammars +

Feedback

Context-Free GrammarsPROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

PROG

STMT

VAR

a

= EXPR

NUM

1

"a=1"

Daniel Teuchert

Page 34:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Grammars +

Feedback

Context-Free GrammarsPROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

PROG

STMT

VAR

a

= EXPR

NUM

1

"a=1"

Daniel Teuchert

Page 35:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Grammars +

Feedback

Context-Free GrammarsPROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

PROG

STMT

VAR

a

= EXPR

NUM

1

"a=1"

Daniel Teuchert

Page 36:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Grammars +

Feedback

Context-Free GrammarsPROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

PROG

STMT

VAR

a

= EXPR

NUM

1

"a=1"

Daniel Teuchert

Page 37:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 38:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 39:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 40:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 41:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 42:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 43:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 44:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 45:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 46:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 47:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 48:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 49:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 50:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 51:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 52:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 53:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 54:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 55:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 56:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 57:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 58:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Design of Nautilus

InstrumentedBinary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queue

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Genera�on:

-Naive Genera�on

PROG → STMTPROG → STMT ; PROGSTMT → return 1STMT → VAR = EXPR

VAR → aEXPR →EXPR → EXPR + EXPR

→ 1 | 2

-Uniform Genera�on

Minimiza�on:

-Subtree Minimiza�on

PROG

STMT

VAR

a

= EXPR

NUM

1

PROG

STMT

Subtree Minimiza�on

return 1

-Recursion Minimiza�on

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

NUM

1

Recursive Minimiza�on

Muta�on:

-Random

-Rules

-Random Recursive

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

EXPR

NUM

1

+ EXPR

NUM

2

Random Recursive Mutation

-Splicing

-AFL

PROG

STMT

VAR

a

= EXPR

EXPR

NUM

1

+ EXPR

NUM

2

PROG

STMT

VAR

a

= EXPR

1xf

AFL Mutation

Daniel Teuchert

Page 59:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Evaluation

Targets:

-mruby-PHP-lua-ChackraCore

Baseline AFL IFuzzer Nautilus15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

35.0%

ChakraCore

Baseline AFL Nautilus25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline AFL Nautilus2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline AFL Nautilus40.0%

45.0%

50.0%

55.0%

60.0%

65.0%

70.0%Lua

vs. AFL / IFuzzer

Baseline No feedback Naive gen Uniform gen15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

ChakraCore

Baseline No feedback Naive gen Uniform gen25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline No feedback Naive gen Uniform gen2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline No feedback Naive gen Uniform gen40.0%

45.0%

50.0%

55.0%

60.0%

Lua

Configurations

0 %

25 %

50 %

75 %

100 %

03m 6m 9m 12m

15m

20m

26m

33m

42m

51m 1h

1h 1

5m1h

30m

1h 4

5m 2h2h

15m

2h 3

0m2h

45m 3h

3h 3

0m 4h4h

30m 5h

5h 3

0m 6h 7h 8h 9h 10h

11h

12h

13h

14h

15h

16h

17h

18h

19h

20h

21h

22h

23h

GenerationSubtree Min.Recursion Min.Rules MutationAFL MutationSplicing MutationRandom MutationRandom Rec. Mut.

ObjectSpace.each do |a| begin a.method(...) rescue end end

Bugs?mruby:CVE-2018-10191: UAFCVE-2018-10199: UAFCVE-2018-11743: Use of Uninitialized PointerCVE-2018-12249: SEGVCVE-2018-12247: SEGVCVE-2018-12248: Heap Buffer OverflowStack Overflow

PHP:Division by ZeroSEGVStack Overflow

lua:UAF

ChakraCore:OOM Crash

Daniel Teuchert

Page 60:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Evaluation

Targets:

-mruby-PHP-lua-ChackraCore

Baseline AFL IFuzzer Nautilus15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

35.0%

ChakraCore

Baseline AFL Nautilus25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline AFL Nautilus2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline AFL Nautilus40.0%

45.0%

50.0%

55.0%

60.0%

65.0%

70.0%Lua

vs. AFL / IFuzzer

Baseline No feedback Naive gen Uniform gen15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

ChakraCore

Baseline No feedback Naive gen Uniform gen25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline No feedback Naive gen Uniform gen2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline No feedback Naive gen Uniform gen40.0%

45.0%

50.0%

55.0%

60.0%

Lua

Configurations

0 %

25 %

50 %

75 %

100 %

03m 6m 9m 12m

15m

20m

26m

33m

42m

51m 1h

1h 1

5m1h

30m

1h 4

5m 2h2h

15m

2h 3

0m2h

45m 3h

3h 3

0m 4h4h

30m 5h

5h 3

0m 6h 7h 8h 9h 10h

11h

12h

13h

14h

15h

16h

17h

18h

19h

20h

21h

22h

23h

GenerationSubtree Min.Recursion Min.Rules MutationAFL MutationSplicing MutationRandom MutationRandom Rec. Mut.

ObjectSpace.each do |a| begin a.method(...) rescue end end

Bugs?mruby:CVE-2018-10191: UAFCVE-2018-10199: UAFCVE-2018-11743: Use of Uninitialized PointerCVE-2018-12249: SEGVCVE-2018-12247: SEGVCVE-2018-12248: Heap Buffer OverflowStack Overflow

PHP:Division by ZeroSEGVStack Overflow

lua:UAF

ChakraCore:OOM Crash

Daniel Teuchert

Page 61:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

EvaluationTargets:

-mruby-PHP-lua-ChackraCore

Baseline AFL IFuzzer Nautilus15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

35.0%

ChakraCore

Baseline AFL Nautilus25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline AFL Nautilus2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline AFL Nautilus40.0%

45.0%

50.0%

55.0%

60.0%

65.0%

70.0%Lua

vs. AFL / IFuzzer

Baseline No feedback Naive gen Uniform gen15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

ChakraCore

Baseline No feedback Naive gen Uniform gen25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline No feedback Naive gen Uniform gen2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline No feedback Naive gen Uniform gen40.0%

45.0%

50.0%

55.0%

60.0%

Lua

Configurations

0 %

25 %

50 %

75 %

100 %

03m 6m 9m 12m

15m

20m

26m

33m

42m

51m 1h

1h 1

5m1h

30m

1h 4

5m 2h2h

15m

2h 3

0m2h

45m 3h

3h 3

0m 4h4h

30m 5h

5h 3

0m 6h 7h 8h 9h 10h

11h

12h

13h

14h

15h

16h

17h

18h

19h

20h

21h

22h

23h

GenerationSubtree Min.Recursion Min.Rules MutationAFL MutationSplicing MutationRandom MutationRandom Rec. Mut.

ObjectSpace.each do |a| begin a.method(...) rescue end end

Bugs?mruby:CVE-2018-10191: UAFCVE-2018-10199: UAFCVE-2018-11743: Use of Uninitialized PointerCVE-2018-12249: SEGVCVE-2018-12247: SEGVCVE-2018-12248: Heap Buffer OverflowStack Overflow

PHP:Division by ZeroSEGVStack Overflow

lua:UAF

ChakraCore:OOM Crash

Daniel Teuchert

Page 62:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

EvaluationTargets:

-mruby-PHP-lua-ChackraCore

Baseline AFL IFuzzer Nautilus15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

35.0%

ChakraCore

Baseline AFL Nautilus25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline AFL Nautilus2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline AFL Nautilus40.0%

45.0%

50.0%

55.0%

60.0%

65.0%

70.0%Lua

vs. AFL / IFuzzer

Baseline No feedback Naive gen Uniform gen15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

ChakraCore

Baseline No feedback Naive gen Uniform gen25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline No feedback Naive gen Uniform gen2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline No feedback Naive gen Uniform gen40.0%

45.0%

50.0%

55.0%

60.0%

Lua

Configurations

0 %

25 %

50 %

75 %

100 %

03m 6m 9m 12m

15m

20m

26m

33m

42m

51m 1h

1h 1

5m1h

30m

1h 4

5m 2h2h

15m

2h 3

0m2h

45m 3h

3h 3

0m 4h4h

30m 5h

5h 3

0m 6h 7h 8h 9h 10h

11h

12h

13h

14h

15h

16h

17h

18h

19h

20h

21h

22h

23h

GenerationSubtree Min.Recursion Min.Rules MutationAFL MutationSplicing MutationRandom MutationRandom Rec. Mut.

ObjectSpace.each do |a| begin a.method(...) rescue end end

Bugs?mruby:CVE-2018-10191: UAFCVE-2018-10199: UAFCVE-2018-11743: Use of Uninitialized PointerCVE-2018-12249: SEGVCVE-2018-12247: SEGVCVE-2018-12248: Heap Buffer OverflowStack Overflow

PHP:Division by ZeroSEGVStack Overflow

lua:UAF

ChakraCore:OOM Crash

Daniel Teuchert

Page 63:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

EvaluationTargets:

-mruby-PHP-lua-ChackraCore

Baseline AFL IFuzzer Nautilus15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

35.0%

ChakraCore

Baseline AFL Nautilus25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline AFL Nautilus2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline AFL Nautilus40.0%

45.0%

50.0%

55.0%

60.0%

65.0%

70.0%Lua

vs. AFL / IFuzzer

Baseline No feedback Naive gen Uniform gen15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

ChakraCore

Baseline No feedback Naive gen Uniform gen25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline No feedback Naive gen Uniform gen2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline No feedback Naive gen Uniform gen40.0%

45.0%

50.0%

55.0%

60.0%

Lua

Configurations

0 %

25 %

50 %

75 %

100 %

03m 6m 9m 12m

15m

20m

26m

33m

42m

51m 1h

1h 1

5m1h

30m

1h 4

5m 2h2h

15m

2h 3

0m2h

45m 3h

3h 3

0m 4h4h

30m 5h

5h 3

0m 6h 7h 8h 9h 10h

11h

12h

13h

14h

15h

16h

17h

18h

19h

20h

21h

22h

23h

GenerationSubtree Min.Recursion Min.Rules MutationAFL MutationSplicing MutationRandom MutationRandom Rec. Mut.

ObjectSpace.each do |a| begin a.method(...) rescue end end

Bugs?mruby:CVE-2018-10191: UAFCVE-2018-10199: UAFCVE-2018-11743: Use of Uninitialized PointerCVE-2018-12249: SEGVCVE-2018-12247: SEGVCVE-2018-12248: Heap Buffer OverflowStack Overflow

PHP:Division by ZeroSEGVStack Overflow

lua:UAF

ChakraCore:OOM Crash

Daniel Teuchert

Page 64:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

EvaluationTargets:

-mruby-PHP-lua-ChackraCore

Baseline AFL IFuzzer Nautilus15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

35.0%

ChakraCore

Baseline AFL Nautilus25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline AFL Nautilus2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline AFL Nautilus40.0%

45.0%

50.0%

55.0%

60.0%

65.0%

70.0%Lua

vs. AFL / IFuzzer

Baseline No feedback Naive gen Uniform gen15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

ChakraCore

Baseline No feedback Naive gen Uniform gen25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline No feedback Naive gen Uniform gen2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline No feedback Naive gen Uniform gen40.0%

45.0%

50.0%

55.0%

60.0%

Lua

Configurations

0 %

25 %

50 %

75 %

100 %

03m 6m 9m 12m

15m

20m

26m

33m

42m

51m 1h

1h 1

5m1h

30m

1h 4

5m 2h2h

15m

2h 3

0m2h

45m 3h

3h 3

0m 4h4h

30m 5h

5h 3

0m 6h 7h 8h 9h 10h

11h

12h

13h

14h

15h

16h

17h

18h

19h

20h

21h

22h

23h

GenerationSubtree Min.Recursion Min.Rules MutationAFL MutationSplicing MutationRandom MutationRandom Rec. Mut.

ObjectSpace.each do |a| begin a.method(...) rescue end end

Bugs?mruby:CVE-2018-10191: UAFCVE-2018-10199: UAFCVE-2018-11743: Use of Uninitialized PointerCVE-2018-12249: SEGVCVE-2018-12247: SEGVCVE-2018-12248: Heap Buffer OverflowStack Overflow

PHP:Division by ZeroSEGVStack Overflow

lua:UAF

ChakraCore:OOM Crash

Daniel Teuchert

Page 65:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

EvaluationTargets:

-mruby-PHP-lua-ChackraCore

Baseline AFL IFuzzer Nautilus15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

35.0%

ChakraCore

Baseline AFL Nautilus25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline AFL Nautilus2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline AFL Nautilus40.0%

45.0%

50.0%

55.0%

60.0%

65.0%

70.0%Lua

vs. AFL / IFuzzer

Baseline No feedback Naive gen Uniform gen15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

ChakraCore

Baseline No feedback Naive gen Uniform gen25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline No feedback Naive gen Uniform gen2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline No feedback Naive gen Uniform gen40.0%

45.0%

50.0%

55.0%

60.0%

Lua

Configurations

0 %

25 %

50 %

75 %

100 %

03m 6m 9m 12m

15m

20m

26m

33m

42m

51m 1h

1h 1

5m1h

30m

1h 4

5m 2h2h

15m

2h 3

0m2h

45m 3h

3h 3

0m 4h4h

30m 5h

5h 3

0m 6h 7h 8h 9h 10h

11h

12h

13h

14h

15h

16h

17h

18h

19h

20h

21h

22h

23h

GenerationSubtree Min.Recursion Min.Rules MutationAFL MutationSplicing MutationRandom MutationRandom Rec. Mut.

ObjectSpace.each do |a| begin a.method(...) rescue end end

Bugs?

mruby:CVE-2018-10191: UAFCVE-2018-10199: UAFCVE-2018-11743: Use of Uninitialized PointerCVE-2018-12249: SEGVCVE-2018-12247: SEGVCVE-2018-12248: Heap Buffer OverflowStack Overflow

PHP:Division by ZeroSEGVStack Overflow

lua:UAF

ChakraCore:OOM Crash

Daniel Teuchert

Page 66:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

EvaluationTargets:

-mruby-PHP-lua-ChackraCore

Baseline AFL IFuzzer Nautilus15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

35.0%

ChakraCore

Baseline AFL Nautilus25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline AFL Nautilus2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline AFL Nautilus40.0%

45.0%

50.0%

55.0%

60.0%

65.0%

70.0%Lua

vs. AFL / IFuzzer

Baseline No feedback Naive gen Uniform gen15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

ChakraCore

Baseline No feedback Naive gen Uniform gen25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline No feedback Naive gen Uniform gen2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline No feedback Naive gen Uniform gen40.0%

45.0%

50.0%

55.0%

60.0%

Lua

Configurations

0 %

25 %

50 %

75 %

100 %

03m 6m 9m 12m

15m

20m

26m

33m

42m

51m 1h

1h 1

5m1h

30m

1h 4

5m 2h2h

15m

2h 3

0m2h

45m 3h

3h 3

0m 4h4h

30m 5h

5h 3

0m 6h 7h 8h 9h 10h

11h

12h

13h

14h

15h

16h

17h

18h

19h

20h

21h

22h

23h

GenerationSubtree Min.Recursion Min.Rules MutationAFL MutationSplicing MutationRandom MutationRandom Rec. Mut.

ObjectSpace.each do |a| begin a.method(...) rescue end end

Bugs?

mruby:CVE-2018-10191: UAFCVE-2018-10199: UAFCVE-2018-11743: Use of Uninitialized PointerCVE-2018-12249: SEGVCVE-2018-12247: SEGVCVE-2018-12248: Heap Buffer OverflowStack Overflow

PHP:Division by ZeroSEGVStack Overflow

lua:UAF

ChakraCore:OOM Crash

Daniel Teuchert

Page 67:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

EvaluationTargets:

-mruby-PHP-lua-ChackraCore

Baseline AFL IFuzzer Nautilus15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

35.0%

ChakraCore

Baseline AFL Nautilus25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline AFL Nautilus2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline AFL Nautilus40.0%

45.0%

50.0%

55.0%

60.0%

65.0%

70.0%Lua

vs. AFL / IFuzzer

Baseline No feedback Naive gen Uniform gen15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

ChakraCore

Baseline No feedback Naive gen Uniform gen25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline No feedback Naive gen Uniform gen2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline No feedback Naive gen Uniform gen40.0%

45.0%

50.0%

55.0%

60.0%

Lua

Configurations

0 %

25 %

50 %

75 %

100 %

03m 6m 9m 12m

15m

20m

26m

33m

42m

51m 1h

1h 1

5m1h

30m

1h 4

5m 2h2h

15m

2h 3

0m2h

45m 3h

3h 3

0m 4h4h

30m 5h

5h 3

0m 6h 7h 8h 9h 10h

11h

12h

13h

14h

15h

16h

17h

18h

19h

20h

21h

22h

23h

GenerationSubtree Min.Recursion Min.Rules MutationAFL MutationSplicing MutationRandom MutationRandom Rec. Mut.

ObjectSpace.each do |a| begin a.method(...) rescue end end

Bugs?mruby:CVE-2018-10191: UAFCVE-2018-10199: UAFCVE-2018-11743: Use of Uninitialized PointerCVE-2018-12249: SEGVCVE-2018-12247: SEGVCVE-2018-12248: Heap Buffer OverflowStack Overflow

PHP:Division by ZeroSEGVStack Overflow

lua:UAF

ChakraCore:OOM Crash

Daniel Teuchert

Page 68:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

EvaluationTargets:

-mruby-PHP-lua-ChackraCore

Baseline AFL IFuzzer Nautilus15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

35.0%

ChakraCore

Baseline AFL Nautilus25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline AFL Nautilus2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline AFL Nautilus40.0%

45.0%

50.0%

55.0%

60.0%

65.0%

70.0%Lua

vs. AFL / IFuzzer

Baseline No feedback Naive gen Uniform gen15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

ChakraCore

Baseline No feedback Naive gen Uniform gen25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline No feedback Naive gen Uniform gen2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline No feedback Naive gen Uniform gen40.0%

45.0%

50.0%

55.0%

60.0%

Lua

Configurations

0 %

25 %

50 %

75 %

100 %

03m 6m 9m 12m

15m

20m

26m

33m

42m

51m 1h

1h 1

5m1h

30m

1h 4

5m 2h2h

15m

2h 3

0m2h

45m 3h

3h 3

0m 4h4h

30m 5h

5h 3

0m 6h 7h 8h 9h 10h

11h

12h

13h

14h

15h

16h

17h

18h

19h

20h

21h

22h

23h

GenerationSubtree Min.Recursion Min.Rules MutationAFL MutationSplicing MutationRandom MutationRandom Rec. Mut.

ObjectSpace.each do |a| begin a.method(...) rescue end end

Bugs?mruby:CVE-2018-10191: UAFCVE-2018-10199: UAFCVE-2018-11743: Use of Uninitialized PointerCVE-2018-12249: SEGVCVE-2018-12247: SEGVCVE-2018-12248: Heap Buffer OverflowStack Overflow

PHP:Division by ZeroSEGVStack Overflow

lua:UAF

ChakraCore:OOM Crash

Daniel Teuchert

Page 69:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

EvaluationTargets:

-mruby-PHP-lua-ChackraCore

Baseline AFL IFuzzer Nautilus15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

35.0%

ChakraCore

Baseline AFL Nautilus25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline AFL Nautilus2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline AFL Nautilus40.0%

45.0%

50.0%

55.0%

60.0%

65.0%

70.0%Lua

vs. AFL / IFuzzer

Baseline No feedback Naive gen Uniform gen15.0%

17.5%

20.0%

22.5%

25.0%

27.5%

30.0%

32.5%

ChakraCore

Baseline No feedback Naive gen Uniform gen25.0%

30.0%

35.0%

40.0%

45.0%

50.0%

55.0%

mruby

Baseline No feedback Naive gen Uniform gen2.0%

4.0%

6.0%

8.0%

10.0%

12.0%

14.0%

PHP

Baseline No feedback Naive gen Uniform gen40.0%

45.0%

50.0%

55.0%

60.0%

Lua

Configurations

0 %

25 %

50 %

75 %

100 %

03m 6m 9m 12m

15m

20m

26m

33m

42m

51m 1h

1h 1

5m1h

30m

1h 4

5m 2h2h

15m

2h 3

0m2h

45m 3h

3h 3

0m 4h4h

30m 5h

5h 3

0m 6h 7h 8h 9h 10h

11h

12h

13h

14h

15h

16h

17h

18h

19h

20h

21h

22h

23h

GenerationSubtree Min.Recursion Min.Rules MutationAFL MutationSplicing MutationRandom MutationRandom Rec. Mut.

ObjectSpace.each do |a| begin a.method(...) rescue end end

Bugs?mruby:CVE-2018-10191: UAFCVE-2018-10199: UAFCVE-2018-11743: Use of Uninitialized PointerCVE-2018-12249: SEGVCVE-2018-12247: SEGVCVE-2018-12248: Heap Buffer OverflowStack Overflow

PHP:Division by ZeroSEGVStack Overflow

lua:UAF

ChakraCore:OOM Crash

Daniel Teuchert

Page 70:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Conclusion

- Grammars & Feedback ++

- Splicing is important!

Daniel Teuchert

Page 71:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Conclusion

- Grammars & Feedback ++

- Splicing is important!

Daniel Teuchert

Page 72:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

Conclusion

- Grammars & Feedback ++

- Splicing is important!

Daniel Teuchert

Page 73:  · Author: Daniel Teuchert Created Date: 2/26/2019 4:37:45 PM

OverviewGeneration

Minimization

MutationsInstrumented

Binary

Parser

InputGeneration

Minimization

Mutation

Scheduler

Queu

e

trigger

trigger

Grammar

𝑆 → 𝑥𝐴 | 𝑦𝑆𝐴 → 𝑦𝐴 | 𝑧𝐵𝐵 → 𝑧

Feedback

NAUTILUS

InstrumentationSource

Daniel Teuchert