{ "cells": [ { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "# When To Stop Fuzzing\n", "\n", "In the past chapters, we have discussed several fuzzing techniques. Knowing _what_ to do is important, but it is also important to know when to _stop_ doing things. In this chapter, we will learn when to _stop fuzzing_ – and use a prominent example for this purpose: The *Enigma* machine that was used in the second world war by the navy of Nazi Germany to encrypt communications, and how Alan Turing and I.J. Good used _fuzzing techniques_ to crack ciphers for the Naval Enigma machine.\n", "\n", "Turing did not only develop the foundations of computer science, the Turing machine. Together with his assistant I.J. Good, he also invented estimators of the probability of an event occurring that has never previously occurred. We show how the Good-Turing estimator can be used to quantify the *residual risk* of a fuzzing campaign that finds no vulnerabilities. Meaning, we show how it estimates the probability of discovering a vulnerability when no vulnerability has been observed before throughout the fuzzing campaign.\n", "\n", "We discuss means to speed up [coverage-based fuzzers](Coverage.ipynb) and introduce a range of estimation and extrapolation methodologies to assess and extrapolate fuzzing progress and residual risk." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:56.872555Z", "iopub.status.busy": "2024-01-18T17:29:56.872354Z", "iopub.status.idle": "2024-01-18T17:29:56.909669Z", "shell.execute_reply": "2024-01-18T17:29:56.909333Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from bookutils import YouTubeVideo\n", "YouTubeVideo('od3DcJcr0d4')" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "**Prerequisites**\n", "\n", "* _The chapter on [Coverage](Coverage.ipynb) discusses how to use coverage information for an executed test input to guide a coverage-based mutational greybox fuzzer_.\n", "* Some knowledge of statistics is helpful." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:56.931991Z", "iopub.status.busy": "2024-01-18T17:29:56.931749Z", "iopub.status.idle": "2024-01-18T17:29:56.934059Z", "shell.execute_reply": "2024-01-18T17:29:56.933789Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import bookutils.setup" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:56.935636Z", "iopub.status.busy": "2024-01-18T17:29:56.935519Z", "iopub.status.idle": "2024-01-18T17:29:56.937118Z", "shell.execute_reply": "2024-01-18T17:29:56.936874Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from typing import Dict, List" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": true, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "## The Enigma Machine\n", "\n", "It is autumn in the year of 1938. Turing has just finished his PhD at Princeton University demonstrating the limits of computation and laying the foundation for the theory of computer science. Nazi Germany is rearming. It has reoccupied the Rhineland and annexed Austria against the Treaty of Versailles. It has just annexed the Sudetenland in Czechoslovakia and begins preparations to take over the rest of Czechoslovakia despite an agreement just signed in Munich.\n", "\n", "Meanwhile, the British intelligence is building up their capability to break encrypted messages used by the Germans to communicate military and naval information. The Germans are using [Enigma machines](https://en.wikipedia.org/wiki/Enigma_machine) for encryption. Enigma machines use a series of electromechanical rotor cipher machines to protect military communication. Here is a picture of an Enigma machine:" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "![Enigma Machine](PICS/Bletchley_Park_Naval_Enigma_IMG_3604.JPG)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": true, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "By the time Turing joined the British Bletchley park, the Polish intelligence reverse engineered the logical structure of the Enigma machine and built a decryption machine called *Bomba* (perhaps because of the ticking noise they made). A bomba simulates six Enigma machines simultaneously and tries different decryption keys until the code is broken. The Polish bomba might have been the very _first fuzzer_." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": true, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "Turing took it upon himself to crack ciphers of the Naval Enigma machine, which were notoriously hard to crack. The Naval Enigma used, as part of its encryption key, a three letter sequence called *trigram*. These trigrams were selected from a book, called *Kenngruppenbuch*, which contained all trigrams in a random order." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": true, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "### The Kenngruppenbuch\n", "\n", "Let's start with the Kenngruppenbuch (K-Book).\n", "\n", "We are going to use the following Python functions.\n", "* `random.shuffle(elements)` - shuffle *elements* and put items in random order.\n", "* `random.choices(elements, weights)` - choose an item from *elements* at random. An element with twice the *weight* is twice as likely to be chosen.\n", "* `log(a)` - returns the natural logarithm of a.\n", "* `a ** b` - means `a` to the power of `b` (a.k.a. [power operator](https://docs.python.org/3/reference/expressions.html#the-power-operator))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:56.939088Z", "iopub.status.busy": "2024-01-18T17:29:56.938899Z", "iopub.status.idle": "2024-01-18T17:29:56.940996Z", "shell.execute_reply": "2024-01-18T17:29:56.940673Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import string" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:56.942748Z", "iopub.status.busy": "2024-01-18T17:29:56.942636Z", "iopub.status.idle": "2024-01-18T17:29:57.041335Z", "shell.execute_reply": "2024-01-18T17:29:57.039981Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import numpy\n", "from numpy import log" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.049382Z", "iopub.status.busy": "2024-01-18T17:29:57.048921Z", "iopub.status.idle": "2024-01-18T17:29:57.053870Z", "shell.execute_reply": "2024-01-18T17:29:57.052947Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import random" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We start with creating the set of trigrams:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.058415Z", "iopub.status.busy": "2024-01-18T17:29:57.058198Z", "iopub.status.idle": "2024-01-18T17:29:57.065296Z", "shell.execute_reply": "2024-01-18T17:29:57.064398Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "letters = list(string.ascii_letters[26:]) # upper-case characters\n", "trigrams = [str(a + b + c) for a in letters for b in letters for c in letters]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.071375Z", "iopub.status.busy": "2024-01-18T17:29:57.070640Z", "iopub.status.idle": "2024-01-18T17:29:57.080532Z", "shell.execute_reply": "2024-01-18T17:29:57.079667Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "random.shuffle(trigrams)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.088159Z", "iopub.status.busy": "2024-01-18T17:29:57.088007Z", "iopub.status.idle": "2024-01-18T17:29:57.093075Z", "shell.execute_reply": "2024-01-18T17:29:57.092094Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "['TJK', 'NWV', 'LBM', 'AZC', 'GZP', 'ADE', 'DNO', 'OQL', 'FGK', 'IPT']" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "trigrams[:10]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "These now go into the Kenngruppenbuch. However, it was observed that some trigrams were more likely chosen than others. For instance, trigrams at the top-left corner of any page, or trigrams on the first or last few pages were more likely than one somewhere in the middle of the book or page. We reflect this difference in distribution by assigning a _probability_ to each trigram, using Benford's law as introduced in [Probabilistic Fuzzing](ProbabilisticGrammarFuzzer.ipynb)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Recall, that Benford's law assigns the $i$-th digit the probability $\\log_{10}\\left(1 + \\frac{1}{i}\\right)$ where the base 10 is chosen because there are 10 digits $i\\in [0,9]$. However, Benford's law works for an arbitrary number of \"digits\". Hence, we assign the $i$-th trigram the probability $\\log_b\\left(1 + \\frac{1}{i}\\right)$ where the base $b$ is the number of all possible trigrams $b=26^3$. " ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.103767Z", "iopub.status.busy": "2024-01-18T17:29:57.103150Z", "iopub.status.idle": "2024-01-18T17:29:57.157816Z", "shell.execute_reply": "2024-01-18T17:29:57.147627Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "k_book = {} # Kenngruppenbuch\n", "\n", "for i in range(1, len(trigrams) + 1):\n", " trigram = trigrams[i - 1]\n", " # choose weights according to Benford's law\n", " k_book[trigram] = log(1 + 1 / i) / log(26**3 + 1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Here's a random trigram from the Kenngruppenbuch:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.166076Z", "iopub.status.busy": "2024-01-18T17:29:57.165683Z", "iopub.status.idle": "2024-01-18T17:29:57.178445Z", "shell.execute_reply": "2024-01-18T17:29:57.176911Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "'PSK'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "random_trigram = random.choices(list(k_book.keys()), weights=list(k_book.values()))[0]\n", "random_trigram" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "And this is its probability:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.183611Z", "iopub.status.busy": "2024-01-18T17:29:57.183274Z", "iopub.status.idle": "2024-01-18T17:29:57.192680Z", "shell.execute_reply": "2024-01-18T17:29:57.191973Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "0.0008284144853894445" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k_book[random_trigram]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Fuzzing the Enigma\n", "\n", "In the following, we introduce an extremely simplified implementation of the Naval Enigma based on the trigrams from the K-book. Of course, the encryption mechanism of the actual Enigma machine is much more sophisticated and worthy of a much more detailed investigation. We encourage the interested reader to follow up with further reading listed in the Background section.\n", "\n", "The staff at Bletchley Park can only check whether an encoded message is encoded with a (guessed) trigram.\n", "Our implementation `naval_enigma()` takes a `message` and a `key` (i.e., the guessed trigram). If the given key matches the (previously computed) key for the message, `naval_enigma()` returns `True`." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.198856Z", "iopub.status.busy": "2024-01-18T17:29:57.198498Z", "iopub.status.idle": "2024-01-18T17:29:57.283573Z", "shell.execute_reply": "2024-01-18T17:29:57.283209Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from Fuzzer import RandomFuzzer\n", "from Fuzzer import Runner" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.285969Z", "iopub.status.busy": "2024-01-18T17:29:57.285804Z", "iopub.status.idle": "2024-01-18T17:29:57.289175Z", "shell.execute_reply": "2024-01-18T17:29:57.288647Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "class EnigmaMachine(Runner):\n", " def __init__(self, k_book):\n", " self.k_book = k_book\n", " self.reset()\n", "\n", " def reset(self):\n", " \"\"\"Resets the key register\"\"\"\n", " self.msg2key = {}\n", " self.cur_msg = \"\"\n", "\n", " def internal_msg2key(self, message):\n", " \"\"\"Internal helper method. \n", " Returns the trigram for an encoded message.\"\"\"\n", " if message not in self.msg2key:\n", " # Simulating how an officer chooses a key from the Kenngruppenbuch\n", " # to encode the message.\n", " self.msg2key[message] = \\\n", " random.choices(list(self.k_book.keys()),\n", " weights=list(self.k_book.values()))[0]\n", " trigram = self.msg2key[message]\n", " return trigram\n", "\n", " def naval_enigma(self, message, key):\n", " \"\"\"Returns true if 'message' is encoded with 'key'\"\"\"\n", " if key == self.internal_msg2key(message):\n", " return True\n", " else:\n", " return False" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "To \"fuzz\" the `naval_enigma()`, our job will be to come up with a key that matches a given (encrypted) message. Since the keys only have three characters, we have a good chance to achieve this in much less than a second. (Of course, longer keys will be much harder to find via random fuzzing.)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.291245Z", "iopub.status.busy": "2024-01-18T17:29:57.291148Z", "iopub.status.idle": "2024-01-18T17:29:57.293371Z", "shell.execute_reply": "2024-01-18T17:29:57.293050Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "class EnigmaMachine(EnigmaMachine):\n", " def run(self, tri):\n", " \"\"\"PASS if cur_msg is encoded with trigram tri\"\"\"\n", " if self.naval_enigma(self.cur_msg, tri):\n", " outcome = self.PASS\n", " else:\n", " outcome = self.FAIL\n", "\n", " return (tri, outcome)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Now we can use the `EnigmaMachine` to check whether a certain message is encoded with a certain trigram." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.295584Z", "iopub.status.busy": "2024-01-18T17:29:57.295473Z", "iopub.status.idle": "2024-01-18T17:29:57.298493Z", "shell.execute_reply": "2024-01-18T17:29:57.298081Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "('AAA', 'FAIL')" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "enigma = EnigmaMachine(k_book)\n", "enigma.cur_msg = \"BrEaK mE. L0Lzz\"\n", "enigma.run(\"AAA\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The simplest way to crack an encoded message is by brute forcing. Suppose, at Bletchley park they would try random trigrams until a message is broken." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.300094Z", "iopub.status.busy": "2024-01-18T17:29:57.299976Z", "iopub.status.idle": "2024-01-18T17:29:57.302557Z", "shell.execute_reply": "2024-01-18T17:29:57.302243Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "class BletchleyPark:\n", " def __init__(self, enigma):\n", " self.enigma = enigma\n", " self.enigma.reset()\n", " self.enigma_fuzzer = RandomFuzzer(\n", " min_length=3,\n", " max_length=3,\n", " char_start=65,\n", " char_range=26)\n", "\n", " def break_message(self, message):\n", " \"\"\"Returning the trigram for an encoded message\"\"\"\n", " self.enigma.cur_msg = message\n", " while True:\n", " (trigram, outcome) = self.enigma_fuzzer.run(self.enigma)\n", " if outcome == self.enigma.PASS:\n", " break\n", " return trigram" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "How long does it take Bletchley park to find the key using this brute forcing approach?" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.304240Z", "iopub.status.busy": "2024-01-18T17:29:57.304140Z", "iopub.status.idle": "2024-01-18T17:29:57.305931Z", "shell.execute_reply": "2024-01-18T17:29:57.305574Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from Timer import Timer" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.307919Z", "iopub.status.busy": "2024-01-18T17:29:57.307813Z", "iopub.status.idle": "2024-01-18T17:29:57.438270Z", "shell.execute_reply": "2024-01-18T17:29:57.437873Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "enigma = EnigmaMachine(k_book)\n", "bletchley = BletchleyPark(enigma)\n", "\n", "with Timer() as t:\n", " trigram = bletchley.break_message(\"BrEaK mE. L0Lzz\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Here's the key for the current message:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.440750Z", "iopub.status.busy": "2024-01-18T17:29:57.440609Z", "iopub.status.idle": "2024-01-18T17:29:57.442851Z", "shell.execute_reply": "2024-01-18T17:29:57.442483Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'XQC'" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "trigram" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "And no, this did not take long:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.444670Z", "iopub.status.busy": "2024-01-18T17:29:57.444554Z", "iopub.status.idle": "2024-01-18T17:29:57.446631Z", "shell.execute_reply": "2024-01-18T17:29:57.446370Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'0.128261 seconds'" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'%f seconds' % t.elapsed_time()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.448149Z", "iopub.status.busy": "2024-01-18T17:29:57.448044Z", "iopub.status.idle": "2024-01-18T17:29:57.450260Z", "shell.execute_reply": "2024-01-18T17:29:57.449770Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'Bletchley cracks about 7 messages per second'" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'Bletchley cracks about %d messages per second' % (1/t.elapsed_time())" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Turing's Observations\n", "Okay, let's crack a few messages and count the number of times each trigram is observed." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.452319Z", "iopub.status.busy": "2024-01-18T17:29:57.452192Z", "iopub.status.idle": "2024-01-18T17:29:57.454037Z", "shell.execute_reply": "2024-01-18T17:29:57.453670Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from collections import defaultdict" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.456138Z", "iopub.status.busy": "2024-01-18T17:29:57.455977Z", "iopub.status.idle": "2024-01-18T17:29:57.457817Z", "shell.execute_reply": "2024-01-18T17:29:57.457530Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "n = 100 # messages to crack" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:29:57.459667Z", "iopub.status.busy": "2024-01-18T17:29:57.459523Z", "iopub.status.idle": "2024-01-18T17:30:01.614454Z", "shell.execute_reply": "2024-01-18T17:30:01.614124Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "observed: Dict[str, int] = defaultdict(int)\n", "for msg in range(0, n):\n", " trigram = bletchley.break_message(msg)\n", " observed[trigram] += 1\n", "\n", "# list of trigrams that have been observed\n", "counts = [k for k, v in observed.items() if int(v) > 0]\n", "\n", "t_trigrams = len(k_book)\n", "o_trigrams = len(counts)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:01.616508Z", "iopub.status.busy": "2024-01-18T17:30:01.616385Z", "iopub.status.idle": "2024-01-18T17:30:01.618670Z", "shell.execute_reply": "2024-01-18T17:30:01.618414Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "'After cracking 100 messages, we observed 72 out of 17576 trigrams.'" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"After cracking %d messages, we observed %d out of %d trigrams.\" % (\n", " n, o_trigrams, t_trigrams)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:01.620242Z", "iopub.status.busy": "2024-01-18T17:30:01.620142Z", "iopub.status.idle": "2024-01-18T17:30:01.621984Z", "shell.execute_reply": "2024-01-18T17:30:01.621541Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "singletons = len([k for k, v in observed.items() if int(v) == 1])" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:01.623938Z", "iopub.status.busy": "2024-01-18T17:30:01.623796Z", "iopub.status.idle": "2024-01-18T17:30:01.626303Z", "shell.execute_reply": "2024-01-18T17:30:01.625875Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'From the 72 observed trigrams, 63 were observed only once.'" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"From the %d observed trigrams, %d were observed only once.\" % (\n", " o_trigrams, singletons)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Given a sample of previously used entries, Turing wanted to _estimate the likelihood_ that the current unknown entry was one that had been previously used, and further, to estimate the probability distribution over the previously used entries. This lead to the development of the estimators of the missing mass and estimates of the true probability mass of the set of items occuring in the sample. Good worked with Turing during the war and, with Turing’s permission, published the analysis of the bias of these estimators in 1953." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Suppose, after finding the keys for n=100 messages, we have observed the trigram \"ABC\" exactly $X_\\text{ABC}=10$ times. What is the probability $p_\\text{ABC}$ that \"ABC\" is the key for the next message? Empirically, we would estimate $\\hat p_\\text{ABC}=\\frac{X_\\text{ABC}}{n}=0.1$. We can derive the empirical estimates for all other trigrams that we have observed. However, it becomes quickly evident that the complete probability mass is distributed over the *observed* trigrams. This leaves no mass for *unobserved* trigrams, i.e., the probability of discovering a new trigram. This is called the missing probability mass or the discovery probability." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Turing and Good derived an estimate of the *discovery probability* $p_0$, i.e., the probability to discover an unobserved trigram, as the number $f_1$ of trigrams observed exactly once divided by the total number $n$ of messages cracked:\n", "$$\n", "p_0 = \\frac{f_1}{n}\n", "$$\n", "where $f_1$ is the number of singletons and $n$ is the number of cracked messages." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Let's explore this idea for a bit. We'll extend `BletchleyPark` to crack `n` messages and record the number of trigrams observed as the number of cracked messages increases." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:01.628280Z", "iopub.status.busy": "2024-01-18T17:30:01.628139Z", "iopub.status.idle": "2024-01-18T17:30:01.631404Z", "shell.execute_reply": "2024-01-18T17:30:01.630899Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "class BletchleyPark(BletchleyPark):\n", " def break_message(self, message):\n", " \"\"\"Returning the trigram for an encoded message\"\"\"\n", " # For the following experiment, we want to make it practical\n", " # to break a large number of messages. So, we remove the\n", " # loop and just return the trigram for a message.\n", " #\n", " # enigma.cur_msg = message\n", " # while True:\n", " # (trigram, outcome) = self.enigma_fuzzer.run(self.enigma)\n", " # if outcome == self.enigma.PASS:\n", " # break\n", " trigram = enigma.internal_msg2key(message)\n", " return trigram\n", "\n", " def break_n_messages(self, n):\n", " \"\"\"Returns how often each trigram has been observed, \n", " and #trigrams discovered for each message.\"\"\"\n", " observed = defaultdict(int)\n", " timeseries = [0] * n\n", "\n", " # Crack n messages and record #trigrams observed as #messages increases\n", " cur_observed = 0\n", " for cur_msg in range(0, n):\n", " trigram = self.break_message(cur_msg)\n", "\n", " observed[trigram] += 1\n", " if (observed[trigram] == 1):\n", " cur_observed += 1\n", " timeseries[cur_msg] = cur_observed\n", "\n", " return (observed, timeseries)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Let's crack 2000 messages and compute the GT-estimate." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:01.633717Z", "iopub.status.busy": "2024-01-18T17:30:01.633609Z", "iopub.status.idle": "2024-01-18T17:30:01.636043Z", "shell.execute_reply": "2024-01-18T17:30:01.635492Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "n = 2000 # messages to crack" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:01.638813Z", "iopub.status.busy": "2024-01-18T17:30:01.638457Z", "iopub.status.idle": "2024-01-18T17:30:02.828055Z", "shell.execute_reply": "2024-01-18T17:30:02.827716Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "bletchley = BletchleyPark(enigma)\n", "(observed, timeseries) = bletchley.break_n_messages(n)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Let us determine the Good-Turing estimate of the probability that the next trigram has not been observed before:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:02.829954Z", "iopub.status.busy": "2024-01-18T17:30:02.829825Z", "iopub.status.idle": "2024-01-18T17:30:02.832405Z", "shell.execute_reply": "2024-01-18T17:30:02.832101Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "0.401" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "singletons = len([k for k, v in observed.items() if int(v) == 1])\n", "gt = singletons / n\n", "gt" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We can verify the Good-Turing estimate empirically and compute the empirically determined probability that the next trigram has not been observed before. To do this, we repeat the following experiment `repeats=1000` times, reporting the average: If the next message is a new trigram, return 1, otherwise return 0. Note that here, we do not record the newly discovered trigrams as observed." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:02.834163Z", "iopub.status.busy": "2024-01-18T17:30:02.834027Z", "iopub.status.idle": "2024-01-18T17:30:02.835772Z", "shell.execute_reply": "2024-01-18T17:30:02.835467Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "repeats = 1000 # experiment repetitions " ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:02.837509Z", "iopub.status.busy": "2024-01-18T17:30:02.837384Z", "iopub.status.idle": "2024-01-18T17:30:03.416571Z", "shell.execute_reply": "2024-01-18T17:30:03.416256Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "0.412" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "newly_discovered = 0\n", "for cur_msg in range(n, n + repeats):\n", " trigram = bletchley.break_message(cur_msg)\n", " if(observed[trigram] == 0):\n", " newly_discovered += 1\n", "\n", "newly_discovered / repeats" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Looks pretty accurate, huh? The difference between estimates is reasonably small, probably below 0.03. However, the Good-Turing estimate did not nearly require as much computational resources as the empirical estimate. Unlike the empirical estimate, the Good-Turing estimate can be computed during the campaign. Unlike the empirical estimate, the Good-Turing estimate requires no additional, redundant repetitions." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "In fact, the Good-Turing (GT) estimator often performs close to the best estimator for arbitrary distributions ([Try it here!](#Kenngruppenbuch)). Of course, the concept of *discovery* is not limited to trigrams. The GT estimator is also used in the study of natural languages to estimate the likelihood that we haven't ever heard or read the word we next encounter. The GT estimator is used in ecology to estimate the likelihood of discovering a new, unseen species in our quest to catalog all _species_ on earth. Later, we will see how it can be used to estimate the probability to discover a vulnerability when none has been observed, yet (i.e., residual risk)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Alan Turing was interested in the _complement_ $(1-GT)$ which gives the proportion of _all_ messages for which the Brits have already observed the trigram needed for decryption. For this reason, the complement is also called sample coverage. The *sample coverage* quantifies how much we know about decryption of all messages given the few messages we have already decrypted. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The probability that the next message can be decrypted with a previously discovered trigram is:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:03.418428Z", "iopub.status.busy": "2024-01-18T17:30:03.418319Z", "iopub.status.idle": "2024-01-18T17:30:03.420410Z", "shell.execute_reply": "2024-01-18T17:30:03.420116Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "0.599" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 - gt" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The *inverse* of the GT-estimate (1/GT) is a _maximum likelihood estimate_ of the expected number of messages that we can decrypt with previously observed trigrams before having to find a new trigram to decrypt the message. In our setting, the number of messages for which we can expect to reuse previous trigrams before having to discover a new trigram is:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:03.422231Z", "iopub.status.busy": "2024-01-18T17:30:03.422105Z", "iopub.status.idle": "2024-01-18T17:30:03.424242Z", "shell.execute_reply": "2024-01-18T17:30:03.423978Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "2.4937655860349124" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 / gt" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "But why is GT so accurate? Intuitively, despite a large sampling effort (i.e., cracking $n$ messages), there are still $f_1$ trigrams that have been observed only once. We could say that such \"singletons\" are very rare trigrams. Hence, the probability that the next messages is encoded with such a rare but observed trigram gives a good upper bound on the probability that the next message is encoded with an evidently much rarer, unobserved trigram. Since Turing's observation 80 years ago, an entire statistical theory has been developed around the hypothesis that rare, observed \"species\" are good predictors of unobserved species.\n", "\n", "Let's have a look at the distribution of rare trigrams." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:03.425978Z", "iopub.status.busy": "2024-01-18T17:30:03.425834Z", "iopub.status.idle": "2024-01-18T17:30:03.617167Z", "shell.execute_reply": "2024-01-18T17:30:03.616877Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:03.618992Z", "iopub.status.busy": "2024-01-18T17:30:03.618856Z", "iopub.status.idle": "2024-01-18T17:30:03.620888Z", "shell.execute_reply": "2024-01-18T17:30:03.620578Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt # type: ignore" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:03.622511Z", "iopub.status.busy": "2024-01-18T17:30:03.622387Z", "iopub.status.idle": "2024-01-18T17:30:03.844266Z", "shell.execute_reply": "2024-01-18T17:30:03.843968Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "frequencies = [v for k, v in observed.items() if int(v) > 0]\n", "frequencies.sort(reverse=True)\n", "# Uncomment to see how often each discovered trigram has been observed\n", "# print(frequencies)\n", "\n", "# frequency of rare trigrams\n", "plt.figure(num=None, figsize=(12, 4), dpi=80, facecolor='w', edgecolor='k')\n", "plt.subplot(1, 2, 1)\n", "plt.hist(frequencies, range=[1, 21], bins=numpy.arange(1, 21) - 0.5) # type: ignore\n", "plt.xticks(range(1, 21)) # type: ignore\n", "plt.xlabel('# of occurances (e.g., 1 represents singleton trigrams)')\n", "plt.ylabel('Frequency of occurances')\n", "plt.title('Figure 1. Frequency of Rare Trigrams')\n", "\n", "# trigram discovery over time\n", "plt.subplot(1, 2, 2)\n", "plt.plot(timeseries)\n", "plt.xlabel('# of messages cracked')\n", "plt.ylabel('# of trigrams discovered')\n", "plt.title('Figure 2. Trigram Discovery Over Time');" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:03.846211Z", "iopub.status.busy": "2024-01-18T17:30:03.846082Z", "iopub.status.idle": "2024-01-18T17:30:03.848825Z", "shell.execute_reply": "2024-01-18T17:30:03.848511Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "802 of 1009 trigrams (79.485%) have been observed 1 time (i.e., are singleton trigrams).\n", " 1 of 1009 trigrams ( 0.001%) have been observed 152 times.\n" ] } ], "source": [ "# Statistics for most and least often observed trigrams\n", "singletons = len([v for k, v in observed.items() if int(v) == 1])\n", "total = len(frequencies)\n", "\n", "print(\"%3d of %3d trigrams (%.3f%%) have been observed 1 time (i.e., are singleton trigrams).\"\n", " % (singletons, total, singletons * 100 / total))\n", "\n", "print(\"%3d of %3d trigrams ( %.3f%%) have been observed %d times.\"\n", " % (1, total, 1 / total, frequencies[0]))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The *majority of trigrams* have been observed only once, as we can see in Figure 1 (left). In other words, the majority of observed trigrams are \"rare\" singletons. In Figure 2 (right), we can see that discovery is in full swing. The trajectory seems almost linear. However, since there is a finite number of trigrams (26^3 = 17,576) trigram discovery will slow down and eventually approach an asymptote (the total number of trigrams).\n", "\n", "### Boosting the Performance of BletchleyPark\n", "Some trigrams have been observed very often. We call these \"abundant\" trigrams." ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:03.850440Z", "iopub.status.busy": "2024-01-18T17:30:03.850327Z", "iopub.status.idle": "2024-01-18T17:30:03.853079Z", "shell.execute_reply": "2024-01-18T17:30:03.852788Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trigram : Frequency\n", " TJK : 152\n", " LBM : 69\n", " NWV : 64\n", " AZC : 43\n", " GZP : 41\n", " ADE : 37\n", " DNO : 27\n", " OQL : 26\n", " TCO : 20\n", " BDA : 19\n", " ARO : 18\n", " IPT : 16\n", " FGK : 16\n", " MSV : 15\n", " ONO : 15\n", " EOR : 13\n", " JTV : 11\n", " IBT : 11\n", " PWN : 11\n" ] } ], "source": [ "print(\"Trigram : Frequency\")\n", "for trigram in sorted(observed, key=observed.get, reverse=True): # type: ignore\n", " if observed[trigram] > 10:\n", " print(\" %s : %d\" % (trigram, observed[trigram]))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We'll speed up the code breaking by _trying the abundant trigrams first_. \n", "\n", "First, we'll find out how many messages can be cracked by the existing brute forcing strategy at Bledgley park, given a maximum number of attempts. We'll also track the number of messages cracked over time (`timeseries`)." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:03.854759Z", "iopub.status.busy": "2024-01-18T17:30:03.854612Z", "iopub.status.idle": "2024-01-18T17:30:03.858034Z", "shell.execute_reply": "2024-01-18T17:30:03.857731Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "class BletchleyPark(BletchleyPark):\n", " def __init__(self, enigma):\n", " super().__init__(enigma)\n", " self.cur_attempts = 0\n", " self.cur_observed = 0\n", " self.observed = defaultdict(int)\n", " self.timeseries = [None] * max_attempts * 2\n", "\n", " def break_message(self, message):\n", " \"\"\"Returns the trigram for an encoded message, and\n", " track #trigrams observed as #attempts increases.\"\"\"\n", " self.enigma.cur_msg = message\n", " while True:\n", " self.cur_attempts += 1 # NEW\n", " (trigram, outcome) = self.enigma_fuzzer.run(self.enigma)\n", " self.timeseries[self.cur_attempts] = self.cur_observed # NEW\n", " if outcome == self.enigma.PASS: \n", " break\n", " return trigram\n", "\n", " def break_max_attempts(self, max_attempts):\n", " \"\"\"Returns #messages successfully cracked after a given #attempts.\"\"\"\n", " cur_msg = 0\n", " n_messages = 0\n", "\n", " while True:\n", " trigram = self.break_message(cur_msg)\n", "\n", " # stop when reaching max_attempts\n", " if self.cur_attempts >= max_attempts:\n", " break\n", "\n", " # update observed trigrams\n", " n_messages += 1\n", " self.observed[trigram] += 1\n", " if (self.observed[trigram] == 1):\n", " self.cur_observed += 1\n", " self.timeseries[self.cur_attempts] = self.cur_observed\n", " cur_msg += 1\n", "\n", " return n_messages" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "`original` is the number of messages cracked by the brute-forcing strategy, given 100k attempts. Can we beat this?" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:03.859503Z", "iopub.status.busy": "2024-01-18T17:30:03.859416Z", "iopub.status.idle": "2024-01-18T17:30:03.861221Z", "shell.execute_reply": "2024-01-18T17:30:03.860956Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "max_attempts = 100000" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:03.862985Z", "iopub.status.busy": "2024-01-18T17:30:03.862895Z", "iopub.status.idle": "2024-01-18T17:30:04.117082Z", "shell.execute_reply": "2024-01-18T17:30:04.116693Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bletchley = BletchleyPark(enigma)\n", "original = bletchley.break_max_attempts(max_attempts)\n", "original" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Now, we'll create a boosting strategy by trying trigrams first that we have previously observed most often." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.118928Z", "iopub.status.busy": "2024-01-18T17:30:04.118806Z", "iopub.status.idle": "2024-01-18T17:30:04.122165Z", "shell.execute_reply": "2024-01-18T17:30:04.121603Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "class BoostedBletchleyPark(BletchleyPark):\n", " def __init__(self, enigma, prior):\n", " super().__init__(enigma)\n", " self.prior = prior\n", "\n", " def break_message(self, message):\n", " \"\"\"Returns the trigram for an encoded message, and\n", " track #trigrams observed as #attempts increases.\"\"\"\n", " self.enigma.cur_msg = message\n", "\n", " # boost cracking by trying observed trigrams first\n", " for trigram in sorted(self.prior, key=self.prior.get, reverse=True):\n", " self.cur_attempts += 1\n", " (_, outcome) = self.enigma.run(trigram)\n", " self.timeseries[self.cur_attempts] = self.cur_observed\n", " if outcome == self.enigma.PASS:\n", " return trigram\n", "\n", " # else fall back to normal cracking\n", " return super().break_message(message)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "`boosted` is the number of messages cracked by the boosted strategy." ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.123787Z", "iopub.status.busy": "2024-01-18T17:30:04.123690Z", "iopub.status.idle": "2024-01-18T17:30:04.346340Z", "shell.execute_reply": "2024-01-18T17:30:04.346016Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "23" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "boostedBletchley = BoostedBletchleyPark(enigma, prior=observed)\n", "boosted = boostedBletchley.break_max_attempts(max_attempts)\n", "boosted" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "We see that the boosted technique cracks substantially more messages. It is worthwhile to record how often each trigram is being used as key and try them in the order of their occurrence.\n", "\n", "***Try it***. *For practical reasons, we use a large number of previous observations as prior (`boostedBletchley.prior = observed`). You can try to change the code such that the strategy uses the trigram frequencies (`self.observed`) observed **during** the campaign itself to boost the campaign. You will need to increase `max_attempts` and wait for a long while.*" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Let's compare the number of trigrams discovered over time." ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.348085Z", "iopub.status.busy": "2024-01-18T17:30:04.347946Z", "iopub.status.idle": "2024-01-18T17:30:04.664082Z", "shell.execute_reply": "2024-01-18T17:30:04.663789Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# print plots\n", "line_old, = plt.plot(bletchley.timeseries, label=\"Bruteforce Strategy\")\n", "line_new, = plt.plot(boostedBletchley.timeseries, label=\"Boosted Strategy\")\n", "plt.legend(handles=[line_old, line_new])\n", "plt.xlabel('# of cracking attempts')\n", "plt.ylabel('# of trigrams discovered')\n", "plt.title('Trigram Discovery Over Time');" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "We see that the boosted fuzzer is constantly superior over the random fuzzer." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "## Estimating the Probability of Path Discovery\n", "\n", "\n", "\n", "\n", "So, what does Turing's observation for the Naval Enigma have to do with fuzzing _arbitrary_ programs? Turing's assistant I.J. Good extended and published Turing's work on the estimation procedures in Biometrica, a journal for theoretical biostatistics that still exists today. Good did not talk about trigrams. Instead, he calls them \"species\". Hence, the GT estimator is presented to estimate how likely it is to discover a new species, given an existing sample of individuals (each of which belongs to exactly one species). \n", "\n", "Now, we can associate program inputs to species, as well. For instance, we could define the path that is exercised by an input as that input's species. This would allow us to _estimate the probability that fuzzing discovers a new path._ Later, we will see how this discovery probability estimate also estimates the likelihood of discovering a vulnerability when we have not seen one, yet (residual risk)." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Let's do this. We identify the species for an input by computing a hash-id over the set of statements exercised by that input. In the [Coverage](Coverage.ipynb) chapter, we have learned about the [Coverage class](Coverage.ipynb#A-Coverage-Class) which collects coverage information for an executed Python function. As an example, the function [`cgi_decode()`](Coverage.ipynb#A-CGI-Decoder) was introduced. The function `cgi_decode()` takes a string encoded for a website URL and decodes it back to its original form.\n", "\n", "Here's what `cgi_decode()` does and how coverage is computed." ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.665811Z", "iopub.status.busy": "2024-01-18T17:30:04.665692Z", "iopub.status.idle": "2024-01-18T17:30:04.684975Z", "shell.execute_reply": "2024-01-18T17:30:04.684634Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from Coverage import Coverage, cgi_decode" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.687053Z", "iopub.status.busy": "2024-01-18T17:30:04.686911Z", "iopub.status.idle": "2024-01-18T17:30:04.688924Z", "shell.execute_reply": "2024-01-18T17:30:04.688638Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "encoded = \"Hello%2c+world%21\"\n", "with Coverage() as cov:\n", " decoded = cgi_decode(encoded)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.690632Z", "iopub.status.busy": "2024-01-18T17:30:04.690518Z", "iopub.status.idle": "2024-01-18T17:30:04.692765Z", "shell.execute_reply": "2024-01-18T17:30:04.692481Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "'Hello, world!'" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "decoded" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.694563Z", "iopub.status.busy": "2024-01-18T17:30:04.694432Z", "iopub.status.idle": "2024-01-18T17:30:04.696288Z", "shell.execute_reply": "2024-01-18T17:30:04.696021Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{('cgi_decode', 17), ('cgi_decode', 20), ('cgi_decode', 26), ('cgi_decode', 23), ('cgi_decode', 29), ('cgi_decode', 32), ('cgi_decode', 38), ('cgi_decode', 19), ('cgi_decode', 16), ('cgi_decode', 25), ('cgi_decode', 31), ('cgi_decode', 28), ('cgi_decode', 34), ('cgi_decode', 40), ('cgi_decode', 18), ('cgi_decode', 24), ('cgi_decode', 27), ('cgi_decode', 30), ('cgi_decode', 33), ('cgi_decode', 39)}\n" ] } ], "source": [ "print(cov.coverage());" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Trace Coverage\n", "First, we will introduce the concept of execution traces, which are a coarse abstraction of the execution path taken by an input. Compared to the definition of path, a trace ignores the sequence in which statements are exercised or how often each statement is exercised.\n", "\n", "* `pickle.dumps()` - serializes an object by producing a byte array from all the information in the object\n", "* `hashlib.md5()` - produces a 128-bit hash value from a byte array" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.697770Z", "iopub.status.busy": "2024-01-18T17:30:04.697661Z", "iopub.status.idle": "2024-01-18T17:30:04.699328Z", "shell.execute_reply": "2024-01-18T17:30:04.699081Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import pickle\n", "import hashlib" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.700830Z", "iopub.status.busy": "2024-01-18T17:30:04.700714Z", "iopub.status.idle": "2024-01-18T17:30:04.702510Z", "shell.execute_reply": "2024-01-18T17:30:04.702265Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "def getTraceHash(cov):\n", " pickledCov = pickle.dumps(cov.coverage())\n", " hashedCov = hashlib.md5(pickledCov).hexdigest()\n", " return hashedCov" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Remember our model for the Naval Enigma machine? Each message must be decrypted using exactly one trigram while multiple messages may be decrypted by the same trigram. Similarly, we need each input to yield exactly one trace hash while multiple inputs can yield the same trace hash." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Let's see whether this is true for our `getTraceHash()` function." ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.704185Z", "iopub.status.busy": "2024-01-18T17:30:04.704031Z", "iopub.status.idle": "2024-01-18T17:30:04.706444Z", "shell.execute_reply": "2024-01-18T17:30:04.706156Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "inp1 = \"a+b\"\n", "inp2 = \"a+b+c\"\n", "inp3 = \"abc\"\n", "\n", "with Coverage() as cov1:\n", " cgi_decode(inp1)\n", "with Coverage() as cov2:\n", " cgi_decode(inp2)\n", "with Coverage() as cov3:\n", " cgi_decode(inp3)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The inputs `inp1` and `inp2` execute the same statements:" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.708147Z", "iopub.status.busy": "2024-01-18T17:30:04.708041Z", "iopub.status.idle": "2024-01-18T17:30:04.710124Z", "shell.execute_reply": "2024-01-18T17:30:04.709786Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "('a+b', 'a+b+c')" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "inp1, inp2" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.711968Z", "iopub.status.busy": "2024-01-18T17:30:04.711838Z", "iopub.status.idle": "2024-01-18T17:30:04.714108Z", "shell.execute_reply": "2024-01-18T17:30:04.713843Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "set()" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cov1.coverage() - cov2.coverage()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The difference between both coverage sets is empty. Hence, the trace hashes should be the same:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.715792Z", "iopub.status.busy": "2024-01-18T17:30:04.715672Z", "iopub.status.idle": "2024-01-18T17:30:04.717789Z", "shell.execute_reply": "2024-01-18T17:30:04.717532Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'dafd9c3d93d650805bce69d8e6eb45af'" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "getTraceHash(cov1)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.719335Z", "iopub.status.busy": "2024-01-18T17:30:04.719206Z", "iopub.status.idle": "2024-01-18T17:30:04.721470Z", "shell.execute_reply": "2024-01-18T17:30:04.721192Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'dafd9c3d93d650805bce69d8e6eb45af'" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "getTraceHash(cov2)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.723259Z", "iopub.status.busy": "2024-01-18T17:30:04.723135Z", "iopub.status.idle": "2024-01-18T17:30:04.724875Z", "shell.execute_reply": "2024-01-18T17:30:04.724591Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "assert getTraceHash(cov1) == getTraceHash(cov2)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "In contrast, the inputs `inp1` and `inp3` execute _different_ statements:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.726833Z", "iopub.status.busy": "2024-01-18T17:30:04.726483Z", "iopub.status.idle": "2024-01-18T17:30:04.728819Z", "shell.execute_reply": "2024-01-18T17:30:04.728555Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "('a+b', 'abc')" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "inp1, inp3" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.730397Z", "iopub.status.busy": "2024-01-18T17:30:04.730297Z", "iopub.status.idle": "2024-01-18T17:30:04.732358Z", "shell.execute_reply": "2024-01-18T17:30:04.732108Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "{('cgi_decode', 28)}" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cov1.coverage() - cov3.coverage()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Hence, the trace hashes should be different, too:" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.734042Z", "iopub.status.busy": "2024-01-18T17:30:04.733938Z", "iopub.status.idle": "2024-01-18T17:30:04.735762Z", "shell.execute_reply": "2024-01-18T17:30:04.735516Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "'dafd9c3d93d650805bce69d8e6eb45af'" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "getTraceHash(cov1)" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.737578Z", "iopub.status.busy": "2024-01-18T17:30:04.737456Z", "iopub.status.idle": "2024-01-18T17:30:04.739839Z", "shell.execute_reply": "2024-01-18T17:30:04.739463Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'db819f7735ad8e22026b5d9d0e1e3d35'" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "getTraceHash(cov3)" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.741550Z", "iopub.status.busy": "2024-01-18T17:30:04.741432Z", "iopub.status.idle": "2024-01-18T17:30:04.743168Z", "shell.execute_reply": "2024-01-18T17:30:04.742901Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "assert getTraceHash(cov1) != getTraceHash(cov3)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Measuring Trace Coverage over Time\n", "In order to measure trace coverage for a `function` executing a `population` of fuzz inputs, we slightly adapt the `population_coverage()` function from the [Chapter on Coverage](Coverage.ipynb#Coverage-of-Basic-Fuzzing)." ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.745042Z", "iopub.status.busy": "2024-01-18T17:30:04.744918Z", "iopub.status.idle": "2024-01-18T17:30:04.747954Z", "shell.execute_reply": "2024-01-18T17:30:04.747670Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "def population_trace_coverage(population, function):\n", " cumulative_coverage = []\n", " all_coverage = set()\n", " cumulative_singletons = []\n", " cumulative_doubletons = []\n", " singletons = set()\n", " doubletons = set()\n", "\n", " for s in population:\n", " with Coverage() as cov:\n", " try:\n", " function(s)\n", " except BaseException:\n", " pass\n", " cur_coverage = set([getTraceHash(cov)])\n", "\n", " # singletons and doubletons -- we will need them later\n", " doubletons -= cur_coverage\n", " doubletons |= singletons & cur_coverage\n", " singletons -= cur_coverage\n", " singletons |= cur_coverage - (cur_coverage & all_coverage)\n", " cumulative_singletons.append(len(singletons))\n", " cumulative_doubletons.append(len(doubletons))\n", "\n", " # all and cumulative coverage\n", " all_coverage |= cur_coverage\n", " cumulative_coverage.append(len(all_coverage))\n", "\n", " return all_coverage, cumulative_coverage, cumulative_singletons, cumulative_doubletons" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Let's see whether our new function really contains coverage information only for *two* traces given our three inputs for `cgi_decode`." ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.749819Z", "iopub.status.busy": "2024-01-18T17:30:04.749723Z", "iopub.status.idle": "2024-01-18T17:30:04.751700Z", "shell.execute_reply": "2024-01-18T17:30:04.751415Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "all_coverage = population_trace_coverage([inp1, inp2, inp3], cgi_decode)[0]\n", "assert len(all_coverage) == 2" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Unfortunately, the `cgi_decode()` function is too simple. Instead, we will use the original Python [HTMLParser](https://docs.python.org/3/library/html.parser.html) as our test subject." ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.753256Z", "iopub.status.busy": "2024-01-18T17:30:04.753163Z", "iopub.status.idle": "2024-01-18T17:30:04.755273Z", "shell.execute_reply": "2024-01-18T17:30:04.754985Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from Coverage import population_coverage\n", "from html.parser import HTMLParser" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.756930Z", "iopub.status.busy": "2024-01-18T17:30:04.756829Z", "iopub.status.idle": "2024-01-18T17:30:04.758513Z", "shell.execute_reply": "2024-01-18T17:30:04.758239Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "trials = 50000 # number of random inputs generated" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Let's run a random fuzzer for $n=50000$ times and plot trace coverage over time." ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.760026Z", "iopub.status.busy": "2024-01-18T17:30:04.759945Z", "iopub.status.idle": "2024-01-18T17:30:04.762048Z", "shell.execute_reply": "2024-01-18T17:30:04.761669Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# create wrapper function\n", "def my_parser(inp):\n", " parser = HTMLParser() # resets the HTMLParser object for every fuzz input\n", " parser.feed(inp)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:04.763703Z", "iopub.status.busy": "2024-01-18T17:30:04.763614Z", "iopub.status.idle": "2024-01-18T17:30:10.601075Z", "shell.execute_reply": "2024-01-18T17:30:10.600749Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# create random fuzzer\n", "fuzzer = RandomFuzzer(min_length=1, max_length=100,\n", " char_start=32, char_range=94)\n", "\n", "# create population of fuzz inputs\n", "population = []\n", "for i in range(trials):\n", " population.append(fuzzer.fuzz())\n", "\n", "# execute and measure trace coverage\n", "trace_timeseries = population_trace_coverage(population, my_parser)[1]\n", "\n", "# execute and measure code coverage\n", "code_timeseries = population_coverage(population, my_parser)[1]\n", "\n", "# plot trace coverage over time\n", "plt.figure(num=None, figsize=(12, 4), dpi=80, facecolor='w', edgecolor='k')\n", "plt.subplot(1, 2, 1)\n", "plt.plot(trace_timeseries)\n", "plt.xlabel('# of fuzz inputs')\n", "plt.ylabel('# of traces exercised')\n", "plt.title('Trace Coverage Over Time')\n", "\n", "# plot code coverage over time\n", "plt.subplot(1, 2, 2)\n", "plt.plot(code_timeseries)\n", "plt.xlabel('# of fuzz inputs')\n", "plt.ylabel('# of statements covered')\n", "plt.title('Code Coverage Over Time');" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Above, we can see trace coverage (left) and code coverage (right) over time. Here are our observations.\n", "1. **Trace coverage is more robust**. There are less sudden jumps in the graph compared to code coverage.\n", "2. **Trace coverage is more fine-grained.** There are more traces than statements covered in the end (y-axis).\n", "3. **Trace coverage grows more steadily**. Code coverage exercises more than half the statements it has exercised after 50k inputs with the first input. Instead, the number of traces covered grows slowly and steadily since each input can yield only one execution trace.\n", "\n", "It is for this reason that one of the most prominent and successful fuzzers today, American Fuzzy Lop (AFL), uses a similar *measure of progress* (a hash computed over the branches exercised by the input)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Evaluating the Discovery Probability Estimate\n", "\n", "Let's find out how the Good-Turing estimator performs as estimate of discovery probability when we are fuzzing to discover execution traces rather than trigrams. \n", "\n", "To measure the empirical probability, we execute the same population of inputs (n=50000) and measure in regular intervals (`measurements=100` intervals). During each measurement, we repeat the following experiment `repeats=500` times, reporting the average: If the next input yields a new trace, return 1, otherwise return 0. Note that during these repetitions, we do not record the newly discovered traces as observed." ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:10.603047Z", "iopub.status.busy": "2024-01-18T17:30:10.602916Z", "iopub.status.idle": "2024-01-18T17:30:10.604858Z", "shell.execute_reply": "2024-01-18T17:30:10.604568Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "repeats = 500 # experiment repetitions\n", "measurements = 100 # experiment measurements" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:10.606375Z", "iopub.status.busy": "2024-01-18T17:30:10.606262Z", "iopub.status.idle": "2024-01-18T17:30:16.584778Z", "shell.execute_reply": "2024-01-18T17:30:16.584439Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "emp_timeseries = []\n", "all_coverage = set()\n", "step = int(trials / measurements)\n", "\n", "for i in range(0, trials, step):\n", " if i - step >= 0:\n", " for j in range(step):\n", " inp = population[i - j]\n", " with Coverage() as cov:\n", " try:\n", " my_parser(inp)\n", " except BaseException:\n", " pass\n", " all_coverage |= set([getTraceHash(cov)])\n", "\n", " discoveries = 0\n", " for _ in range(repeats):\n", " inp = fuzzer.fuzz()\n", " with Coverage() as cov:\n", " try:\n", " my_parser(inp)\n", " except BaseException:\n", " pass\n", " if getTraceHash(cov) not in all_coverage:\n", " discoveries += 1\n", " emp_timeseries.append(discoveries / repeats)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Now, we compute the Good-Turing estimate over time." ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:16.586914Z", "iopub.status.busy": "2024-01-18T17:30:16.586747Z", "iopub.status.idle": "2024-01-18T17:30:19.070953Z", "shell.execute_reply": "2024-01-18T17:30:19.070461Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "gt_timeseries = []\n", "singleton_timeseries = population_trace_coverage(population, my_parser)[2]\n", "for i in range(1, trials + 1, step):\n", " gt_timeseries.append(singleton_timeseries[i - 1] / i)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Let's go ahead and plot both time series." ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:19.073113Z", "iopub.status.busy": "2024-01-18T17:30:19.072837Z", "iopub.status.idle": "2024-01-18T17:30:19.354410Z", "shell.execute_reply": "2024-01-18T17:30:19.354065Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkYAAAHHCAYAAABa2ZeMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACu0ElEQVR4nOzdd5xU5fX48c/07Y1twC69gywK2FABBRGxRyXGCJhE/UWMGjQxxmj8atTYMCRiL9iSoAa7ooBgQUU6Su/sUrawvU29vz/u3LvTtswys7O45/16zQv2zt2ZZ2Znd86c5zznMSiKoiCEEEIIITDGegBCCCGEEJ2FBEZCCCGEEF4SGAkhhBBCeElgJIQQQgjhJYGREEIIIYSXBEZCCCGEEF4SGAkhhBBCeElgJIQQQgjhJYGREEIIIYSXBEZCtOLee+/FYDDEehjCx4IFCzAYDKxZsyZitzlhwgRGjBjR6nn79u3DYDCwYMEC/Vio10ifPn2YNWtWxMbXFc2aNYs+ffrEehiii5HASHQp2huqdomLi6NHjx5MmTKFf/7zn9TU1MR6iMe1CRMm+D2/GRkZjB07lpdeegmPxxPr4cXUli1buPfee9m3b19Ubv/DDz/kvPPOo1u3bsTFxTFo0CBuv/12jh49GpX7ay/f10dLlxUrVsR6qKKLMsd6AELEwn333Uffvn1xOp0cOXKEFStWcOuttzJ37lzef/99Ro4cqZ/7l7/8hT/96U8xHO3xJS8vj4ceegiA0tJSXn31VX7961+zY8cO/v73v8d4dMeud+/eNDQ0YLFYWjxv+/btGI1Nnz23bNnC//3f/zFhwoSIZ0Fuv/12Hn/8cQoKCrjjjjvIyMhg3bp1PPnkk/z3v/9l2bJlDB48OKL32V6vvfaa39evvvoqS5YsCTo+dOhQnn/++S4fUIuOJ4GR6JKmTp3KmDFj9K/vvPNOPv/8cy644AIuuugitm7dSnx8PABmsxmz+af9q6IoCo2NjfpjPhapqan88pe/1L++4YYbGDx4ME8++ST3339/yIDC4/HgcDiIi4s75vuPNi3T2BqbzdYBo4H//Oc/PP7440yfPp033ngDk8mkXzdr1iwmTpzIFVdcwbp16zr0dVxXV0diYmLQcd/XBsB3333HkiVLgo4LESsylSaE19lnn83dd9/N/v37ef311/XjoepHlixZwhlnnEFaWhpJSUkMHjyYP//5z37nNDY2cu+99zJo0CDi4uLo3r07l112Gbt379bPqaur47bbbiM/Px+bzcbgwYN57LHHUBRFP2fEiBFMnDgxaLwej4eePXty+eWX+x37xz/+wfDhw4mLiyMnJ4cbbriBiooKv+/t06cPF1xwAZ9++iljxowhPj6eZ599lvHjx1NQUBDy+Rk8eDBTpkxpwzPpLyEhgVNPPZW6ujpKS0sBNbi46aabeOONNxg+fDg2m43FixcDsH79eqZOnUpKSgpJSUmcc845fPfddyFvu76+nhtuuIFu3bqRkpLCjBkzgh7re++9x7Rp0+jRowc2m43+/ftz//3343a7Q97m2rVrOf3004mPj6dv374888wzfteHqjEKxbfGaMGCBVxxxRUATJw40W+6aObMmWRmZuJ0OoNu49xzz2010/N///d/pKen89xzz/kFRQAnn3wyd9xxBz/88ANvv/02ADfddBNJSUnU19cH3dZVV11Fbm6u33PzySefcOaZZ5KYmEhycjLTpk1j8+bNft83a9YskpKS2L17N+effz7JyclcffXVLY67LQJrjLTn/rHHHmP+/Pn069ePhIQEzj33XAoLC1EUhfvvv5+8vDzi4+O5+OKLKS8vD7rdtjwm0XVJYCSEj2uuuQaAzz77rNlzNm/ezAUXXIDdbue+++7j8ccf56KLLmLlypX6OW63mwsuuID/+7//Y/To0Tz++OPccsstVFVV8eOPPwJqluaiiy7iiSee4LzzzmPu3LkMHjyYP/zhD8yZM0e/renTp/Pll19y5MgRv3F8/fXXHDp0iJ///Of6sRtuuIE//OEPjBs3jnnz5nHttdfyxhtvMGXKlKA33u3bt3PVVVcxefJk5s2bx6hRo7jmmmvYtGmTPkbN6tWr2bFjR7s/1e/ZsweTyURaWpp+7PPPP+f3v/8906dPZ968efTp04fNmzdz5plnsnHjRv74xz9y9913s3fvXiZMmMCqVauCbvemm25i69at3HvvvcyYMYM33niDSy65xC+wXLBgAUlJScyZM4d58+YxevRo7rnnnpDToxUVFZx//vmMHj2aRx55hLy8PH7729/y0ksvtetxa8466yxuvvlmAP785z/z2muv8dprrzF06FCuueYajh49yqeffur3PUeOHOHzzz9v8TnfuXMn27dv5+KLLyYlJSXkOTNmzADUGiRQX091dXV89NFHfufV19fzwQcfcPnll+sB1muvvca0adNISkri4Ycf5u6772bLli2cccYZQbVSLpeLKVOmkJ2dzWOPPcbPfvaztj9BYXrjjTd46qmn+N3vfsdtt93GF198wZVXXslf/vIXFi9ezB133MH111/PBx98wO233+73veE8JtFFKUJ0IS+//LICKKtXr272nNTUVOXEE0/Uv/7rX/+q+P6qPPHEEwqglJaWNnsbL730kgIoc+fODbrO4/EoiqIo7777rgIof/vb3/yuv/zyyxWDwaDs2rVLURRF2b59uwIo//rXv/zOu/HGG5WkpCSlvr5eURRF+eqrrxRAeeONN/zOW7x4cdDx3r17K4CyePFiv3MrKyuVuLg45Y477vA7fvPNNyuJiYlKbW1ts49ZURRl/PjxypAhQ5TS0lKltLRU2bp1q3LzzTcrgHLhhRfq5wGK0WhUNm/e7Pf9l1xyiWK1WpXdu3frxw4dOqQkJycrZ511ln5M+zmOHj1acTgc+vFHHnlEAZT33ntPP6Y9P75uuOEGJSEhQWlsbPQbO6A8/vjj+jG73a6MGjVKyc7O1u9n7969CqC8/PLL+nmBrxFFUZ/jmTNn6l+/9dZbCqAsX77c7zy3263k5eUp06dP9zs+d+5cxWAwKHv27Akav0Z7DT3xxBPNnqMoipKSkqKcdNJJiqKor7+ePXsqP/vZz/zOefPNNxVA+fLLLxVFUZSamholLS1Nue666/zOO3LkiJKamup3fObMmQqg/OlPf2pxHKHMnj076Lnzvd3evXvrX2vPfVZWllJZWakfv/POOxVAKSgoUJxOp378qquuUqxWq/5zDucxia5LMkZCBEhKSmpxdZqW9XjvvfeaLQz93//+R2ZmJr/73e+CrtOm5T7++GNMJpOeSdDcdtttKIrCJ598AsCgQYMYNWoUCxcu1M9xu928/fbbXHjhhXpd0FtvvUVqaiqTJ0+mrKxMv4wePZqkpCSWL1/udz99+/YNmhpLTU3l4osv5j//+Y+edXG73SxcuJBLLrkkZM1IoG3btpGVlUVWVhZDhw7lX//6F9OmTQvKuowfP55hw4b5PabPPvuMSy65hH79+unHu3fvzi9+8Qu+/vprqqur/W7j+uuv96tZ+u1vf4vZbObjjz/Wj/nWTdXU1FBWVsaZZ55JfX0927Zt87s9s9nMDTfcoH9ttVq54YYbKCkpYe3ata0+9vYwGo1cffXVvP/++36vuzfeeIPTTz+dvn37Nvu92vnJyckt3kdycrL+3BkMBq644go+/vhjamtr9XMWLlxIz549OeOMMwB1uriyspKrrrrK7/VkMpk45ZRTgl5PoD7/HeGKK64gNTVV//qUU04B1Pol3zqqU045BYfDwcGDB4H2PSbR9UhgJESA2traFt9opk+fzrhx4/jNb35DTk4OP//5z3nzzTf9gqTdu3czePDgFotd9+/fT48ePYLua+jQofr1vve5cuVK/Q/8ihUrKCkpYfr06fo5O3fupKqqiuzsbD0w0S61tbWUlJT43U9zb7gzZszgwIEDfPXVVwAsXbqU4uJifZqxNX369GHJkiUsXbqUr7/+miNHjvDhhx+SmZnZ4v2XlpZSX18fsqZm6NCheDweCgsL/Y4PHDjQ7+ukpCS6d+/uNyWyefNmLr30UlJTU0lJSSErK0ufnqqqqvL7/h49egQFf4MGDQKI6jTLjBkzaGho4J133gHUac61a9e2+pxrr53W2kzU1NT4vc6mT59OQ0MD77//PqC+5j/++GOuuOIKPXDfuXMnoNbeBb6ePvvss6DXk9lsJi8vL4xH3X69evXy+1oLkvLz80Me1+rOwn1Momv6aS+1ESJMRUVFVFVVMWDAgGbPiY+P58svv2T58uV89NFHLF68mIULF3L22Wfz2WefBRXARsL06dO58847eeutt7j11lt58803SU1N5bzzztPP8Xg8ZGdn88Ybb4S8jaysrKDHEcqUKVPIycnh9ddf56yzzuL1118nNzeXSZMmtWmsiYmJbTo3EivgWlNZWcn48eNJSUnhvvvuo3///sTFxbFu3TruuOOOTrMUfNiwYYwePZrXX3+dGTNm8Prrr2O1Wrnyyitb/D4tiN60aVOz5+zfv5/q6mq/7Nypp55Knz59ePPNN/nFL37BBx98QENDg1+grT03r732Grm5uUG3Gxj022w2v/YE0dTc71hzx7XsZ7iPSXRN8ioQwofWS6W11VdGo5FzzjmHc845h7lz5/Lggw9y1113sXz5ciZNmkT//v1ZtWoVTqez2X43vXv3ZunSpUGf5rXpnd69e+vH+vbty8knn8zChQu56aabWLRoEZdcconfkvD+/fuzdOlSxo0bd0xBh8lk4he/+AULFizg4Ycf5t133+W6666LSsDnKysri4SEBLZv3x503bZt2zAajUEZgZ07d/qt2KutreXw4cOcf/75gJpZO3r0KIsWLeKss87Sz9u7d2/IMRw6dChomfmOHTsAjrn3UGvd02fMmMGcOXM4fPgw//73v5k2bRrp6ektfs+gQYMYNGgQ7777LvPmzQuZ6Xz11VcBuOCCC/yOX3nllcybN4/q6moWLlxInz59OPXUU/Xr+/fvD0B2dnabg+LO7qf4mETkyVSaEF6ff/45999/P3379m1xqXGo5b+jRo0CwG63A/Czn/2MsrIynnzyyaBztU+v559/Pm63O+icJ554AoPBwNSpU/2OT58+ne+++46XXnqJsrIyv0/3oL7Rud1u7r///qD7dLlcVFZWNvuYAl1zzTVUVFRwww03UFtb2yE9ZkwmE+eeey7vvfee37RVcXEx//73vznjjDOCVl4999xzfqvtnn76aVwul/7cacGc4rNKzeFw8NRTT4Ucg8vl4tlnn/U799lnnyUrK4vRo0cf0+PTgq3mfg5XXXUVBoOBW265hT179rT5Ob/nnnuoqKjg//2//xfUgmDt2rU8/PDDjBgxImiV2PTp07Hb7bzyyissXrw4KDs1ZcoUUlJSePDBB0O2EtBaLxxPfoqPSUSeZIxEl/TJJ5+wbds2XC4XxcXFfP755yxZsoTevXvz/vvvt9jA77777uPLL79k2rRp9O7dm5KSEp566iny8vL0wtUZM2bw6quvMmfOHL7//nvOPPNM6urqWLp0KTfeeCMXX3wxF154IRMnTuSuu+5i3759FBQU8Nlnn/Hee+9x66236p9uNVdeeSW33347t99+OxkZGUGfeMePH88NN9zAQw89xIYNGzj33HOxWCzs3LmTt956i3nz5vn1PGrJiSeeyIgRI3jrrbcYOnQoJ510UpjPcPv87W9/03tE3XjjjZjNZp599lnsdjuPPPJI0PkOh4NzzjmHK6+8ku3bt/PUU09xxhlncNFFFwFw+umnk56ezsyZM7n55psxGAy89tprfoGSrx49evDwww+zb98+Bg0axMKFC9mwYQPPPfdcq52uWzNq1ChMJhMPP/wwVVVV2Gw2zj77bLKzswE1Y3beeefx1ltvkZaWxrRp09p0u1dffTWrV69m3rx5bNmyhauvvpr09HTWrVvHSy+9RLdu3Xj77beD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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "line_emp, = plt.semilogy(emp_timeseries, label=\"Empirical\")\n", "line_gt, = plt.semilogy(gt_timeseries, label=\"Good-Turing\")\n", "plt.legend(handles=[line_emp, line_gt])\n", "plt.xticks(range(0, measurements + 1, int(measurements / 5)),\n", " range(0, trials + 1, int(trials / 5))) # type: ignore\n", "plt.xlabel('# of fuzz inputs')\n", "plt.ylabel('discovery probability')\n", "plt.title('Discovery Probability Over Time');" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Again, the Good-Turing estimate appears to be *highly accurate*. In fact, the empirical estimator has a much lower precision as indicated by the large swings. You can try and increase the number of repetitions (`repeats`) to get more precision for the empirical estimates, however, at the cost of waiting much longer." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Discovery Probability Quantifies Residual Risk\n", "\n", "Alright. You have gotten a hold of a couple of powerful machines and used them to fuzz a software system for several months without finding any vulnerabilities. Is the system vulnerable?\n", "\n", "Well, who knows? We cannot say for sure; there is always some residual risk. Testing is not verification. Maybe the next test input that is generated reveals a vulnerability.\n", "\n", "Let's say *residual risk* is the probability that the next test input reveals a vulnerability that has not been found, yet. Böhme \\cite{Boehme2018stads} has shown that the Good-Turing estimate of the discovery probability is also an estimate of the maximum residual risk." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Proof sketch (Residual Risk)**. Here is a proof sketch that shows that an estimator of discovery probability for an arbitrary definition of species gives an upper bound on the probability to discover a vulnerability when none has been found: Suppose, for each \"old\" species A (here, execution trace), we derive two \"new\" species: Some inputs belonging to A expose a vulnerability while others belonging to A do not. We know that _only_ species that do not expose a vulnerability have been discovered. Hence, _all_ species exposing a vulnerability and _some_ species that do not expose a vulnerability remain undiscovered. Hence, the probability to discover a new species gives an upper bound on the probability to discover (a species that exposes) a vulnerability. **QED**." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "An estimate of the discovery probability is useful in many other ways.\n", "\n", "1. **Discovery probability**. We can estimate, at any point during the fuzzing campaign, the probability that the next input belongs to a previously unseen species (here, that it yields a new execution trace, i.e., exercises a new set of statements).\n", "2. **Complement of discovery probability**. We can estimate the proportion of *all* inputs the fuzzer can generate for which we have already seen the species (here, execution traces). In some sense, this allows us to quantify the *progress of the fuzzing campaign towards completion*: If the probability to discovery a new species is too low, we might as well abort the campaign.\n", "3. **Inverse of discovery probability**. We can predict the number of test inputs needed, so that we can expect the discovery of a new species (here, execution trace)." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "## How Do We Know When to Stop Fuzzing?\n", "\n", "In fuzzing, we have measures of progress such as [code coverage](Coverage.ipynb) or [grammar coverage](GrammarCoverageFuzzer.ipynb). Suppose, we are interested in covering all statements in the program. The _percentage_ of statements that have already been covered quantifies how \"far\" we are from completing the fuzzing campaign. However, sometimes we know only the _number_ of species $S(n)$ (here, statements) that have been discovered after generating $n$ fuzz inputs. The percentage $S(n)/S$ can only be computed if we know the _total number_ of species $S$. Even then, not all species may be feasible." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "### A Success Estimator\n", "\n", "If we do not _know_ the total number of species, then let us at least _estimate_ it: As we have seen before, species discovery slows down over time. In the beginning, many new species are discovered. Later, many inputs need to be generated before discovering the next species. In fact, given enough time, the fuzzing campaign approaches an _asymptote_. It is this asymptote that we can estimate." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "In 1984, Anne Chao, a well-known theoretical bio-statistician, has developed an estimator $\\hat S$ which estimates the asymptotic total number of species $S$:\n", "\\begin{align}\n", "\\hat S_\\text{Chao1} = \\begin{cases}\n", "S(n) + \\frac{f_1^2}{2f_2} & \\text{if $f_2>0$}\\\\\n", "S(n) + \\frac{f_1(f_1-1)}{2} & \\text{otherwise}\n", "\\end{cases}\n", "\\end{align}\n", "* where $f_1$ and $f_2$ is the number of singleton and doubleton species, respectively (that have been observed exactly once or twice, resp.), and \n", "* where $S(n)$ is the number of species that have been discovered after generating $n$ fuzz inputs." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "So, how does Chao's estimate perform? To investigate this, we generate `trials=400000` fuzz inputs using a fuzzer setting that allows us to see an asymptote in a few seconds: We measure trace coverage. After half-way into our fuzzing campaign (`trials`/2=100000), we generate Chao's estimate $\\hat S$ of the asymptotic total number of species. Then, we run the remainder of the campaign to see the \"empirical\" asymptote." ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:19.356593Z", "iopub.status.busy": "2024-01-18T17:30:19.356460Z", "iopub.status.idle": "2024-01-18T17:30:33.951090Z", "shell.execute_reply": "2024-01-18T17:30:33.950235Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "trials = 400000\n", "fuzzer = RandomFuzzer(min_length=2, max_length=4,\n", " char_start=32, char_range=32)\n", "population = []\n", "for i in range(trials):\n", " population.append(fuzzer.fuzz())\n", "\n", "_, trace_ts, f1_ts, f2_ts = population_trace_coverage(population, my_parser)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:33.954532Z", "iopub.status.busy": "2024-01-18T17:30:33.954306Z", "iopub.status.idle": "2024-01-18T17:30:33.957370Z", "shell.execute_reply": "2024-01-18T17:30:33.957081Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "200000" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "time = int(trials / 2)\n", "time" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:33.959023Z", "iopub.status.busy": "2024-01-18T17:30:33.958939Z", "iopub.status.idle": "2024-01-18T17:30:33.960962Z", "shell.execute_reply": "2024-01-18T17:30:33.960700Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "f1 = f1_ts[time]\n", "f2 = f2_ts[time]\n", "Sn = trace_ts[time]\n", "if f2 > 0:\n", " hat_S = Sn + f1 * f1 / (2 * f2)\n", "else:\n", " hat_S = Sn + f1 * (f1 - 1) / 2" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "After executing `time` fuzz inputs (half of all), we have covered this many traces:" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:33.962580Z", "iopub.status.busy": "2024-01-18T17:30:33.962503Z", "iopub.status.idle": "2024-01-18T17:30:33.964571Z", "shell.execute_reply": "2024-01-18T17:30:33.964304Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "200000" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "time" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:33.966060Z", "iopub.status.busy": "2024-01-18T17:30:33.965978Z", "iopub.status.idle": "2024-01-18T17:30:33.968054Z", "shell.execute_reply": "2024-01-18T17:30:33.967813Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "67" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Sn" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "We can estimate there are this many traces in total:" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:33.969621Z", "iopub.status.busy": "2024-01-18T17:30:33.969534Z", "iopub.status.idle": "2024-01-18T17:30:33.971520Z", "shell.execute_reply": "2024-01-18T17:30:33.971260Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "73.0" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hat_S" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Hence, we have achieved this percentage of the estimate:" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:33.973075Z", "iopub.status.busy": "2024-01-18T17:30:33.972980Z", "iopub.status.idle": "2024-01-18T17:30:33.975214Z", "shell.execute_reply": "2024-01-18T17:30:33.974970Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "91.78082191780823" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "100 * Sn / hat_S" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "After executing `trials` fuzz inputs, we have covered this many traces:" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:33.976805Z", "iopub.status.busy": "2024-01-18T17:30:33.976721Z", "iopub.status.idle": "2024-01-18T17:30:33.978768Z", "shell.execute_reply": "2024-01-18T17:30:33.978487Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "400000" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "trials" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:33.980279Z", "iopub.status.busy": "2024-01-18T17:30:33.980197Z", "iopub.status.idle": "2024-01-18T17:30:33.982381Z", "shell.execute_reply": "2024-01-18T17:30:33.982150Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "73" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "trace_ts[trials - 1]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The accuracy of Chao's estimator is quite reasonable. It isn't always accurate -- particularly at the beginning of a fuzzing campaign when the [discovery probability](WhenIsEnough.ipynb#Measuring-Trace-Coverage-over-Time) is still very high. Nevertheless, it demonstrates the main benefit of reporting a percentage to assess the progress of a fuzzing campaign towards completion.\n", "\n", "***Try it***. *Try setting `trials` to 1 million and `time` to `int(trials / 4)`.*" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "### Extrapolating Fuzzing Success\n", "\n", "\n", "Suppose you have run the fuzzer for a week, which generated $n$ fuzz inputs and discovered $S(n)$ species (here, covered $S(n)$ execution traces). Instead, of running the fuzzer for another week, you would like to *predict* how many more species you would discover. In 2003, Anne Chao and her team developed an extrapolation methodology to do just that. We are interested in the number $S(n+m^*)$ of species discovered if $m^*$ more fuzz inputs were generated:\n", "\n", "\\begin{align}\n", "\\hat S(n + m^*) = S(n) + \\hat f_0 \\left[1-\\left(1-\\frac{f_1}{n\\hat f_0 + f_1}\\right)^{m^*}\\right]\n", "\\end{align}\n", "* where $\\hat f_0=\\hat S - S(n)$ is an estimate of the number $f_0$ of undiscovered species, and \n", "* where $f_1$ is the number of singleton species, i.e., those we have observed exactly once. \n", "\n", "The number $f_1$ of singletons, we can just keep track of during the fuzzing campaign itself. The estimate of the number $\\hat f_0$ of undiscovered species, we can simply derive using Chao's estimate $\\hat S$ and the number of observed species $S(n)$.\n", "\n", "Let's see how Chao's extrapolator performs by comparing the predicted number of species to the empirical number of species." ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:33.983916Z", "iopub.status.busy": "2024-01-18T17:30:33.983838Z", "iopub.status.idle": "2024-01-18T17:30:34.040827Z", "shell.execute_reply": "2024-01-18T17:30:34.040534Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "prediction_ts: List[float] = [None] * time # type: ignore\n", "f0 = hat_S - Sn\n", "\n", "for m in range(trials - time):\n", " assert (time * f0 + f1) != 0 , 'time:%s f0:%s f1:%s' % (time, f0,f1)\n", " prediction_ts.append(Sn + f0 * (1 - (1 - f1 / (time * f0 + f1)) ** m))" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:34.042524Z", "iopub.status.busy": "2024-01-18T17:30:34.042431Z", "iopub.status.idle": "2024-01-18T17:30:35.587935Z", "shell.execute_reply": "2024-01-18T17:30:35.587662Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAycAAADpCAYAAAA+o0jwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAAxOAAAMTgF/d4wjAABgtUlEQVR4nO3deVxU9f7H8dew76CooCCgsqiAoIjirmVp3kozu7aYkhVat1tdW2zPm2X1q2j3amV6zSw1l25Wmpr7rmnuCioCCqLsO8PM+f0xMUkqDDDDLHyejwcPZWbOmc8wzJvv95zv+X5ViqIoCCGEEEIIIYSZ2Zm7ACGEEEIIIYQA6ZwIIYQQQgghLIR0ToQQQgghhBAWQTonQgghhBBCCIsgnRMhhBBCCCGERZDOiRBCCCGEEMIiSOdECCGEEEIIYREczF1AQzk7O9O2bVtzlyGEzbt06RKVlZXmLsNgkg1CNA/JBiHEXxkzF6yuc9K2bVsyMzPNXYYQNi8wMNDcJTSIZIMQzUOyQQjxV8bMBRnWJYQQQgghhLAI0jkRQgghhBBCWATpnAghhBBCCCEsgnROhBBCCCGEEBZBOidCCCGEEEIIi2B1s3UJIYQQwjCKolBeXk5JSQklJSVUV1cTHh4OwNGjR9m/fz9lZWV4e3tzzz33mLlaIcRflZSUcPjwYbRardlqiI6OxsvLq9meTzonQgghhIVRFIWKigoKCgrIz8+noKCA6OhoPD09yc/P5z//+Q8FBQUUFBRQVFSk73z88ssvODk5sXbtWu666y5KSkpQFEW/306dOnHmzBkAVq9ezXPPPQdAjx49pHMihAXavXs327ZtM2sNHTt2lM6JEEIIYYsOHz5Meno6ly5d4vLly/p/J0yYwLBhwwDo0qULmZmZVFVV1dp2+/bt9O/fn4qKCl588cVa97m4uODh4UFpaSlOTk60adOGhIQEPD098fDw0H/5+fnptxk7dizdunXD3d2d1q1bm/7FCyHqpCgKRUVFtQ4oFBYWAjBhwgRcXFya/ByVlZWUlZVRWlqq/yovLycwMJDg4GAAvv76ay5dukR5eTkjR46slRvNQTonQohml5uby4033qj/vqysjDNnzpCTk0N1dTUTJ07k9OnTODs7M3v2bAYPHmzGaoW4Nq1WS0lJif6I4pYtW9i8eTMXLlzgwoULZGVlkZWVxbhx43j//fcBeOKJJ9i4ceNV++revbu+cxITE0P37t1p1aoVPj4++q+OHTsCukUF9+/fT6tWrfD29sbLywsHh9p/zuPi4vjll1/qrD8sLIywsLAm/xyEEMbx888/s3fv3mve17FjR8rLy/VnTAsLCykoKMDBwYFRo0YB8MMPP7Bq1apajyktLeXmm2/mww8/BGD06NH873//u2r/r7/+uv6gx7x58zh16hQAUVFRODs7m+LlXpdJOyfSABFCXIuvry8HDx7Uf//uu++yefNmWrduzeTJk0lISGDNmjXs3buXO+64g7Nnz+Lo6Gi+gkWLVFZWhpubGwBHjhxh0aJFpKWlce7cOTIzM8nOzqZHjx7s378fgLVr1zJr1iwAHBwc8Pf3p3379rRr106/zyeeeIIJEybQtm1b2rRpQ9u2bWnbtm2tIRMrVqyosy4HBwd69epl7JdrEaTdIFqCmjMkbm5uODo6UlhYyMqVK1mzZg3nz5/H3d2dwsJCiouLee+99/Dz82PVqlWMHz/+qn1FREToOye///47X375JXZ2dvoDFx4eHrU6FyNGjKB9+/b6s6nu7u54eHjQt29f/WOWLVsGgJubW7OfNQETd06kASKEMMS8efN48803AVi6dCmpqakAxMfH06FDBzZv3szw4cPNWaKwYcXFxXz33XecOnWKlJQU0tLSSEtLIy8vj/LycpydnUlLS+Ptt98GwN/fn44dOxIXF0f37t31+5kyZQp33XUXHTp0oE2bNtjZXT0h5ujRo5vtdVkjaTcIa6YoCrm5uWRlZdGuXTt9w37y5MkcOnRIfzajsLAQtVrNCy+8QEhICLm5uTz//PO19uXg4ECbNm3o378/np6eqFQqHnzwwVpnU729vWt1Hp588kkef/xxPDw8rpk/AI8++mi9r6NHjx5N+Ck0XbMO65IGiBDir3bs2EF+fj633norubm5qNVq/P399feHhISQnp5uxgqFtVOr1Zw6dYojR45w/PhxfSfk448/JiEhAbVazeTJkwFQqVQEBgbSrVs3QkJCKC0txdnZmSFDhnDy5EmCgoKuO+47KCiIoKCg5nxpNk/aDcKSqNVqMjMzUalUhISEADBr1iw2btxIeno66enpVFRUAPDxxx/z2GOPAfD999+Tl5eHh4cHXl5edOnSBS8vLxRFobS0FAcHBx566CHc3d2Jjo5m3LhxeHl5oVKp9M8dExPDF198UWd9Hh4epnnhzazZOifSABFCXMu8efOYOHHiVWPm65OcnExycrL++5KSEmOXJqyMoiikpaVx5MgR/P39iY+PB3TTYJ48ebLWYwMCAsjNzQWgdevW/PDDD3Tp0oXOnTtfc3y1p6cnnp6epn8RQk/aDcIcqqur9X+P1q1bx7Jly0hJSSE1NZULFy6g1Wq59957efbZZykpKWHdunXs3r0bPz8/YmNj9UM2nZ2d2b59OwDPP/88RUVFvPLKKw3+W9cSNdtPSBogQoi/KikpYenSpfoLAH19fXFwcCA7O1vfCElLS7vm0ehp06Yxbdo0/feBgYHNU7SwKNu3b+f7779n//797N+/Xz+zzUMPPaTvnEyYMIHS0lKio6Pp1q0bYWFhVx1hvPXWW5u9dlE3aTcIUyotLWX//v0cPXqUI0eOcPLkSVJSUnB0dNSfoTt8+DCff/45Xl5ehIaG0rdvX4KCgoiMjGTVqlUADBgwgCFDhtQ6ywHoJ8ao4enpib29fbO9PmvWLJ0TaYAIIa5lyZIlxMTE0LVrV/1td911F3PmzGHGjBns3buX8+fPM2TIEDNWKSxBfn4+O3bsYPv27RQUFDB79mwANm3axDvvvIO7uzs9e/akV69eREdH17q486WXXjJX2aKRpN0gjKWiooLDhw+zd+9ejhw5wrPPPouPjw+7d+9m5MiR+se5u7vTuXNnwsLCyM/PR6VSMXbsWG677TbatGlTq/Nx4cIFli1bRkJCAlFRUQbV4e3tfVUHRlxbs3ROpAEihLiWefPm8fDDD9e67e233+b+++8nLCwMJycnFi1aJBe8tlCZmZm88cYbbNu2jSNHjuhv9/Ly4qOPPsLBwYHExETuuOMOIiIi5KikDZF2g2gKrVbLlClT2Lt3L0ePHqW6ulp/X3l5OSEhIVRUVHDTTTfRrl072rVrV+saj48++sig5/Hz8yMgIMAkr6Ela5bOiTRAhBDXsmPHjqtu8/Pzq3d9BmF7Ll68yIYNG1i/fj3PPfcc4eHhODo6MmfOHAICArj77rsZMGAAAwYMIDo6Wj/UJyAgQBoHNkjaDaI+iqJw9uxZtm/fzvbt29m1axcPPvgg//znP7Gzs2Pr1q2UlJQwatQoOnToQEFBAf369SM8PFw/k1XN2kKN4ejoWKvzLIynWTon0gARQgjbdi63lPwydYO22bN9C0d3bWTTxl85dOiQ/vZBgwYRHh6On58fGRkZBAQEyHCIFkbaDeKvtm3bxvHjxwH45Zdf+OWXXygqKtLf7+Pjw9atW/Wz6f3jH//Q/7+0tJTCwkJuu+02OnXq1PzFiwaRKQOEEEI0ydnLpQx7d1ODt8tZ8SblKbvw8/PjvvvuY/jw4QwfPrzWNQJyvYAQLZOiKBw/flx/RvXo0aNMmjQJT09PNBoNHh4eREdH06lTJzp16kSrVq1QqVSUlpbq93Hl//39/c2yoKBoOOmciAY5cr6Q7amXG7xdt/ZeDA5va4KKhBDmllVQDsDISH96BfsYvF1G2AvcHNWBgX16yZkRIWzQ0bRsFm85hlZRDN6mOP8yO5Z/QfrxA/rpvu3t7QkMDMTPz4+kpCSefPJJE1UsLIF0TkSDvLjyML9nFjZ4u3v7BknnRAgbodUqJH21j9OXdEcly6p0F5veHOnH2F4NONMxuIspyhNCWIjXlu9l96Vrr1R+PdpKOzJ3bKRtG1/69u1L586dCQ4OxsXFBV9fXxNVKiyJdE5EnRRF4UJhBcofRz0ul1TRuY07yeNjG7QfX3cnE1QnhDCHgnI164/n0MrNEX9vV1wc7enYyo34kNbmLk0IYWZnLlymQq07YJFXrkGFijnjwrBrwNlR9Z27ienkf9Xt7dq1M1qdwnJJ50TU6e01J5mz+XSt2/p0ak1sRx/zFCSEMAu1RsuiXecoKq+muEJ34fvfe3fk+VHdzFyZEMJSfPT9TpJ35l1xiyPOqmpG9I4wW03C+kjnRNTpzKUS7FTw0KDO+ttGRMoFZUK0NHvT8vj3D8dq3RbYytVM1QghLFHqRd3sWX3bavF21TUxe3fqYM6ShBWSzom4yqcbU/nlaDYAZy6V4u7kwAtydFQIm1ZcoSa/9PpTAddcX/LcLV0ZGtEWBzs7urR1b67yhBAW6tPVu/l67wUUoFBtBzjw77v60DVIDmSKxpHOibjK4t3pXCqupK2nM16ujgwKa2PukoQQJlRZrWHg2xspLK9/nZIIP0+6+ns1Q1VCCGvww6EsLlQ64Wmnxh6FELcqQvzl+jPReNI5aWHSc8tYczSLumb1yyutolewD98m9Wu+woQQZlNQpqawXE10gDf9Q68/G46XiyP9ushsOUK0FFl5Rfzn5/2oq7XXf0wpuKiqOTxrTPMVJmyadE5amPfXn2LlgfP1Pq6Dt4wlF8KarTmSzedbz+hn2qtL5R8Nj8HhbXhmRFdTlyaEsBIf/rCXb49X1PMoR/ycqpqlHtEySOfEBhSUVVFSWW3QY7MLK3BysGPplLrPinT19zRGaUIIM1l14Dz7z+Xj5+Vs0OMDfFzp11mGcAph6/KLy8jKKzLosecLdB2Tl4b6Edz2+sM5o68x7a8QjSWdEyt35lIJN72/BY3W8NVX23g4y1TAQtiI05dK2JF6+Zq3ezo7sPuF4WaoSghhiUrLK0mYtY5KpWHNvxG9utCxXSsTVSVEbdI5sXLn8srQaBWGhLclwsCzHb2DJWCEsBUvrzrCjtO517xPZtMSQlzpQl4RlYoD/k5V9PB3MWibYF936ZiIZiWdEyuRkVfGs98doqyq9vCtmtl1xsUFcluMzCUurEdlZSVPPfUUa9euxcXFhZiYGBYtWkRKSgqTJk3i8uXLeHt7s2DBAiIjI81drsXKK63C38uF5PExV90X2tbDDBUJIcyttLySce//TEFl7VEVusvLnOgd4MYnU0aYpTYh6iOdEyux+2weO8/k4uvuhIujfa37Ivw8iQn0MU9hQjTSc889h0ql4tSpU6hUKrKzdWvrTJkyhaSkJBITE/nuu+9ITExk7969Zq7Wcp3ILqarvyf9u8j1IkIInb2nMjle5IgTGpztas+05WOvZlhksJkqE6J+dXZOFi5cWOfGEydOrPcJ5OiocaTnlQHwyb29ZCpPYXZNzYbS0lLmzZtHZmYmKpUKAH9/f3Jycti3bx+//PILAHfeeSePPfYYqamphIaGGqd4G6IoCirVn7NtCWFO0mawHBfySgC4t4cXM+4dat5ihGigOjsnP/zwAwBFRUVs3ryZgQMHolKp2LZtG0OGDDEoaOToqHEUlOmm6fNwlpNdwvyamg2nT5+mdevWzJo1i/Xr1+Pq6sqMGTPw8fGhffv2ODjofs9VKhVBQUGkp6dL5+QvsgsreP3HYygKMsGFsAjSZrAcaZcKAdA2YLIcISyFXV13Llu2jGXLluHm5sa+fftYv34969atY9++fbi713+hZc3R0TfeeOOaR0cnTJgA6I6OZmRkkJqaaoSXZHsq1BqK/ri2JKCVrD8izK+p2VBdXc25c+fo3r07+/bt46OPPmL8+PFUVxs2JTZAcnIygYGB+q+SkpKmvCSrs+lkDqsPZeFkb0fvELlYVZiftBksQ5W6msvFlQDEhLQ1czVCNFydnZMaqampREVF6b+PjIwkJSWl3u2uPDrau3dvBg0axIYNG8jIyLju0VFxtVEfbmXVwQuoVODmZF//BkI0k8ZmQ1BQEHZ2dtx3330A9OzZk06dOnHu3DmysrL0nRRFUUhPTycoKOiqfUybNo3MzEz9l4dHy7r4O6tQt/7A4of7cl9fGT8uLIe0Gczrzvd+ZEWKbrSFr6cc0BTWx6DOiZeXFwsWLEBRFBRFYcGCBQY1BOToaNNptQpnLpfSua0774yLuepieCHMqbHZ0KZNG2688UbWrl0LwNmzZzl79iwDBgygV69eLFq0CIDly5cTGBgoQ7quISWnGABvV0czVyJEbeZsM4C0G7JKtTirqrm7mwuDojqZuxwhGk4xwIkTJ5T4+HjF0dFRcXJyUvr27aucOHGi3u0uXbqk2NnZKdXV1frbevfurSxZskTx9PRU1Gq1oiiKotVqFT8/PyUlJaXefQYEBBhSss24VFyhBE9frTy19KC5SxEtjCGftcZmg6IoyunTp5WhQ4cqUVFRSo8ePZTvvvtOv8+EhAQlLCxMiYuLUw4dOmS0em3JY4t/U4Knr1aqqjXmLkW0MPV91iypzWBIvbZEo9EowdNXK31fXmHuUkQLY8zPmUFXV0dERLBnzx6Ki3VH6jw9DVvs78qjo6NGjbrm0dHExEQ5OlqHjD9m6VJrZDYeYXkamw0AnTt3ZuPGjdfc586dO41Woy2a+OUetqZcwsnBDkd7g06AC9FspM1gPiXluuFcFRqVmSsRovEM6pxUV1fz4Ycfcvr0aWbPns3p06c5d+4cN9xwQ73bzpkzhwcffJDp06djZ2fH3LlzCQgIYO7cuSQmJjJr1iy8vLyYP39+k1+MrblUXMnKA+cBiA9pbeZqhLhaU7JBNN6es7o1jyYPlCEbwvJIm8E8ikoreGv5DgB6tJPhnsJ6GdQ5eeyxx9BoNGzbtg0AX19fxo8fz759++rdVo6ONt7CnWks3HkOgA4+LmauRoirNSUbROOpNQq9glrx6FA5ciwsj7QZzGPxpkMsPlYOgL+3s5mrEaLxDOqc7Nq1i4MHD9KzZ08AfHx8UKvVJi1MQEml7iLAbx5OIKGznDkRlkeyoflptAoarYKTgwznEpZJcsE8iv4Y0jU5xoPn7xpo5mqEaDyDOicuLrWP2ms0GrRauQbC1GquMwn389DP+S6EJZFsaD4XCspJyy1FrdEtquYk15oICyW5YB5V1RoAuge2xtFBZvYU1sugzkmPHj1YtGgRWq2W1NRU3n77bYYOHWri0oS6WtcIcZQjpMJCSTY0nztmb+diUaX+ew8Xg+JbiGYnuWAeVX8c0HRxkmwQ1s2gVm9ycjJbt24lOzub/v37o1KpeOutt0xdW4u060wuY2dvZ/Qn2/jlWDYgR0iF5ZJsaB5arcLFokoiO3gxc3Qkr4+J4rFhcr2JsEySC83n99MXGPraSvq9upIVRwsBcJazJsLKGdS99vDwYO7cucydO9fU9bR4a45k81t6Af5eLrg5ORAX3ApnOXMiLJRkQ/MoqtCN1+/q78X9/ULMW4wQ9ZBcaD5rDpwhrcwJV1U1DioFf6cqYrt0MHdZQjSJQa3euXPnUlio65E/9thj9O7dmy1btpi0sJYqNUe3ku26aYPZ/twNfDEpXq43ERZLsqF5XC7RDeeq+GNMuRCWTHKh+Zy7rGszvDsmnMOzxrDrtTto6+Nh5qqEaBqDOieffvop3t7ebN++ncOHD/PGG2/w9NNPm7q2FqmqWjdm1E3GjAorINlgGgfS83nr5xP6r/9sOgNAVAdvM1cmRP0kF5pPSaXugIW3uyw3IGyHQZ0TBwddQ/nXX39l4sSJjBgxgurqapMW1lLkllSSmV+m/ypTV+Pp7IC9nZwtEZZPssE0/m/NSeZsPq3/Wv5bJgCd2riZuTIh6ie5YDqXCko4di5b/1VSpeucdOnga+bKhDAegw7P29nZsWTJEpYsWcKPP/4IQFVVlUkLawn2peUxbs7Vi0qFtpNTssI6SDYYV1W1lrOXS7lcUkkHbxe+Teqnv8/Z0Q4/Lzk6Kiyf5IJpZOTkMzR5G5pax5XtUaHg4+5qtrqEMDaDOieffPIJb731Fg8//DDBwcGcOnWKG264wdS12byzl0sBGBnpT5Dvn0dEB4a2MVdJQjSIZINxPfvd76w6eAGAqACvWrkghLWQXDCN01l5aLAj2LWKiLZ/Hqjo1sEbV2dHM1YmhHGpFEVRzF1EQwQGBpKZmWnuMpokq7Ccp5b+zrncMs4XlPPNwwn06yKnZIVlsbbPmrXVey13/mcHJ7OLeXhQZwaGtSEuuJW5SxLiKtb2WbO2ev+qvFLNuOSfyCrVklftRGIPd2bcO9TcZQlRizE/Z3WeOXnvvfd46qmnmDZt2jXvT05ONkoRLc3etHx2nM6ltbsTkR286Orvae6ShGgQyQbjefOn42xJuQzAmUslBPi48sTwMDNXJUTDSS6YxqGzWRwtdMAJDa0dqhga2dXcJQlhUnV2Tjw8dNc+eHvLDDFNlVdaxcoD56nWaDmUqZtiMfnvMQyNaGfmyoRoOMkG4/lmTzpVGi3+Xi6093bhbz3am7skIRpFcsF4Siuq+OD7XZRUqMkuqgDgzm7uvDnpRjNXJoTpybCuZvLxhhTeW3eq1m2//Gsw4X5y1kRYJlN/1kJCQnB2dsbVVXch5/PPP8/48eNJSUlh0qRJXL58GW9vbxYsWEBkZKTZ622KgjLdwQm1RnvVfW+vOcmwiHZ8Mam3GSoTouEs+bN2LdZWL8CCdb8xY0NWrdueGdiGf9za10wVCVG3ZhvWVeOhhx7i7bffxtdXd13E5cuXefHFFw1a/dXYDRBLV1pZTX7Z1bOSnC8oB+CLib1p4+mMt6sjndq4N3d5QhhVU7IBYMmSJcTGxta6bcqUKSQlJZGYmMh3331HYmIie/fuNXbpzWrJ3gze/PnEde/v4COzcAnb0dRcaEnthtKKKs5dzLvq9pSsAgDuj3JjcLcA3Fwc6dctuJmrE8I8DOqc7N+/Xx8yAG3atGlQY6GlNEAqqzUMfPtX8svU131MfKfWeLvKrBrCNjQ1G/4qJyeHffv28csvvwBw55138thjj5GamkpoaGiT621uGq1CbmklWYW6YRmz7+tFe+/aHRGVSkW39nIGVdgOY+RCS2k3jHjrRzIrnK57f98wf26KC2/GioQwP4M6J39dPElRlCbNWW5rDZAahWVq8svURAV40b/L1dMBd27jLh0TYVOamg0TJ05EURT69OnDW2+9RUZGBu3bt9cv4qZSqQgKCiI9Pd0qs+EfX//GmqPZ+u/jQ1rT1tPZjBUJYXrGbjOA7bYbLlfa4Wmnpl/g1bng7erIzb1kcgzR8hjUOUlISOCxxx7jmWeeQVEU3n33XRISEgx+EltvgJy+VMILKw5TWK47YzI4rC3PjpTZNITta0o2bNmyhaCgINRqNS+99BKTJk1i5syZBj93cnJyrdl/SkpKGly/qaXkFNPKzZHbYzoQ5OsuHRPRIjS1zQC23W7ILSrlno/WUaxWqFAcCfGs5rNHbzF3WUJYDLv6H6KbHrCsrIz4+Hj69u1LZWUl77//vkFPsGXLFg4dOsRvv/1GmzZtmDRpUoMKTE5OJjAwUP9liQ2QHamX2X02j8sllQT7ujFAFlEULURTsiEoKAgAR0dHnnzySbZu3UrHjh3JysrSH3lVFIX09HT9Y680bdo0MjMz9V81MwWZg1qj5V9LDnLfF7tqfWXklxPs686/R0fx4MBOZqtPiObUlFwA2283bD96jlMljuRV2eFpV82QMFnnTIgr1XvmRKPR8MYbb/Dll1826gn+2gAJDw+v1QBxcHCotwFy5ZzpgYGBjarDWE5mF7PpZE6t23af1V3MNm9SPDEdfcxQlRDNrynZUFpailqtxsfHB4BvvvmGnj170q5dO3r16sWiRYtITExk+fLlBAYGWvyR0ZSLJaw8cB5nBzucHf485uPiYMfgMDlYIVqOprYZwLbaDSnnL/HfXw+j0f45MerZ3DLAjod6t+GZOweYrTYhLFW9nRN7e3s2btzYqJ3bWgME4LXVR9memnvV7XYq8POSGXdEy9GUbLh48SJ33nknGo0GRVHo3LkzCxcuBGDu3LkkJiYya9YsvLy8mD9/vjHLNhqNVmHdsYsUV6g5l1sGwDMjInhoUGczVyaE+TQlF8D22g1vrtzLr5l/XbFBdwAjqI1MhCHEtRh0zcmoUaN44403eOCBB2oNnfDy8qpzO1togIBuFq5LxZUAXCquxN/LhTn3x9V6jK+7E/7e0jkRLUtjs6Fz584cOHDgmvdFRESwc+dOo9ZpCrvP5jJ10f5at7WTAxRCNDoXwDbaDRqNlpOZuhEWl0rUgAMfje6Eq9OfTS4vdxfiw807EkQIS2XQIox2dn8OU1CpVCiKgkqlQqPRmLS4azHHYkrj/rODfefy9d9HdvDix8cHNWsNQjQ3Qz5rLTkbvj94nie+PcijQ7vQO6QVLg729OnUGgd7gy7lE8Jq1fdZs6RcgObPhgkfrGZbtkr/vQqF07NG1fq5CGFrmn0RRq326lWNW5Kzl0vp4O3CrTEdABga3tbMFQlhGVpqNqw8kMm/lvwOQJ9OrRka0c7MFQlhOVpqLtQ4X1SNPfbcGKRrYkUHtpKOiRANYFDnBHSLKh07doz777+fgoICysvLad++vSlrM7tqjZZ/fnOA3NIqhkW05YVR3cxdkhAWpyVmw6HMQgCGd2tHfEhrM1cjhOVpibkA8PCnP3O2zBEPOzWfPXqbucsRwioZ1JWfPXs2kydPZsaMGQDk5uZy7733mrIui5CZX87PR3QLqN3Yzc/M1QhheVpiNlSoNczfngZA8vhY3J0NPsYjRIvQEnOhxoYM3TTofTtcf9V3IUTdDOqcfPbZZ+zatUt/MVuXLl24dOmSSQuzBLvO6GblevrmcCYkBJu5GiEsT0vMht8zCvT/93CSjokQf9UScwHgQGomWuyIbVXNvMdGmbscIayWQZ0TZ2dnXF1da91Ws0qrLZu75QwA7b1d63mkEC1TS8yGSyW6mfv+b1wP7OxU9TxaiJanJeYCwMyVvwHQ1kPOmgjRFAZ1Ttq2bcupU6dQqXR/iBcsWHDNhY9sTVG5Gjcne8b2CjB3KUJYpJaYDRtP6I4Ae8pwLiGuqSXmAkBhhW4igI8fHm7mSoSwbgb9df3ggw+45557OHHiBB07dsTLy4vVq1ebujazyi2pJLe0irjgVvqAFULU1hKzoWam4H5dfM1biBAWqiXmAsDpUkcc0eDi5GjuUoSwagZ1TkJDQ9m9ezcnT55EURQiIiKwt7c3dW1mlVVYAYC/LKomxHW1tGworaxm6T7dPO6eLtIAEeJaWlouAJRXqgFwtmvZ0ygLYQwGDeuaMmUKGo2Gbt260b17d4qKirjtNtueIm/xnnQA4kNambkSISxXS8uG9LwyAFq5OWIv15sIcU0tLRcAvvr1IADRbWy7EyZEczCoc+Lo6Ejfvn05ffo0O3bsoHfv3gwdOtTEpZlXysViAHrLGgZCXFdLy4ZtKZcB+MewUDNXIoTlamm5ALDtVA4AMR19zFuIEDbAoGFdn3zyCcuWLSM+Ph53d3eWLl1Kv379TF2b2VRVa9mblk9QazeiArzNXY4QFqulZcOmPxogXdp5mLkSISxXS8sFgD3Z1YADj46KN3cpQlg9g86cFBQUsGjRIvr27YubmxsbNmwwdV1mtfOP9U2qqmXsqBB1aSnZkJlfxoH0fPJKdTP4DYtoZ+6ShLBYLSUXapy+cJkKRXes18NVphEWoqkM6pz07t2b/v378/PPP7Nv3z4OHTrETTfdZOramp1Wq5CZX8bZSyUAPHVzuJkrEsKytYRsyC+tYug7m7hj9g6OZxXRwUfWPRKiLi0hFwC0Wi0p5y+xL+UCAIPag52dQc0qIUQdDBrWNX/+fAYNGgSAp6cnS5cu5dNPPzVpYebwwsrDfLs3Q/+9NEKEqJsxsmH+/PlMnjyZlStXMmbMGHJycpg4cSKnT5/G2dmZ2bNnM3jwYFOUb5BLJZVUaxUGhbVhUFgb4uU6NCHq1FLaDK99u4UFh0r133fydTNjNULYDoO6+IMGDWL58uXMmjULgPPnzze4sTB//nxUKhWrVq0CICcnh5EjRxIWFkZUVBRbtmxpWOUmcOZyKa6O9iQN7szTN4dLI0SIejQ1G9LS0vj8889JSEjQ3/bcc8+RkJBASkoK8+fP595770WtVhu9dkO9/fMJAAaFtSFpcBd6BskMfkLUpaW0Gc5e1nVMBreHWzs78NDNseYtSAgbYVDn5JVXXuGLL75gwYIFuo3s7JgyZYrBT2INDZDjWUXsOZuHr4cTL4zqxmM3hOHkIKdnhahLU7JBq9Xy0EMP8fHHH+Ps7Ky/fenSpUydOhWA+Ph4OnTowObNm41eu6FO5ehm7hsY2tZsNQhhTVpCm+HC5UI260Zz8dGDN/BJ0giC2smBCyGMwaDW9/fff8/q1atxd3cHoH379pSUlBj0BNbSANmacgmATm3czVaDENamKdmQnJzMgAEDiIuL09+Wm5uLWq3G399ff1tISAjp6enGLbwBqjUKsR196N7By2w1CGFNWkSb4eg5AFQoeLk51/NoIURDGHTNiaur61WruyqKYtATWEsDRK3RvZ7pI7uarQYhrE1js+HIkSMsX768SUMzkpOTSU5O1n9vaOOnodQaLU72chZVCEO1hDZDpboagH/2bSUXwQthZAZ1ToKDg9m6dSsqlQq1Ws2sWbOIjY2tdztraoDUTBssQ7mEMFxjs2Hr1q2kpaURFhYGQHZ2NklJSfz73//GwcGB7OxsfUMkLS2NoKCgq/Yxbdo0pk2bpv8+MDDQOC/qChVqDZdLqojwl9XghTCUOdsM0Dzthpo2g7OjQc0oIUQDGNQS/+ijj3jjjTc4fPgw7u7u7Nixg/fff7/e7a5sgISEhLBr1y6SkpJYunSpvgFSo64GSGZmpv7Lw8M0i59l5pcD4ChHSIUwWGOz4ZFHHiErK4u0tDTS0tJISEjgs88+45FHHuGuu+5izpw5AOzdu5fz588zZMgQU7+Uaxrz6XYAXB3t63mkEKKGOdsM0Dzthsw8XYfH2UGyQQhjM6jL7+fnx5o1aygrK0NRFP040vo88sgjPPLII/rvhw4dypNPPsmYMWPYvXs3c+bMYcaMGWZvgHy9+xzLf8sEwMVROidCGKqx2VCXt99+m/vvv5+wsDCcnJxYtGgRjo6ORqi24c5c0s3G8+RwWfNICEPZepth9e7j+imEXZ3kzIkQxtagT5Wbm/Hm8LbEBsiUwZ1p7y1rmwjRUE3Nhk2bNun/7+fnxy+//NLEippu9aELVGm03NqjPVEB3uYuRwirY6tthhOZeQAEuFRxe4JcpyqEsTVrl98SGyAFZVXM23YWgEeHhpq5GiGEpfjfQd08oUPCZQphIczBEtsMGo2W2XvzADueuTkcTzcXc5ckhM1p8ecjf88sBEClAk+XFv/jEKLF25uWx4msIk5fKsHTxYG7enc0d0lCCAtx7mIe2j8u1+0TbvxJOIQQjeicFBYWkpGRQVRUlCnqaTY5RRX87/cLHMsqAuCD8bHY2cmMPEI0lq1kw+T5eymu1E0TGtbONBNwCNFS2EouFJSU89EPe7hQoJs8Z1SIPR3ayHBPIUzBoKu/R44cSUFBASUlJcTExHDrrbfyyiuvmLo2k5q37Syv/3icFb+dB6CDj1xrIkRD2Vo2qDVaiiur6d/Fl8UP9+Xrh/qauyQhrI6t5QLAfzcc5MvfS1hzTgNIm0EIUzKoc3Lx4kV8fHz46aefGD16NCkpKaxcudLUtZnUpeJKABY/1Jf104YQH9LazBUJYX1sLRsOn9cN8+zg40r/Lm1o5yXjyYVoKFvLBYDc4goApsR5sfDebjx/1yAzVySE7TJoWJdarQZgy5YtjBw5EkdHRxwcrPv6jBUHdGdM4ju1lrVNhGgkW8uGi4W6Boifl7OZKxHCetlaLgCsPVUAODGoWyADozqZuxwhbJpBrfKoqChuueUWVq9ezQ033EBZWZmp6zI5X3cnQBZdFKIpbC0bqjS6VZ+jZepgIRrN1nIBwM1Bd01qv27BZq5ECNtn0KGMBQsWsGbNGmJiYnBzc+P8+fO8+eabpq7NpKo0WgaGtjF3GUJYNVvLBrVGAeSghRBNYWu5AKBRFNxU1dhLNghhcgZ9ylxcXOjYsSPbtm0DdAsrxcTEmLQwU1NrtDg5SMgI0RS2lA1qjZa1R7MB6ZwI0RS2lAs1qrVgp1LMXYYQLYJBf4Fnz57N5MmTmTFjBgB5eXnce++9pqzLpLamXKJCrcXRXqYOFqIpbCkb1h7NZt2xiwD4uJln5WkhbIEt5QLApt9Pc6HSCWkyCNE8DOqcfPbZZ+zatQsvLy8AunTpwqVLl0xamClN/Wo/AG095aJXIZrClrLh8h8z+D1+Q6hccyJEE9hSLgC8tPIQAN5OcuZEiOZgUOfE2dkZV9fac3pb68wbVdVaSqs0dGrjziu3Rpq7HCGsmi1lQ0pOCQDDu/uhUskhUiEay5ZyAaBYrcuD5U/cZOZKhGgZDOqctG3bllOnTun/YC9YsICgoCCTFmYqxRW6KQ7jglvJNSdCNJEtZYO7s67x5OkiQ7qEaApbygWAQo0j/k5VtPXxMHcpQrQIBh3K+OCDD7jnnns4ceIEHTt2xMvLi9WrV5u6NpMoqawGQKOV07NCNJWtZMN/Np3m1xM5AHi5WO8RXiEsga3kQg17tKilySBEszHor3BoaCi7d+/m5MmTKIpCREQE9vb2pq7N6H4+nMWHG1IA6NzG3czVCGH9bCEb8kqreHvNCQACfFzxcpUzJ0I0hS3kAsD631L49/+OoMGJQA8ZaSFEczHo0/bDDz9QVFREt27d6N69O0VFRfz444+mrs3oVh08z4nsYjq1cSehi6+5yxHC6jUlG26++WZ69OhBbGwsgwYN4sCBAwCkpKTQv39/wsPDiY+P5+jRo6Z8CZRU6M6mPjAghM3PDJVphIVoIltpM/xv/xkyKpxwt1MzNKKtucsRosUw6K/wyy+/jI+Pj/57Hx8fXn75ZYOewFIaIADHsorwcHZg49NDiQ9pbfLnE8LWNSUbli5dyqFDhzh48CDTpk0jMTERgClTppCUlMSpU6eYPn26/nZTOXNZdyG8k70dDtIxEaLJmpILYDnthrO5FQAsn9qPf43pb9LnEkL8qVF/iVUqFRqNxqDHWkoDBKBSrdVfcyKEML6GZMOVjZfCwkJUKhU5OTns27ePCRMmAHDnnXeSkZFBamqqKcoFoLJaC0BAK9d6HimEaIyG5AJYTruhvFp3oYl/ay+TPo8QojaDOieenp7s2LFD//327dvx9PQ06AkspQECUFiuplt7CRkhjKUp2QAwceJEOnbsyMsvv8xXX31FRkYG7du31087qlKpCAoKIj093ei11/hmj27f/l4uJnsOIVqSpuaCpbQbStUKKhR8POTAhRDNyaAL4v/v//6PO+64g65duwK6U6srV640+EkmTpzIxo0bAfjpp5/qbICEhoY29DUY5GBGAZXVWnzdnUyyfyFaoqZmw8KFCwH473//y/Tp05k5c6bB2yYnJ5OcnKz/vqSkxOBtr1RWqTuiGxfcqlHbCyFqa2ougPnbDVl5RWRVOuGmktEWQjQ3gzon/fr14/jx4+zcuROA/v371zqyUR9LaICkXS4FoFeQT6O2F0JcranZUGPSpElMnTqVwMBAsrKyqK6uxsHBAUVRSE9Pv+YaCdOmTWPatGn67wMDAxv1Gk5kF9GxtSu+Hs6N2l4IUZsxcsHc7YbTF3IBaOuibfC2QoimMfiak1atWjFq1ChGjRrVqMYH6BogGzdurNUAAeptgGRmZuq/PDwatwjS6Uu6cOrTSWbpEsKYGpMNBQUFXLhwQf/9qlWr8PX1pV27dvTq1YtFixYBsHz5cgIDA012RhXA2dGeglK1yfYvREtkjDYDmK/dcC6nEIBBnb0bXbsQonEM6pykpKRwyy230KFDB1q3bq3/qo8lNUCc/piFx9lRZuMRwlgamw2FhYWMGTOG6OhoYmJi+OSTT1i9ejUqlYq5c+cyd+5cwsPDeeutt5g/f75JatdoFU5dLKZCrZFr0YQwosbmAlhOu6GqWjfcU62R1ReFaG4GDet6+OGHeeSRR3jttdf49ttv+fjjjwkJCal3u8LCQu666y7Ky8uxs7Ojbdu2tRogiYmJzJo1Cy8vL5M1QBRFYcVv59lx+o9TtDJ0QwijaWw2BAcHs2fPnmveFxERoR8OYkofbkjhoz8WZW0t16IJYTSNzQWwjHbDol8P8MPv5wF7wvzlzIkQzU2lKEq9hwV69erFb7/9RnR0NIcPH0ZRFPr27XvdxoUpBQYGkpmZafDjT10s5ub3twDg5GDHvpeG4+UiK0ALUR9DPmvWnA3TlhxkxYHzPHFjGLf2aE+Yn+GzCQnRktX3WbOkXICGZUOVupquL/+M9o+BJfPGR3BjT9ON6hDCVjT0b3BdDBrj5Oioa8x7enqSlpZGZWUlly9fNkoBppaRVwbAQwM7senpodIxEcKIrDUbfj1xkRUHzgPw5PAw6ZgIYUTWmgsAmZcK0GJHNy81Kx6MkY6JEGZg0LCuwYMHk5uby2OPPUZcXBxOTk7cfffdpq6tyXKKKnjwv/sAiPD3pIOPzFUuhDFZazasOZINwC1R/qhUKjNXI4RtsdZc0Gq1jPhoB2BPgLcTvcIaNwOgEKJp6h3WpSgK2dnZtG/fHoCMjAwKCwuJiopqlgL/qiGnjX5Lz2fs7B14uTiwdfoNeLvKWRMhDFXfZ81as0GrVQh76Wc0WoXTs0ZhbyedEyEaoq7PmqXlAhieDUWlFfSYuQGAH6b0IrpTe1OXJoTNaPZhXTfddJP+/x07djRryDTE3M2nAXh2ZFfpmAhhAtaYDQczC9BodcdkpGMihPFZYy4AfPKj7pqYwe2RjokQZlRv50SlUhEYGGg140WvlHJRt7aJrPwshPFZazYUlunWNJk+squZKxHC9lhrLgDsOpMPwNCu/mauRIiWzaBrTjw8PIiNjWXUqFG1FjO6cgVWS3Tmcik9g3xkDQMhTMQas2F7qq7R1MHHxcyVCGGbrDEXAM4UKTigYfKIOHOXIkSLZlDnJDo6mujoaFPXYlS5JZUAFJbLys9CmIo1ZoOjg+6EcWi7hq8aLYSonzXmAkCF1o5q7M1dhhAtnkGdkzvuuIMePXrUuu3QoUMmKchYyqp0q7sO6NLGzJUIYbusMRuqqrUAtHKThReFMAVrzIUaHZyrzF2CEC2eQRfEJyYmGnSbJanS6BogXq4G9b+EEI1gjdmg/iMbHO0Nij8hRANZYy4AaFHh7SyTZAhhbnW23HNycsjOzqa8vFy/yitAYWEhpaWlzVJgY9U0QJzs5RStEMZmzdlw7EIRAE7SORHCqKw5F7RaLVrscLTTmrsUIVq8Ojsn33zzDR988AEXLlzg9ttv19/u7e3Ns88+a/LimuJAegEAjg5yFEQIY7PmbDh8vhAAFyfpnAhhTNacCycycgBwsJc2gxDmVmfn5IknnuCJJ55g5syZvPzyy81Vk1FcKCgHoL23zMgjhLFZczbY26kI8XXD2UHOqgphTNacC1uOpAPgJJ0TIczOoEOH1hYyAGcu6U4hJ3T2NXMlQtgua8sGtUZLWZWGcD9Pc5cihM2ytlwASM/VrYt2a2ygmSsRQtjsuIaaa068XGRleCGETnFFNQAlldVmrkQIYUmKKnTLDjjKdapCmJ1Jp7KqqKjg7rvv5tixY7i6utKuXTv+85//EBoaSk5ODhMnTuT06dM4Ozsze/ZsBg8ebLTnVv1xZtbNSYJGCEtjrmyoOWghZ06EsDzmbDPY/9FoCGrr3ajtFUXRfwlhq1QqFXZ2pj+vUWfn5M4772T58uX83//9X6MvZktKSuKWW25BpVLxySef8NBDD7Fp0yaee+45EhISWLNmDXv37uWOO+7g7NmzODoa50yHWqPg5GCHSiXjR4UwNmvNhpo1TpwcbPaksRBmY625AH8euHBp4AFNrVZLTk4OBQUF0jERLYKjoyNBQUE4OZlurbA6OycnT55EURS+/fbbRgWNi4sLo0aN0n+fkJDAu+++C8DSpUtJTU0FID4+ng4dOrB582aGDx/e4Oe5FrVGi7NMFSqESVhrNvy5xokctBDC2Kw1F0B3QBPA1alhnZ1z585hZ2dHSEiI0TpKQlgqRVHIzc0lPT2d0NBQkz1PnZ2Tvn374unpSWVlJa1bt65VnEqlIi8vr0FP9uGHHzJ69Ghyc3NRq9X4+/vr7wsJCSE9Pb2B5V/fqYvFMiWgECZirdlQc61JzRkUIYTxWGsuAGQUVgKOuDSgc6LVaqmoqCAsLAwHB1nwWbQMvr6+5OXlodVqTTbEq85P07x585g1axY33HADP/30U5OeaNasWaSmprJhwwbKy8sN3i45OZnk5GT99yUlJQZt5+flwqHMwgbXKYSon7VmQ82ZE0+ZKEMIo7OEXIDGZYO3s244l7uL4UNVaoZxyfBx0ZLU/L6bchhjvV19Pz8/duzYgbe3d6M/iO+++y4rVqxg/fr1uLm54ebmhoODA9nZ2fojIWlpaQQFBV217bRp05g2bZr++8BAw6b5S80pIdzPo0F1CiEMZ43ZcL6gAoA2Hs4NqlMIYRhz5wI0MhuKqwEnfDxcG1SrEML4DDofU1ZWxqhRo3B1dcXNzY1bb72VrKwsg54gOTmZb775hnXr1uHj46O//a677mLOnDkA7N27l/PnzzNkyJCGv4LrsFepKCxXG21/QoirWVs22P3RRqrWyrAuIUzF2nIBoKb75Ggji7MWFxfj4eHBgw8+aNDjN23axJo1a5r8vGlpabXeNyEaw6DOSVJSEgMHDiQ7O5usrCwGDhxIUlJSvdtlZmby1FNPUVBQwLBhw4iNjaVv374AvP322+zYsYOwsDASExNZtGiR0S8mC2zlZtT9CSFqs7ZsqBnW5e/lYpT9CSGuZm25ALrlBxzRGG1/5rZkyRLi4uJYsWKFQcPajNU5MQatVovWSAeQqqtlTStrZNAVXBkZGfzwww/675977jliY2Pr3S4wMPC6Y9L8/Pz45ZdfDKuyEdRaLV4ucoGaEKZkbdmgrtY9p6NMJSyEyVhbLgBUa8HZznbOqM6bN4+XX36ZuXPnsmTJEv0ZlMLCQp566il27dqFvb09cXFxPP7448yZMweNRsOmTZsYO3YsEydOJDY2loKCAkB33Y6np6f+/bnvvvs4efIkVVVVdOzYkXnz5tWasOBaZsyYweHDh8nPz+fChQuEhYWxYMECfH199feVlJSQkZHBunXr+PXXX3nnnXcA6NixI5999hkBAQGo1WqeeOIJ1q9fT+vWrRkwYAD79+9n06ZNbNq0iX/84x8kJCSwf/9+XnzxRWJjY3nyySfJycmhsrKSpKQkHnvsMcrLy0lMTOTw4cM4Ojrqf8dSUlJITEykpKQErVbL6NGjef311033ZomrGNR6VxSl1ljP7Oxsi5/PW61RcJSphIUwKWvLhopq3ZFRJ8kGIUzG2nIBQKOAMSb4/Oabb8jPz2/6jq6hVatW3HPPPfU+7tixY2RkZDBixAiqq6t566239J2TJ598EldXVw4dOoSdnR2XLl2ibdu2TJ06lYKCAj744ANANzyrLh988AFt27YF4K233mLGjBn6YXd12bp1K4cOHcLf359HH32U559/ns8++wyAnTt3cuDAAfz8/Dhy5AjPPPMM+/fvJyAggDfeeIOHHnqIn3/+mc8++4yUlBSOHj0KUGv6aYDjx48ze/Zs5s2bh0ajoW/fvixatIiuXbtSVlZGQkICffv2JTMzk4KCAo4dOwagn03uk08+4dZbb+X555+vdbtoPgZ1Tp5++ml69uzJLbfcAsCaNWv0vVlLVFmtQaNV5OioECZmbdlwML0AAHs7mV1HCFOxtlwAuFjlhK9DlbnLMIp58+YxceJE7O3tGTVqFFOmTOH48eN069aN1atXs3v3bv0UsDUdjIZavHgxX331FRUVFVRUVNCmTRuDtvvb3/6m77QmJSUxduxY/X2jRo3Cz88PgI0bNzJy5EgCAgIAePTRR3nttdfQaDRs2LCBCRMm6If1TZo0iS+++EK/n86dO+uvRzp58iRHjx7l7rvv1t9fXFzMsWPHGDRoEMePH+fRRx9lyJAh+k7O4MGDeeaZZygpKWHIkCFGW0tHGM6gzsn9999Pr1692LhxIwBPPfUUkZGRJi2sKc7n66YdLCyTC+KFMCVrywYvV90fsxBfdzNXIoTtsrZcALBDS7Gm6RfDG3Jmw5TUajVfffUVjo6OLF68GNBNUDBv3jz9gpaGcHBwQKP58xqciooK/f+3bdvGRx99xM6dO2nXrh3/+9//eOWVVxpV75UzuXl4XH+G1bpmfPvrfVfuR1EUWrduzcGDB6+57bFjx/j1119Zv349zz77LAcPHuTOO++kf//+rFu3jk8++YQPPvigyVNji4Yx+KKMyMhIiw+XGjUrvcYFtzJzJULYPuvKBt2Ycmc5qyqESVlTLmi1WrSoCPe2/mtO/ve//9G5c2d27dqlv+348eMMHTqUN998k9tvv513332XTz75pNawLi8vL86dO6ffxt/fH0VROHbsGN27d2fhwoX6+/Lz8/H09MTX15eqqirmzp1rcH0//fQTFy9exM/Pjy+++OK6ZyWGDRvGG2+8wYULF+jQoQNz5szhxhtvxN7enhtuuIHFixdz7733AtSq7a8iIiLw8vJi/vz5PPDAAwCkpqbSunVrysrKaNWqFbfffjsjR45k1apVZGRkcPnyZbp06cLEiRPp06cP/fv3N/j1CeOwyb/QNQ0QJ2mACCGuUJMNDsYYXC6EsAnVGi2gwtEGhnvOmzeP++67r9Zt3bp1IyAggB9++IH333+fyspKoqOjiY2N5YUXXgDgjjvu4ODBg8TGxvLaa6/h4ODAxx9/zK233kp8fDxq9Z8jUUaOHElERAQREREMGjTIoMkOagwaNIh7772Xrl27cu7cOWbNmnXNx0VFRfHOO+8wcuRIevTowdatW/n8888BmDJlCiEhIXTv3p0BAwbQpUuX605f7ODgwOrVq1mxYgU9evQgMjKSBx98kPLycg4fPsyAAQOIiYmhZ8+e3H///fTo0YPvvvuO6Ohoevbsyfjx4w26lkYYl0qx9KvU/iIwMJDMzMw6H/Nbej5jZ+/gxVHdeHhw52aqTAjbYshnzZIYUu/f5+5kz9k8TswciYujbaxnIERzs7VsKCqtoMfMDcS30bLs6dsM3q9Go+HUqVOEh4djby95Up8ZM2bUuui+KYqLi/H09EStVnPfffcRFxfH9OnTm16kqNf1fu+NmQs2Odfu5eJKABSsqt8lhDCxmuFcMluXEKJGYWm5uUsQDTR8+HAqKyupqKhg4MCBPP744+YuSRiRQZ2Tr7/++qrThJasZgph6zonJIT1sbZscLBToVKBXROGb2i1WoufFlWIplCpVPrZnBrD2nKhvEq3UF9FtfVfc2LJZsyYYbR97d6922j7Epanzs5JzfjDTz/9VB80d955J8uXL2+W4hqrWqtrOLTxcDZzJULYJmvNBo0Cro0czlVVVUV6enqtsddC2CpHR0eCgoJwcnIyeBtrzQX1H+sftfcy/LUKIUynzs7JrFmzOHDgAAUFBXz00UfExcWRmpraXLU1muaPzomsZSCEaVhrNmi1CvZ1TElZl/T0dP0MNXVNaymEtVMUhdzcXNLT0wkNDTV4O2vNheo/Jsqwk8+1EBahzs7J0qVL0Wg09OzZE4DPPvuM1NRUhg8fzvDhw3nuueeapciG0v4x5KIpQzeEENdnrdmg0SqNygWtVotarcbX1xcHB5u8VE+IWnx9fcnLy0Or1Ro8xMt6c0HXOZFL0YSwDHX+lb3pppsYPnw4KpWKf/7zn6hUKg4dOsQXX3zBunXrmqvGBtOfOZGjIEKYhNVmg6I06oxqzTUmcsZEtBQ1v+sNub7KWnOh5syJtBmEsAx1Hif47LPPaNWqFefPnyciIoKBAweSlZXF6dOnmThxYnPV2GA1Z07kKIgQpmG12aBVbGboRlVVFdOnTyc0NJRu3boRHR3Nf//7X5M+5759+xg/frzR9/vggw/SvXt37rjjDqPud86cObzzzjtG3aelGjVqFCdPnjRrDdaaCzVnTmxltIVkQ/0kGyxbnWdOOnXqRFJSEvPnz2fnzp1kZmYyePBgVqxYwZNPPsnhw4ebq84GqTlzYiuNECEsjdVmg6LYzEGLxMREKisr+f3333F3dyctLY1bbrmF6upqHnzwQZM8Z+/evVmyZIlR93nx4kW+/fZbioqKjL5WxNSpU426P0v2008/mbsEq80F/ZkTG+mcSDbUT7LBshn0Z/qBBx4AdAuseHt78+mnnxocMo8//jghISGoVCoOHjyovz0lJYX+/fsTHh5OfHw8R48ebXj11yEXxAvRPBqbDebIBdBlgy0M3UhJSWHVqlV89tlnuLu7AxASEsJ7773Hv//9bwA2bdpEVFQUjz76KDExMURGRrJv3z79PubOnUt4eDi9evVi5syZtYasrV27ll69etGjRw+GDBnCsWPH9PusWQ06LS0NHx8fXn31VeLi4ggNDa31R/D777+nW7duxMTEMH36dNq0aUNaWlqt11FQUMCwYcOoqKggLi6Ot956iwULFjBmzBj9Y1avXs3QoUMBeO2114iNjSU2NpaoqChUKhXnzp1j6tSp+tvDw8P1r2XGjBk8+eSTACxYsIDhw4dzzz33EB0dTe/evTlz5oz+eV599VVCQ0OJj4/npZdeIiQk5Jo/+8LCQh566CGioqKIiYlh8uTJAGzYsIF+/frRs2dPIiMjmTdvnn6bxMREkpKSGD58OJ06dWLy5Mns2bOHoUOH0rlzZ6ZNm6Z/7NChQ/nnP/9JfHw8oaGhPPXUU/qhVcnJycTHxxMbG0t8fDw7d+7UbxcSEqL/LJ04cYJ+/foRGRnJ2LFjufnmm1mwYIG+lilTpnDjjTcSHh7O2LFjqaqquuZrbSxrbTPYwgFNyQbJBkvOBkMZdGVnUlKS/v8//PBDg55g3LhxPPvsswwcOLDW7VOmTCEpKYnExES+++47EhMT2bt3b4P2fT3ZhRWA7ZyiFcJSNTYbzJELACkXS/Bxc2zyfh76717O5ZYZoaKrBfu68cWk+Dofc+DAAcLCwvD19a11e79+/cjIyODSpUuA7g/RvHnzmD17NnPmzOHFF19k7dq1HDlyhBkzZnDgwAH8/f159dVX9fvIycnh3nvvZdOmTURHR/P1118zbty4azYGCwsL6dGjB//+979Zs2YNTzzxBKNGjSInJ4fJkyezfft2unbtyvz588nNzb1qex8fH3766SdiY2P1fzxr/lBeyyuvvMIrr7wC6H73+vbtS3BwMHPmzAGgurqa2267jfvvv/+a2+/du5eDBw/SqVMnnnvuOd5++23mzp3Ljz/+yPLlyzlw4AAeHh76RsW1PPnkk7i6unLo0CHs7Oz0P+tevXqxbds27O3tycvLo2fPnowYMYLAwEAADh8+zMaNG7Gzs6N79+7k5+ezbt06qqqq6Ny5Mw8++CCRkZEAHDt2jB07dqBWqxk8eDDffPMN9957L/fff7++sbJr1y4SExM5ceLEVTXef//9PProozzwwAMcP36cnj17cu+99+rvP3jwIBs3bsTZ2ZnBgwezfPly7rnnnuu+5oaytjZDQamuzWCMA5qSDTqSDZINTdHgAQ41P0xDDR48+KptcnJy2LdvHxMmTAB086BnZGQYbcpB7z8aH5VqWVBJiObSkGwwRy4AdGztSk5xpdH2Z+lCQ0Pp27cvoGucnD59GoBff/2VkSNH4u/vD8DDDz+s32b37t1ER0cTHR0NwH333ceFCxc4f/78Vft3cXFh7NixV+1/165d9OjRg65duwIwadKkBq2XUZ/XX3+d9PR05s6dW+v2Rx55hICAAF5++eVrbtevXz86dep0Vb0bNmzgrrvuwtPTE5VKVefQl9WrV/P000/rZ7Bq27YtALm5udx1111ERUVxww03kJuby5EjR/TbjR49GhcXF5ycnIiOjmbEiBE4Ojri7u5O9+7dSUlJ0T924sSJODo64ubmxoQJE1i/fj2ga3gOGTKEqKgopk6dysmTJykvr726eVFREQcPHtRf49GtW7erGvp33HEHbm5u2Nvb06dPH/3PwRSsoc1Qc8Ykr9Q8R4nNQbKhNskGnebMhrqYZU7MjIwM2rdvr5+SU6VSERQU1OA51a+nZnIRb9emHyEVQjQPU+cC6LIhxNetyfup7+ilqfXs2ZOUlBRyc3NrHSHduXMnHTt21P9RdHFx0d9nb29PdXX1NffX2FnInJ2d9dva29uj0WgatZ8rOTg41NpPRUVFrfsXLlzIihUr2LJlS61pnWfOnElmZmadR+pN+fOYOnUqo0aNYvny5ahUKnr16lWr9r8+t6G11NRTVVXF2LFj2bhxI/Hx8RQVFeHt7U1lZSWurq511vbX19OQ57YEzZENAB186v45GkKyQUey4U+SDQ1n8ZeGJicnExgYqP8qKSmpd5s/p/00dXVCCHNpVDZgG+PKw8LCuO2220hKSqKsTDeEJC0tjaeeeuq6RwavNGzYMNauXUtOTg5ArTHQCQkJHD58WH9k79tvvyUgIICAgACD60tISODQoUP6GWIWLVpk8Njl0NBQDh06RHl5OdXV1SxevFh/3/r165k5cyY//vgjHh4e+tv/+9//smrVKpYtW9aodWhuuOEGli9fTklJCYqi8OWXX173sbfffjvvvvsu2j9meKoZupGfn09wcDAqlYotW7bw+++/N7iOGosWLUKtVlNeXs7ixYsZPnw4FRUVVFVVERQUBMDHH398zW29vLyIiYlh0aJFAJw8eZJt27Y1uhZr1NBs0K+NJtkg2fAXkg3mYZYzJx07diQrK4vq6mocHBxQFIX09HT9D/ZK06ZNq3VBkCGniGtmZbeFoBGipWhILkDjskGrKDjYyLVoCxcu5KWXXiI6OhonJyfs7e155pln6hwTXSM6OpqXXnqJAQMG4OnpyciRI/H29gZ0QxG+/vprJk6cSHV1Na1atWLZsmUNOmLYrl07vvjiC8aMGYOzszM33XQTHh4e+Pj41LttQkICo0aNIioqivbt2zNgwAB2794NwBtvvEFZWRm33HKL/vE//fQTM2bMAKg1ROHKi6nrc+utt7J7925iY2Px8fFhyJAh1631/fff51//+hfR0dE4OjoSHx/P559/zltvvcWjjz7KzJkziY2N1Q+ZaYxu3boxYMAA8vLyGD16NHfffTcqlYrXX3+dPn360KZNG+6+++7rbr9w4UImT57MO++8o7+Q15CfvaUydTY0YCkXqyDZoCPZcDWryQalmQQHBysHDhzQfz9kyBBl/vz5iqIoyrJly5S4uDiD9hMQEFDvY+ZtPaMET1+t7Dmb25hShRCKYZ+1pjJWLiiKYfUOe2ejcnPy5oaWqVRXVyvHjh1TqqurG7ytpSoqKtL//4MPPlBGjhxpsv2vXLlS6dq1q1H3b2w19Wq1WuVf//qXMnXqVLPUMWTIEGXlypVN2kdxcbGi1WoVRVGUM2fOKH5+fkp6enqD9lHX77ytZcN3Ww8rwdNXKzO/2dSgGm0xFxRFsuGvJBtqu97vvTFzweRnTqZMmcKPP/5IdnY2I0aMwNPTk9TUVObOnUtiYiKzZs3Cy8uL+fPnG+05a07R2sbxUSFsjzlyAXRnVeWEqs5zzz3H9u3bUavVdOjQ4aoLSJvq448/ZsmSJWg0Gry8vPj666+Nun9jmzhxImlpaVRUVBAZGamf5cca7dixg2eeeQYAjUbD+++/T8eOHc1clWHMkQ2Kfii4hANINvyVZEPzUymKdZ3QDAwMJDMzs87HfLH1DK//eJzlj/QjLrh1M1UmhG0x5LNmSQypd+g7G3F1cuDnJwY1aN8ajYZTp04RHh5u9MXAhLBEdf3O21o2LNtymGd+Sieplycv/H2wwfuVXBAt0fV+742ZCxZ/QXxj1HS35CiIEOJKWkXOqAohatPKmRMhLIptdk6QYV1CiKspKDKsSwhRiy3N1iWELbDJzolWzpwIIa5BUeSaEyFEbfrRFuYtQwjxB5vsnNQEjY3MGCqEMBJFkaOjQoja5IJ4ISyLbXZO9MO6JGiEEH9SFEVSQQhRi8zwKYRlsc3OiX5Yl3nrEEJYFgVsJhhCQkKIiIggNjaW7t278+mnnzZ5n0eOHCEkJASACxcuMGhQ/bOaffDBB2RnZzfq+Z5++mn9ImlCmEvNmRM7G2kRSTYIa2cjH8XarGx2ZCFEM9EN6zJ3FcazZMkSDh48yM8//8wLL7zAoUOHat2v1WrRarWN2neHDh3YunVrvY9rSgPEGKqrqy1qP8L62OIMn5INkg3WzEY7J7p/ZWy5EOJKWhsd1hUcHExERASnTp1ixowZ3HnnnYwYMYKoqCiysrJYu3YtAwcOJC4ujj59+rBx40b9tjNmzCAsLIy4uDi+/fZb/e1paWn4+Pjov9+5cycDBw4kJiaGHj168P333/Paa69x4cIFxo8fT2xsLAcPHkStVvPcc8/Rp08fYmNj+fvf/05+fj4AWVlZjBgxgu7duzN8+PA658RXqVS89NJL9OzZk/Dw8FoLtalUKl599VXi4+N5/vnnycnJYezYsURHRxMVFVVr0bgdO3YQGxtLdHQ0kydPJiYmhk2bNgEwdOhQHn/8cfr168fNN98MwLvvvkufPn3o1asXI0eO5Ny5cwD88MMP9OjRg9jYWKKiovj+++8BeP311+nWrRuxsbHExsbqHy+sR83hTMkGyQbJBstg8hXizUEfNLaYNEKIRtOtEG+cYIiMjLzm7d9//z2hoaGkpqYyevToaz7m6NGjAKxdu5Zp06Zd876GOHz4MCdOnCAmJoYjR46wc+dODhw4gJ+fH2fOnGHGjBmsXbsWLy8vUlNTGTRoEGlpaaxfv55ly5axf/9+PD09uf/++6+5/7y8PMaMGcN3333HoEGD0Gq1FBQUMHr0aL788kuWLFlCbGwsALNmzcLd3Z09e/YAMHPmTF566SU+/fRTHn/8cfr06cPatWs5f/48sbGxdO3a9bqvS6VSceDAAc6cOUPv3r0ZMGCAfmiJvb09e/fuBWD8+PFERESwYsUKcnJyiIuLIyYmhl69ejF+/HgWLlzIsGHD2Lhx41Uri586dYotW7bg6OjI4sWLOXnyJDt37sTe3p6vvvqKRx99lB9//JGXXnqJuXPn0q9fP7RaLUVFReTn5/Puu++SlZWFq6srZWVl2NnK2KAWRKs17gXxkg2SDZINTWObnRO55kQIcQ2KjS3COH78eFxdXXFzc+PLL78kLCwMgFGjRuHn5wfAmjVrSE1NZfDgP1e+trOzIz09nQ0bNvD3v/8dLy8vAKZMmcK2bduuep6dO3cSERGhH2duZ2dH69atr1nTqlWrKCwsZPny5QBUVVXpGw0bNmzg3XffBSAgIIDbb7+9ztf30EMPAdC5c2cGDx7Mli1b9PuaPHmy/nHr169n//79ALRr146xY8eyfv163NzccHBwYNiwYQAMGzaMLl261HqOCRMm4OjoqK997969xMXFAbqVkGvceOONPPHEE4wbN46bb76Z2NhYNBoNYWFhTJgwgZtvvpm//e1vBAYG1vmahOWxxXVOJBt0JBusk012TmwxaIQQxqAYLRfqO4oZGhpa72NGjBjRqKOhNa48KnklDw8P/f8VReGmm25i8eLF9e7PGEeOFUXh448/1g+FMObzXfn4K19jQ/b71/v++rN6/vnnSUpKumq75ORkjh49ysaNG5k0aRL33Xcfzz77LLt27WLHjh1s2rSJhIQEvvnmG4MuFhaWx1hNBsmGa5NskGwwlE2eY7Ll8aNCiMbTKrS4YBgxYgTr16+vdUFszbCK4cOHs2zZMoqLi1EUhc8+++ya++jfvz8pKSn6i2C1Wi15eXkAeHl5UVhYqH/smDFjeP/99ykrKwOgrKxM38gaPnw4X375JaAbY/6///2vztprhlmkpaWxdevW6/5hHz58OJ9//jkAly5dYsWKFdx0001ERESgVqvZvHkzAJs3byY1NfW6zzdmzBjmzJmjf21qtZoDBw4AcOLECSIjI3nsscd45JFH2LVrF8XFxVy8eJFBgwbx8ssvM3DgQP3jhfXQttB1TiQbJBsslU2eOUEfNGauQwhhUVriOiehoaEsXryYKVOmUFZWRlVVFT179mTx4sWMGjWKPXv20KtXL7y8vLjllluuuY9WrVqxcuVKnnrqKYqLi7Gzs2PmzJncdtttPP744zz88MO4ubmxYMECpk+fTmVlJX379tU39qZPn05kZCQffvghiYmJdO/enYCAAG644YY6a9doNPTs2ZPS0lI++ugj/bCNv/roo4945JFHiI6ORlEUXnzxRfr27QvAt99+yz/+8Q+0Wi1xcXFERETUupj3Svfddx+5ubn6oR7V1dVMnjyZnj178sILL3Dy5EmcnJxwc3PjP//5D4WFhYwbN47S0lJUKhVhYWFMmjTJgHdFWJKWus6JZINkg6VSKVY2725gYGCdszgAvPfLST7+NZX104YQ2u76p/eEENdnyGfNkhhSb+xr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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')\n", "plt.subplot(1, 3, 1)\n", "plt.plot(trace_ts, color='white')\n", "plt.plot(trace_ts[:time])\n", "plt.xticks(range(0, trials + 1, int(time)))\n", "plt.xlabel('# of fuzz inputs')\n", "plt.ylabel('# of traces exercised')\n", "\n", "plt.subplot(1, 3, 2)\n", "line_cur, = plt.plot(trace_ts[:time], label=\"Ongoing fuzzing campaign\")\n", "line_pred, = plt.plot(prediction_ts, linestyle='--',\n", " color='black', label=\"Predicted progress\")\n", "plt.legend(handles=[line_cur, line_pred])\n", "plt.xticks(range(0, trials + 1, int(time))) # type: ignore\n", "plt.xlabel('# of fuzz inputs')\n", "plt.ylabel('# of traces exercised')\n", "\n", "plt.subplot(1, 3, 3)\n", "line_emp, = plt.plot(trace_ts, color='grey', label=\"Actual progress\")\n", "line_cur, = plt.plot(trace_ts[:time], label=\"Ongoing fuzzing campaign\")\n", "line_pred, = plt.plot(prediction_ts, linestyle='--',\n", " color='black', label=\"Predicted progress\")\n", "plt.legend(handles=[line_emp, line_cur, line_pred])\n", "plt.xticks(range(0, trials + 1, int(time))) # type: ignore\n", "plt.xlabel('# of fuzz inputs')\n", "plt.ylabel('# of traces exercised');" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The prediction from Chao's extrapolator looks quite accurate. We make a prediction at `time=trials/4`. Despite an extrapolation by 3 times (i.e., at trials), we can see that the predicted value (black, dashed line) closely matches the empirical value (gray, solid line).\n", "\n", "***Try it***. Again, try setting `trials` to 1 million and `time` to `int(trials / 4)`." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": true, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Lessons Learned\n", "\n", "* One can measure the _progress_ of a fuzzing campaign (as species over time, i.e., $S(n)$).\n", "* One can measure the _effectiveness_ of a fuzzing campaign (as asymptotic total number of species $S$).\n", "* One can estimate the _effectiveness_ of a fuzzing campaign using the Chao1-estimator $\\hat S$.\n", "* One can extrapolate the _progress_ of a fuzzing campaign, $\\hat S(n+m^*)$.\n", "* One can estimate the _residual risk_ (i.e., the probability that a bug exists that has not been found) using the Good-Turing estimator $GT$ of the species discovery probability." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Next Steps\n", "\n", "This chapter is the last in the book! If you want to continue reading, have a look at the [Appendices](99_Appendices.ipynb). Otherwise, _make use of what you have learned and go and create great fuzzers and test generators!_" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Background\n", "\n", "* A **statistical framework for fuzzing**, inspired from ecology. Marcel Böhme. [STADS: Software Testing as Species Discovery](https://mboehme.github.io/paper/TOSEM18.pdf). ACM TOSEM 27(2):1--52\n", "* Estimating the **discovery probability**: I.J. Good. 1953. [The population frequencies of species and the\n", "estimation of population parameters](https://www.jstor.org/stable/2333344). Biometrika 40:237–264.\n", "* Estimating the **asymptotic total number of species** when each input can belong to exactly one species: Anne Chao. 1984. [Nonparametric estimation of the number of classes in a population](https://www.jstor.org/stable/4615964). Scandinavian Journal of Statistics 11:265–270\n", "* Estimating the **asymptotic total number of species** when each input can belong to one or more species: Anne Chao. 1987. [Estimating the population size for capture-recapture data with unequal catchability](https://www.jstor.org/stable/2531532). Biometrics 43:783–791\n", "* **Extrapolating** the number of discovered species: Tsung-Jen Shen, Anne Chao, and Chih-Feng Lin. 2003. [Predicting the Number of New Species in Further Taxonomic Sampling](http://chao.stat.nthu.edu.tw/wordpress/paper/2003_Ecology_84_P798.pdf). Ecology 84, 3 (2003), 798–804." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": true, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Exercises\n", "I.J. Good and Alan Turing developed an estimator for the case where each input belongs to exactly one species. For instance, each input yields exactly one execution trace (see function [`getTraceHash`](#Trace-Coverage)). However, this is not true in general. For instance, each input exercises multiple statements and branches in the source code. Generally, each input can belong to one *or more* species. \n", "\n", "In this extended model, the underlying statistics are quite different. Yet, all estimators that we have discussed in this chapter turn out to be almost identical to those for the simple, single-species model. For instance, the Good-Turing estimator $C$ is defined as \n", "$$C=\\frac{Q_1}{n}$$ \n", "where $Q_1$ is the number of singleton species and $n$ is the number of generated test cases.\n", "Throughout the fuzzing campaign, we record for each species the *incidence frequency*, i.e., the number of inputs that belong to that species. Again, we define a species $i$ as *singleton species* if we have seen exactly one input that belongs to species $i$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" }, "solution2": "shown", "solution2_first": true }, "source": [ "### Exercise 1: Estimate and Evaluate the Discovery Probability for Statement Coverage\n", "\n", "In this exercise, we create a Good-Turing estimator for the simple fuzzer." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" }, "solution2": "shown", "solution2_first": true }, "source": [ "#### Part 1: Population Coverage\n", "\n", "Implement a function `population_stmt_coverage()` as in [the section on estimating discovery probability](#Estimating-the-Discovery-Probability) that monitors the number of singletons and doubletons over time, i.e., as the number $i$ of test inputs increases." ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:35.589823Z", "iopub.status.busy": "2024-01-18T17:30:35.589712Z", "iopub.status.idle": "2024-01-18T17:30:35.591344Z", "shell.execute_reply": "2024-01-18T17:30:35.591083Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden", "solution2_first": true }, "outputs": [], "source": [ "from Coverage import population_coverage\n", "..." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "source": [ "**Solution.** Here we go:" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:35.592846Z", "iopub.status.busy": "2024-01-18T17:30:35.592744Z", "iopub.status.idle": "2024-01-18T17:30:35.595722Z", "shell.execute_reply": "2024-01-18T17:30:35.595429Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [], "source": [ "def population_stmt_coverage(population, function):\n", " cumulative_coverage = []\n", " all_coverage = set()\n", " cumulative_singletons = []\n", " cumulative_doubletons = []\n", " singletons = set()\n", " doubletons = set()\n", "\n", " for s in population:\n", " with Coverage() as cov:\n", " try:\n", " function(s)\n", " except BaseException:\n", " pass\n", " cur_coverage = cov.coverage()\n", "\n", " # singletons and doubletons\n", " doubletons -= cur_coverage\n", " doubletons |= singletons & cur_coverage\n", " singletons -= cur_coverage\n", " singletons |= cur_coverage - (cur_coverage & all_coverage)\n", " cumulative_singletons.append(len(singletons))\n", " cumulative_doubletons.append(len(doubletons))\n", "\n", " # all and cumulative coverage\n", " all_coverage |= cur_coverage\n", " cumulative_coverage.append(len(all_coverage))\n", "\n", " return all_coverage, cumulative_coverage, cumulative_singletons, cumulative_doubletons" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" }, "solution2": "shown", "solution2_first": true }, "source": [ "#### Part 2: Population\n", "\n", "Use the random `fuzzer(min_length=1, max_length=1000, char_start=0, char_range=255)` from [the chapter on Fuzzers](Fuzzer.ipynb) to generate a population of $n=10000$ fuzz inputs." ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "cell_style": "split", "execution": { "iopub.execute_input": "2024-01-18T17:30:35.597534Z", "iopub.status.busy": "2024-01-18T17:30:35.597418Z", "iopub.status.idle": "2024-01-18T17:30:35.599151Z", "shell.execute_reply": "2024-01-18T17:30:35.598917Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden", "solution2_first": true }, "outputs": [], "source": [ "from Fuzzer import RandomFuzzer\n", "from html.parser import HTMLParser\n", "...;" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "source": [ "**Solution.** This is fairly straightforward:" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "cell_style": "split", "execution": { "iopub.execute_input": "2024-01-18T17:30:35.600695Z", "iopub.status.busy": "2024-01-18T17:30:35.600566Z", "iopub.status.idle": "2024-01-18T17:30:35.602158Z", "shell.execute_reply": "2024-01-18T17:30:35.601919Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [], "source": [ "trials = 2000 # increase to 10000 for better convergences. Will take a while.." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "source": [ "We create a wrapper function..." ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "cell_style": "split", "execution": { "iopub.execute_input": "2024-01-18T17:30:35.603764Z", "iopub.status.busy": "2024-01-18T17:30:35.603651Z", "iopub.status.idle": "2024-01-18T17:30:35.605457Z", "shell.execute_reply": "2024-01-18T17:30:35.605179Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [], "source": [ "def html_parser(inp):\n", " parser = HTMLParser() # resets the HTMLParser object for every fuzz input\n", " parser.feed(inp)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "source": [ "... and a random fuzzer:" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "cell_style": "split", "execution": { "iopub.execute_input": "2024-01-18T17:30:35.607077Z", "iopub.status.busy": "2024-01-18T17:30:35.606967Z", "iopub.status.idle": "2024-01-18T17:30:35.608625Z", "shell.execute_reply": "2024-01-18T17:30:35.608376Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [], "source": [ "fuzzer = RandomFuzzer(min_length=1, max_length=1000,\n", " char_start=0, char_range=255)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "source": [ "We fill the population:" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "cell_style": "split", "execution": { "iopub.execute_input": "2024-01-18T17:30:35.610101Z", "iopub.status.busy": "2024-01-18T17:30:35.609999Z", "iopub.status.idle": "2024-01-18T17:30:36.005184Z", "shell.execute_reply": "2024-01-18T17:30:36.004860Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [], "source": [ "population = []\n", "for i in range(trials):\n", " population.append(fuzzer.fuzz())" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" }, "solution2": "hidden", "solution2_first": true }, "source": [ "#### Part 3: Estimating Probabilities\n", "\n", "Execute the generated inputs on the Python HTML parser (`from html.parser import HTMLParser`) and estimate the probability that the next input covers a previously uncovered statement (i.e., the discovery probability) using the Good-Turing estimator." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "source": [ "**Solution.** Here we go:" ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:36.007481Z", "iopub.status.busy": "2024-01-18T17:30:36.007351Z", "iopub.status.idle": "2024-01-18T17:30:36.259735Z", "shell.execute_reply": "2024-01-18T17:30:36.259399Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [], "source": [ "measurements = 100 # experiment measurements\n", "step = int(trials / measurements)\n", "\n", "gt_timeseries = []\n", "singleton_timeseries = population_stmt_coverage(population, my_parser)[2]\n", "for i in range(1, trials + 1, step):\n", " gt_timeseries.append(singleton_timeseries[i - 1] / i)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" }, "solution2": "hidden", "solution2_first": true }, "source": [ "#### Part 4: Empirical Evaluation\n", "\n", "Empirically evaluate the accuracy of the Good-Turing estimator (using $10000$ repetitions) of the probability to cover new statements using the experimental procedure at the end of [the section on estimating discovery probability](#Estimating-the-Discovery-Probability)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "source": [ "**Solution.** This is as above:" ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:36.261681Z", "iopub.status.busy": "2024-01-18T17:30:36.261567Z", "iopub.status.idle": "2024-01-18T17:30:36.263124Z", "shell.execute_reply": "2024-01-18T17:30:36.262856Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [], "source": [ "# increase to 10000 for better precision (less variance). Will take a while..\n", "repeats = 100" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:36.264578Z", "iopub.status.busy": "2024-01-18T17:30:36.264495Z", "iopub.status.idle": "2024-01-18T17:30:39.738433Z", "shell.execute_reply": "2024-01-18T17:30:39.738063Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [], "source": [ "emp_timeseries = []\n", "all_coverage = set()\n", "for i in range(0, trials, step):\n", " if i - step >= 0:\n", " for j in range(step):\n", " inp = population[i - j]\n", " with Coverage() as cov:\n", " try:\n", " my_parser(inp)\n", " except BaseException:\n", " pass\n", " all_coverage |= cov.coverage()\n", "\n", " discoveries = 0\n", " for _ in range(repeats):\n", " inp = fuzzer.fuzz()\n", " with Coverage() as cov:\n", " try:\n", " my_parser(inp)\n", " except BaseException:\n", " pass\n", " # If intersection not empty, a new stmt was (dis)covered\n", " if cov.coverage() - all_coverage:\n", " discoveries += 1\n", " emp_timeseries.append(discoveries / repeats)" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:39.740354Z", "iopub.status.busy": "2024-01-18T17:30:39.740220Z", "iopub.status.idle": "2024-01-18T17:30:40.000199Z", "shell.execute_reply": "2024-01-18T17:30:39.999891Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAHHCAYAAABTMjf2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB36klEQVR4nO3deVhUdf//8eewbwIiCuKGuZUbGC6Zmlp4q5lLVpp553LfLb9vWJbZflfeWdlqWpHZorZnq1qWuaRZ3uaOmQvuigvugICyzfn9cZzREVAQZgbh9biuc83MOWfOeZ/DwLz5rBbDMAxEREREqiAPdwcgIiIi4i5KhERERKTKUiIkIiIiVZYSIREREamylAiJiIhIlaVESERERKosJUIiIiJSZSkREhERkSpLiZCIiIhUWUqERC5i3LhxWCwWd4ch55gxYwYWi4XVq1eX2zG7detGy5YtL7rf7t27sVgszJgxw76uqM9IdHQ0I0aMKLf4qqIRI0YQHR3t7jCkklMiJFWK7QvUtvj5+REVFUXPnj158803OXnypLtDvKx169bN4f6GhYXRrl07pk2bhtVqdXd4brVp0ybGjRvH7t27nXL8H3/8kV69elGjRg38/Pxo2rQpY8eO5dixY04536U69/NxoWXJkiXuDlWqCC93ByDiDs899xwNGzYkLy+P1NRUlixZwoMPPsjEiROZM2cOrVu3tu/7n//8h8cff9yN0V5e6taty4QJEwA4cuQIH3/8Mf/+97/ZunUrL730kpujK7sGDRpw6tQpvL29L7hfcnIyHh5n/9fctGkT//3vf+nWrVu5l3KMHTuW119/nZiYGB577DHCwsJYu3Ytb7/9Nl9++SWLFi2iWbNm5XrOS/XJJ584vP74449ZsGBBofVXXXUV77//fpVPoMX5lAhJldS7d2/atm1rf/3EE0/w66+/ctNNN9GvXz82b96Mv78/AF5eXnh5Ve5fFcMwOH36tP2ayyIkJIR//vOf9tf33nsvzZo14+2332b8+PFFJhBWq5Xc3Fz8/PzKfH5ns5UkXoyvr68LooEvvviC119/ncGDB/PZZ5/h6elp3zZixAi6d+/Obbfdxtq1a136Oc7KyiIwMLDQ+nM/GwB//vknCxYsKLRexFVUNSZyxvXXX8/TTz/Nnj17+PTTT+3ri2r/sWDBAjp37kxoaChBQUE0a9aMJ5980mGf06dPM27cOJo2bYqfnx+1a9dm4MCB7Nixw75PVlYWDz/8MPXq1cPX15dmzZrx2muvYRiGfZ+WLVvSvXv3QvFarVbq1KnDrbfe6rBu0qRJtGjRAj8/PyIiIrj33ns5ceKEw3ujo6O56aab+OWXX2jbti3+/v5MnTqVrl27EhMTU+T9adasGT179izBnXQUEBDANddcQ1ZWFkeOHAHMZGLUqFF89tlntGjRAl9fX+bNmwfAunXr6N27N8HBwQQFBXHDDTfw559/Fnns7Oxs7r33XmrUqEFwcDDDhg0rdK2zZ8+mT58+REVF4evrS6NGjRg/fjwFBQVFHnPNmjVce+21+Pv707BhQ959912H7UW1ESrKuW2EZsyYwW233QZA9+7dHap/hg8fTnh4OHl5eYWO8Y9//OOiJTn//e9/qV69Ou+9955DEgTQvn17HnvsMTZs2MA333wDwKhRowgKCiI7O7vQsYYMGUJkZKTDvfn555/p0qULgYGBVKtWjT59+rBx40aH940YMYKgoCB27NjBjTfeSLVq1Rg6dOgF4y6J89sI2e79a6+9RmJiIldccQUBAQH84x//ICUlBcMwGD9+PHXr1sXf35/+/ftz/PjxQsctyTVJ1aFESOQcd955JwDz588vdp+NGzdy0003kZOTw3PPPcfrr79Ov379WLZsmX2fgoICbrrpJv773/8SFxfH66+/zujRo0lPT+fvv/8GzFKYfv368cYbb9CrVy8mTpxIs2bNeOSRRxgzZoz9WIMHD2bp0qWkpqY6xPHHH39w4MABbr/9dvu6e++9l0ceeYROnToxefJkRo4cyWeffUbPnj0LfdEmJyczZMgQevToweTJk4mNjeXOO+/kr7/+ssdos2rVKrZu3XrJ/7Xv3LkTT09PQkND7et+/fVXHnroIQYPHszkyZOJjo5m48aNdOnShfXr1/Poo4/y9NNPs2vXLrp168aKFSsKHXfUqFFs3ryZcePGMWzYMD777DMGDBjgkEjOmDGDoKAgxowZw+TJk4mLi+OZZ54psrrzxIkT3HjjjcTFxfHKK69Qt25d/u///o9p06Zd0nXbXHfddTzwwAMAPPnkk3zyySd88sknXHXVVdx5550cO3aMX375xeE9qamp/Prrrxe859u2bSM5OZn+/fsTHBxc5D7Dhg0DzDZEYH6esrKymDt3rsN+2dnZ/PDDD9x66632hOqTTz6hT58+BAUF8fLLL/P000+zadMmOnfuXKitU35+Pj179qRWrVq89tpr3HLLLSW/QaX02Wef8c4773D//ffz8MMP89tvvzFo0CD+85//MG/ePB577DHuuecefvjhB8aOHevw3tJck1QRhkgVMn36dAMwVq1aVew+ISEhRps2beyvn332WePcX5U33njDAIwjR44Ue4xp06YZgDFx4sRC26xWq2EYhjFr1iwDMJ5//nmH7bfeeqthsViM7du3G4ZhGMnJyQZgvPXWWw773XfffUZQUJCRnZ1tGIZh/P777wZgfPbZZw77zZs3r9D6Bg0aGIAxb948h33T0tIMPz8/47HHHnNY/8ADDxiBgYFGZmZmsddsGIbRtWtX48orrzSOHDliHDlyxNi8ebPxwAMPGIDRt29f+36A4eHhYWzcuNHh/QMGDDB8fHyMHTt22NcdOHDAqFatmnHdddfZ19l+jnFxcUZubq59/SuvvGIAxuzZs+3rbPfnXPfee68REBBgnD592iF2wHj99dft63JycozY2FijVq1a9vPs2rXLAIzp06fb9zv/M2IY5j0ePny4/fXXX39tAMbixYsd9isoKDDq1q1rDB482GH9xIkTDYvFYuzcubNQ/Da2z9Abb7xR7D6GYRjBwcHG1VdfbRiG+fmrU6eOccsttzjs89VXXxmAsXTpUsMwDOPkyZNGaGiocffddzvsl5qaaoSEhDisHz58uAEYjz/++AXjKEpCQkKhe3fucRs0aGB/bbv3NWvWNNLS0uzrn3jiCQMwYmJijLy8PPv6IUOGGD4+Pvafc2muSaoOlQiJnCcoKOiCvcdspRqzZ88utiHnt99+S3h4OPfff3+hbbZqtp9++glPT097SYHNww8/jGEY/PzzzwA0bdqU2NhYZs6cad+noKCAb775hr59+9rb9Xz99deEhITQo0cPjh49al/i4uIICgpi8eLFDudp2LBhoaqukJAQ+vfvzxdffGEvVSkoKGDmzJkMGDCgyDYf59uyZQs1a9akZs2aXHXVVbz11lv06dOnUKlK165dad68ucM1zZ8/nwEDBnDFFVfY19euXZs77riDP/74g4yMDIdj3HPPPQ5tjv7v//4PLy8vfvrpJ/u6c9s9nTx5kqNHj9KlSxeys7PZsmWLw/G8vLy499577a99fHy49957OXz4MGvWrLnotV8KDw8Phg4dypw5cxw+d5999hnXXnstDRs2LPa9tv2rVat2wXNUq1bNfu8sFgu33XYbP/30E5mZmfZ9Zs6cSZ06dejcuTNgVv+mpaUxZMgQh8+Tp6cnHTp0KPR5AvP+u8Jtt91GSEiI/XWHDh0As/3Rue2gOnToQG5uLvv37wcu7Zqk8lMiJHKezMzMC36xDB48mE6dOnHXXXcRERHB7bffzldffeWQFO3YsYNmzZpdsHHqnj17iIqKKnSuq666yr793HMuW7bM/gd9yZIlHD58mMGDB9v32bZtG+np6dSqVcueiNiWzMxMDh8+7HCe4r5ghw0bxt69e/n9998BWLhwIYcOHbJXG15MdHQ0CxYsYOHChfzxxx+kpqby448/Eh4efsHzHzlyhOzs7CLbxFx11VVYrVZSUlIc1jdp0sThdVBQELVr13ao4ti4cSM333wzISEhBAcHU7NmTXt1U3p6usP7o6KiCiV7TZs2BXBqtcmwYcM4deoU33//PWBWW65Zs+ai99z22bnYsA8nT550+JwNHjyYU6dOMWfOHMD8zP/000/cdttt9kR927ZtgNl27vzP0/z58wt9nry8vKhbt24prvrS1a9f3+G1LSmqV69ekett7cZKe01SNVTurjAipbRv3z7S09Np3Lhxsfv4+/uzdOlSFi9ezNy5c5k3bx4zZ87k+uuvZ/78+YUarJaHwYMH88QTT/D111/z4IMP8tVXXxESEkKvXr3s+1itVmrVqsVnn31W5DFq1qxZ6DqK0rNnTyIiIvj000+57rrr+PTTT4mMjCQ+Pr5EsQYGBpZo3/LooXYxaWlpdO3aleDgYJ577jkaNWqEn58fa9eu5bHHHqswXbObN29OXFwcn376KcOGDePTTz/Fx8eHQYMGXfB9tqT5r7/+KnafPXv2kJGR4VD6ds011xAdHc1XX33FHXfcwQ8//MCpU6ccEmvbvfnkk0+IjIwsdNzzk3xfX1+H4QKcqbjfseLW20o3S3tNUjXopy5yDttYJhfrHeXh4cENN9zADTfcwMSJE3nxxRd56qmnWLx4MfHx8TRq1IgVK1aQl5dX7HgzDRo0YOHChYX+W7dV1zRo0MC+rmHDhrRv356ZM2cyatQovvvuOwYMGODQRbtRo0YsXLiQTp06lSnJ8PT05I477mDGjBm8/PLLzJo1i7vvvtspCd65atasSUBAAMnJyYW2bdmyBQ8Pj0L/8W/bts2hR11mZiYHDx7kxhtvBMySs2PHjvHdd99x3XXX2ffbtWtXkTEcOHCgULfvrVu3ApR57J+LjU4+bNgwxowZw8GDB/n888/p06cP1atXv+B7mjZtStOmTZk1axaTJ08usiTz448/BuCmm25yWD9o0CAmT55MRkYGM2fOJDo6mmuuuca+vVGjRgDUqlWrxElwRVcZr0nKTlVjImf8+uuvjB8/noYNG16w629R3XFjY2MByMnJAeCWW27h6NGjvP3224X2tf13euONN1JQUFBonzfeeAOLxULv3r0d1g8ePJg///yTadOmcfToUYf/3sH8YisoKGD8+PGFzpmfn09aWlqx13S+O++8kxMnTnDvvfeSmZnpkjFePD09+cc//sHs2bMdqqEOHTrE559/TufOnQv1jHrvvfccesNNmTKF/Px8+72zJW/GOb3IcnNzeeedd4qMIT8/n6lTpzrsO3XqVGrWrElcXFyZrs+WXBX3cxgyZAgWi4XRo0ezc+fOEt/zZ555hhMnTvD//t//KzQkwJo1a3j55Zdp2bJloV5cgwcPJicnh48++oh58+YVKn3q2bMnwcHBvPjii0V27bcNhXA5qYzXJGWnEiGpkn7++We2bNlCfn4+hw4d4tdff2XBggU0aNCAOXPmXHDAvOeee46lS5fSp08fGjRowOHDh3nnnXeoW7euvaHpsGHD+PjjjxkzZgwrV66kS5cuZGVlsXDhQu677z769+9P37596d69O0899RS7d+8mJiaG+fPnM3v2bB588EH7f682gwYNYuzYsYwdO5awsLBC/9F27dqVe++9lwkTJpCUlMQ//vEPvL292bZtG19//TWTJ092GHPoQtq0aUPLli35+uuvueqqq7j66qtLeYcvzfPPP28fo+m+++7Dy8uLqVOnkpOTwyuvvFJo/9zcXG644QYGDRpEcnIy77zzDp07d6Zfv34AXHvttVSvXp3hw4fzwAMPYLFY+OSTTxwSo3NFRUXx8ssvs3v3bpo2bcrMmTNJSkrivffeu+hI0hcTGxuLp6cnL7/8Munp6fj6+nL99ddTq1YtwCwR69WrF19//TWhoaH06dOnRMcdOnQoq1atYvLkyWzatImhQ4dSvXp11q5dy7Rp06hRowbffPNNofivvvpqGjduzFNP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d8E4k5KSaNOmjUNs58rMzGTcuHHMnTuXgwcPkp+fz6lTp1QiJKWkEiERkTLz9/Zk03M93XLe0goMDHQoWTmft7e3/bltoMCi1tmqqC5VYGDgBbf7+/tfcPvYsWNZsGABr732Go0bN8bf359bb72V3NzcMsXlLkqE3EWJkIhImVksllJXUVUme/fu5cCBA0RFRQHw559/4uHhQbNmzS75mK1bt+aDDz7g+PHjRZYKLVu2jBEjRnDzzTcDZgnR7t27L/l87qbG0u6iqjERkSolJyeH1NRUh+Xo0aNlOqafnx/Dhw9n/fr1/P777zzwwAMMGjSoTN3hhwwZQmRkJAMGDGDZsmXs3LmTb7/9luXLlwNmG6PvvvuOpKQk1q9fzx133FHmUip3UiLkLioREhGpUubNm0ft2rUdls6dO5fpmI0bN2bgwIHceOON/OMf/6B169a88847ZTqmj48P8+fPp1atWtx44420atWKl156yT67+8SJE6levTrXXnstffv2pWfPnlx99dVlOqc7WQxn9AGsBBITE0lMTKSgoICtW7eSnp5ub5xWLmYlQNKnED8OOj9UfscVEamkTp8+za5du2jYsCF+fn7uDsftxo0bx6xZs0hKSnJ3KG5zoc+Erdf3xb6/VSJUDKfPNeZ95gemEiERERG3USLkLvaqMbUREhERcRclQu5ibyytEiERESm9cePGVelqsfKiRMhd1FhaRETE7ZQIuYu6z4uIiLidEiF3UYmQiIiI2ykRcheVCImIiLidEqFiJCYm0rx5c9q1a+ecE6hESERExO2UCBXD+eMIKRESERFxNyVC7qKqMRERcRGLxcKsWbNcdr4RI0YwYMAAl52vLJQIuYtKhEREqpTU1FRGjx5N48aN8fPzIyIigk6dOjFlyhSys93zT3G3bt2wWCzFLt26dbuk406ePJkZM2aUa6zO4uXuAKosLyVCIiJVxc6dO+nUqROhoaG8+OKLtGrVCl9fXzZs2MB7771HnTp16Nevn8vj+u6778jNzQUgJSWF9u3bs3DhQlq0aAGYE7CWRkFBARaLhZCQkHKP1VlUIuQuKhESEaky7rvvPry8vFi9ejWDBg3iqquu4oorrqB///7MnTuXvn37ArB371769+9PUFAQwcHBDBo0iEOHDjkca8qUKTRq1AgfHx+aNWvGJ5984rB927ZtXHfddfj5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4+/vD5hVawkJCbz44ov06NEDwH4swzC45ZZbCAkJYerUqSU+PpilVUOGDAHgxRdf5M0332TlypUOCdizzz5rP+dHH31E3bp1+f777xk0aNBFjx8UFIS/vz85OTkO1753716aNGlC586dsVgsF6xWFJHCVDUmIiXi5eVFdHQ0W7ZsoV27drRu3ZrU1FQiIiK47rrriI6OLrbhckZGBgcOHChUhdapUyc2b97sivABSE9P56abbqJPnz488sgjhbY/+eSTLF++nNmzZ9sTp5KylZYBBAYGEhwczOHDhx32ObeUKSwsjGbNmpX5+keMGEFSUhLNmjXjgQceYP78+WU6nkhVoxIhESmRFi1asGfPHvLy8rBarQQFBZGfn09+fj5BQUE0aNCAjRs3uiU2Dw8PDMNwWJeXl+fwuqCggMGDBxMcHMx7771X6Biffvopb7zxBkuWLKFOnTqljuH86i2LxYLVai3x+0tyDUW5+uqr2bVrFz///DMLFy5k0KBBxMfH880335T43CJVmUqERKREfvrpJ5KSkoiMjOTTTz8lKSmJli1bMmnSJJKSkvjpp5+KfW9wcDBRUVEsW7bMYf2yZcto3rx5mWOrWbOmQzufjIwMdu3a5bDPQw89xIYNG5g1axZ+fn4O25YvX85dd93F1KlTueaaa8ocT3H+/PNP+/MTJ06wdetWrrrqKvs1pKamOiRD54+R5OPjQ0FBQaHjBgcHM3jwYN5//31mzpzJt99+y/Hjx51zESKVjEqERKREGjRoQGpqKocOHaJ///5YLBY2btzILbfcQu3atS/6/kceeYRnn32WRo0aERsby/Tp00lKSuKzzz4rc2zXX389M2bMoG/fvoSGhvLMM884NKSePn0677zzDt9//z0Wi4XU1FTAbHeTmZnJzTffzO23307Pnj3t2zw9Pcu9m/xzzz1HjRo1iIiI4KmnniI8PJwBAwYA0K1bN44cOcIrr7zCrbfeyrx58/j5558JDg62vz86OppffvmF5ORkatSoQUhICG+99Ra1a9emTZs2eHh48PXXXxMZGUloaGi5xi5SWalESERKbMmSJbRr1w4/Pz9WrlxJ3bp1S5QEATzwwAOMGTOGhx9+mFatWjFv3jzmzJlDkyZNyhzXE088QdeuXe3tfwYMGECjRo3s23/77TcKCgro168ftWvXti+vvfYaW7Zs4dChQ3z00UcO29q1a1fmuM730ksvMXr0aOLi4khNTeWHH37Ax8cHgKuuuop33nmHxMREYmJiWLlyJWPHjnV4/913302zZs1o27YtNWvWZNmyZVSrVo1XXnmFtm3b0q5dO3bv3s1PP/2Eh4f+vIuUhMU4v1JaRETK1ZIlS+jevTsnTpxQSY1IBaN/GURERKTKUiIkIiIiVZaqxkRERKTKUomQiIiIVFlKhERERKTKUiIkIiIiVZYSIREREamylAiJiIhIlaVESERERKosJUIiIiJSZSkREhERkSpLiZCIiIhUWf8fUts9zpsu3aAAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "line_emp, = plt.semilogy(emp_timeseries, label=\"Empirical\")\n", "line_gt, = plt.semilogy(gt_timeseries, label=\"Good-Turing\")\n", "plt.legend(handles=[line_emp, line_gt])\n", "plt.xticks(range(0, measurements + 1, int(measurements / 5)),\n", " range(0, trials + 1, int(trials / 5))) # type: ignore\n", "plt.xlabel('# of fuzz inputs')\n", "plt.ylabel('discovery probability')\n", "plt.title('Discovery Probability Over Time');" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" }, "solution": "hidden", "solution2": "shown", "solution2_first": true, "solution_first": true }, "source": [ "### Exercise 2: Extrapolate and Evaluate Statement Coverage\n", "\n", "In this exercise, we use Chao's extrapolation method to estimate the success of fuzzing." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" }, "solution": "hidden", "solution2": "hidden", "solution2_first": true, "solution_first": true }, "source": [ "#### Part 1: Create Population\n", "\n", "Use the random `fuzzer(min_length=1, max_length=1000, char_start=0, char_range=255)` to generate a population of $n=400000$ fuzz inputs." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "skip" }, "solution": "hidden", "solution2": "hidden" }, "source": [ "**Solution.** Here we go:" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:40.001951Z", "iopub.status.busy": "2024-01-18T17:30:40.001825Z", "iopub.status.idle": "2024-01-18T17:30:40.003639Z", "shell.execute_reply": "2024-01-18T17:30:40.003348Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [], "source": [ "trials = 400 # Use 400000 for actual solution. This takes a while!" ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:40.005581Z", "iopub.status.busy": "2024-01-18T17:30:40.005453Z", "iopub.status.idle": "2024-01-18T17:30:40.142225Z", "shell.execute_reply": "2024-01-18T17:30:40.141832Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [], "source": [ "population = []\n", "for i in range(trials):\n", " population.append(fuzzer.fuzz())\n", "\n", "_, stmt_ts, Q1_ts, Q2_ts = population_stmt_coverage(population, my_parser)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" }, "solution": "hidden", "solution2": "hidden", "solution2_first": true, "solution_first": true }, "source": [ "#### Part 2: Compute Estimate\n", "\n", "Compute an estimate of the total number of statements $\\hat S$ after $n/4=100000$ fuzz inputs were generated. In the extended model, $\\hat S$ is computed as\n", "\\begin{align}\n", "\\hat S_\\text{Chao1} = \\begin{cases}\n", "S(n) + \\frac{Q_1^2}{2Q_2} & \\text{if $Q_2>0$}\\\\\n", "S(n) + \\frac{Q_1(Q_1-1)}{2} & \\text{otherwise}\n", "\\end{cases}\n", "\\end{align}\n", " * where $Q_1$ and $Q_2$ is the number of singleton and doubleton statements, respectively (i.e., statements that have been exercised by exactly one or two fuzz inputs, resp.), and \n", " * where $S(n)$ is the number of statements that have been (dis)covered after generating $n$ fuzz inputs." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "source": [ "**Solution.** Here we go:" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:40.144146Z", "iopub.status.busy": "2024-01-18T17:30:40.144024Z", "iopub.status.idle": "2024-01-18T17:30:40.146561Z", "shell.execute_reply": "2024-01-18T17:30:40.146317Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "After executing 100 fuzz inputs, we have covered 132 **(66.7 %)** statements.\n", "After executing 100 fuzz inputs, we estimate there are 198 statements in total.\n", "After executing 400 fuzz inputs, we have covered 155 statements.\n" ] } ], "source": [ "time = int(trials / 4)\n", "Q1 = Q1_ts[time]\n", "Q2 = Q2_ts[time]\n", "Sn = stmt_ts[time]\n", "\n", "if Q2 > 0:\n", " hat_S = Sn + Q1 * Q1 / (2 * Q2)\n", "else:\n", " hat_S = Sn + Q1 * (Q1 - 1) / 2\n", "\n", "print(\"After executing %d fuzz inputs, we have covered %d **(%.1f %%)** statements.\\n\" % (time, Sn, 100 * Sn / hat_S) +\n", " \"After executing %d fuzz inputs, we estimate there are %d statements in total.\\n\" % (time, hat_S) +\n", " \"After executing %d fuzz inputs, we have covered %d statements.\" % (trials, stmt_ts[trials - 1]))" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" }, "solution": "hidden", "solution2": "hidden", "solution2_first": true, "solution_first": true, "toc-hr-collapsed": false }, "source": [ "#### Part 3: Compute and Evaluate Extrapolator\n", "\n", "Compute and evaluate Chao's extrapolator by comparing the predicted number of statements to the empirical number of statements." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "source": [ "**Solution.** Here's our solution:" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:40.148140Z", "iopub.status.busy": "2024-01-18T17:30:40.148027Z", "iopub.status.idle": "2024-01-18T17:30:40.150898Z", "shell.execute_reply": "2024-01-18T17:30:40.150612Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [], "source": [ "prediction_ts: List[float] = [None] * time # type: ignore\n", "Q0 = hat_S - Sn\n", "\n", "for m in range(trials - time):\n", " prediction_ts.append(Sn + Q0 * (1 - (1 - Q1 / (time * Q0 + Q1)) ** m))" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:30:40.152424Z", "iopub.status.busy": "2024-01-18T17:30:40.152316Z", "iopub.status.idle": "2024-01-18T17:30:40.325216Z", "shell.execute_reply": "2024-01-18T17:30:40.324880Z" }, "slideshow": { "slide_type": "skip" }, "solution2": "hidden" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyQAAADrCAYAAACYXFL4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAAxOAAAMTgF/d4wjAABjBklEQVR4nO3deXxM9/7H8ddkJSR2QSJCE2s2iRBiqaJUF2tvNyTl/oJWteWWLnrrVqtarvZ2uVfaKm21utgvvRRN7EuQVFAkiNgiGltClsnM9/dHZAgRk8xMZjL5PB8PD2Y75zMm8875nu9yNEophRBCCCGEEEJYgYO1CxBCCCGEEEJUX9IgEUIIIYQQQliNNEiEEEIIIYQQViMNEiGEEEIIIYTVSINECCGEEEIIYTXSIBFCCCGEEEJYjTRIhBBCCCGEEFZj8QbJxIkT8fX1RaPRkJSUZLg/Pz+fCRMm4O/vT2BgICNGjDA8lpKSQrdu3WjdujXh4eEcPHjQ0mUKIYQQQgghrMDiDZLhw4ezdetWWrRoUeL+V199FY1Gw9GjR0lOTmbOnDmGx8aOHUtMTAxHjx5l6tSpREdHW7pMIYQQQgghhBVoKutK7b6+vqxYsYKQkBCuXbtG06ZNOX36NB4eHiWel5mZiZ+fHxcvXsTJyQmlFE2bNmXr1q34+fmVuQ9XV1caNWpkybchhAAuXLhAfn6+tcswmmSDEJVDskEIcTtjcsGpkmop4dixY9SvX5+ZM2eyYcMGatasyfTp0+nTpw+nTp2iadOmODkVlabRaPDx8SE9Pf2OBsncuXOZO3eu4XbNmjU5ffp0pb4XIaojb29va5dQLo0aNZJsEKISSDYIIW5nTC5YZVJ7YWEhJ0+epH379uzZs4ePP/6YJ554gvPnz5drO5MmTeL06dOGP7Vr17ZQxUIIIYQQQghLsEqDxMfHBwcHB5555hkAOnbsSMuWLUlOTqZ58+acO3eOwsJCAJRSpKen4+PjY41ShRBCCCGEEBZklQZJw4YN6dOnD+vWrQPgxIkTnDhxgnbt2tG4cWNCQ0NZtGgRAEuXLsXb2/ue80eEEEIIIYQQVY/FGyRjx47F29ub06dP079/f0PDYt68ecyePZvAwEAGDx5MbGwsXl5eAMTGxhIbG0vr1q2ZNWsWCxYssHSZQohKJMuBCyFKI9kgRPVk8UntsbGxpd7fqlUr4uLiSn2sTZs27Nixw5JlCSGsaPjw4UyZMoXu3buXuP/W5cA1Gg0ZGRmGx4qXA4+OjmbJkiVER0eTkJBQ2aULISxIskGI6qnSlv2tDMU9MUIIyzLXd60ylgM3Z71CVCe5ubns37+f7Oxs+vbta9RrJBuEsH9nz55l3759BAYG3nGdwdIY8z2zyhwSIYS43a3LgXfq1IkePXqwceNGgDKXAy/N3Llz8fb2NvzJycmptPchRFV07do1cnNzgaKD/KCgINzd3YmIiGDixIlWrU2yQQjrUEqRlZVluP3555/TtGlTvLy8ePTRR1m1apXZ9mWV65AIIcTtbl0OfNasWSQmJtKvX78KjQefNGkSkyZNMtyuatdGEMKS8vLySEpKIiEhgYSEBPbu3cvhw4f54YcfePzxx2nYsCE6nY5HH32UsLAwOnXqZNV6JRuEqBwZGRkkJCSwe/du9uzZw969e1FKkZmZiUajwd3dnWbNmvHoo48SGhpqdM+pMaRBIoSwCWUtBx4UFGRYDrx4WIYsBy7EvRUWFnLo0CG0Wi1hYWEA9O/fn82bNxue4+vry5AhQ2jYsCEADg4ONjUxXLJBCPO7fPkye/bsISwsjHr16nHo0CE6dOhgeNzV1ZWgoCBCQ0PJz8+nRo0aPPXUUzz11FMWqUcaJEIIm3DrcuADBw6863Lg0dHRshy4EHdx7tw54uLiDL0fiYmJXL9+nQcffNCw1H5UVBR9+/YlPDycTp06GRoitkqyQQjT7dq1ix07dhiyISUlBYAVK1YwaNAgWrduTUxMDKGhoYSHhxMQEICLi0ul1SeT2oUQ5Wbqd23s2LGsWbOGjIwMGjRogLu7O6mpqRw/fpwxY8bw559/4uDgwN///neGDRsGwJEjR4iOjiYrKwsPDw8WLFhAYGBgpdQrhC06c+YMCQkJJCcnM23aNDQaDV9//TXR0dEA1KlTh06dOhEeHk7Pnj156KGHLF6TZIMQ1qXVajlw4AAJCQk0bdqURx99FICIiAh27doFgJ+fH+Hh4YSHhzN48GBatmxp0ZqM+Z5Jg0QIUW5V7btW1eoVojTXr19n3rx57Nixg507d5b4mU5PT6d58+acOXOG+Ph4wsPD8fPzw8GhcteuqWrftapWrxCl2bdvHz/++CM7duxgz549hgUqHn74YVavXg3Ar7/+ikajoVOnTtSrV69S65MGiRDCIqrad62q1Suqt+J5EDt37mTHjh08/vjjREZGotVqqVOnDnl5eQQEBBAREUHnzp0JDw+nQ4cOhpWmrKmqfdeqWr2ieisoKCApKYkdO3aQmJhI+/btKSgoYM+ePaxcuRJXV1fDCnJeXl54e3vj7u5u0ZpGjRp1zzlbxnzPrJ9eQgghhGDRokUsW7aMnTt3cu7cOcP99evXJzIyEmdnZzZv3kzr1q3vuB6HEMI+Xb58mRkzZrBz50727t1Lfn6+4bG//e1vtG3bloEDB9KtWze8vLwqvVe0Zs2aZtmONEiEEEKISlLc+7Ft2zZ27txJjRo1+OCDDwDYsWMHK1euJCgoiEGDBtG1a1e6du1aYoK2tZfgFUJYRkFBAYmJiWzfvp0dO3bwwgsv0KNHD9zc3Pjss8+oUaMG999/P127diUiIgKtVsvevXt5+OGHadKkibXLN5k0SIQQQggLS05OZubMmWzdurXE0IUOHToYGiRvvfUW77//PrVr17ZWmUKISvbvf/+bn3/+mV27dhnmfmg0Gnr27EmPHj1wcXHh8OHDhuWvi61ZswbAbvJCGiRCCCGEmeTm5pKQkMDWrVvZunUrCxcupHHjxuj1en744QcCAgJ4+OGHiYyMpFu3brRq1crw2saNG1uxciGEJZ05c8aQC7Vq1WLWrFkA7N+/n4SEBCIjI+nevTvdunWjc+fO1KlTx/BaX1/fO7Z37do1ANzc3CqlfkuTBokQQghhojfeeIO4uDj27NmDVqsFwMXFhT/++IPGjRsTGBhIVlYW9evXt3KlQghLyMrKIi0trcR9qampfP311/z++++cPXvWcH/r1q15/PHHAXjyySd59tlnSyxKkZqaes/9ZWZm4ubmVulzRixFGiRCCCGEkU6dOsWmTZvYsmULXbp0YfTo0QCsX7+elJQUHnzwQbp370737t3p1KkTNWrUAIqufi6NESHsU2FhIR9//DHbt28nPT2dwYMH4+bmxtmzZ/nf//5Hw4YNCQ0NxcfHBx8fH+rVq2dYjtcU3t7eZqjeNkiDRAghhCjD1q1bWbBgAfHx8Rw/ftxwf25urqFBsnr1aho2bGg3ZyuFEGVTSjFnzhx+++03tm7dSk5ODgBOTk6EhITQuXNndDodY8aMoUGDBhapwdPT0yLbtYYyGyQODg5oNJq7Pq7T6cxekBDC9p05cwZHR8e7Pi7ZIKqq9PR04uPjSU5OZvbs2QAcPnyYr776Cj8/P8aMGcP9999Pz549S6y9L/M/io4ZlFJ3zQbJBVFVabVa9uzZw6ZNm2jdujVDhw5Fo9Hwww8/cODAASIiInB1dSUwMJC3336bWrVqWbvkKqfMBkl2djZKKT766CNyc3MZP348APPmzTPbusNCiKqnadOmHD16VLJBVHm5ubn89NNPxMfHEx8fX2IM+EsvvYSXlxfDhw9nwIABdjU8whKys7Px9/fnueeek1wQVd4ff/zB8uXL2bRpE9u2bTNMIh80aBBDhw4F4KeffqJZs2bUrFmT9957D29vb2mMVJBRV2oPCwtj796997zP2uSKq0JUjuLvmmSDqGpOnz7Nxo0b6dSpEx06dCAvL4+6deuSn59P69at6dWrF/fffz+9evXCy8vL2uVWOd7e3nh6elaJXADJBlGksLCQvXv3smfPHp5//nmgqCE9fvx4XF1d6dq1qyEXunTpckcDW6/XM2PGDNq3b2+YrC5uMtuV2rOzs8nMzDR0SWdmZpKdnW16hUKIKk2yQdi6S5cuER8fz8aNG9mwYQNHjhwB4M033+Ttt9+mRo0arF69mvbt29OsWTMrV2sfJBeErVNKcfjwYTZs2MDGjRuJi4vj6tWrAAwdOpSmTZsyePBg2rdvT+fOnQ2LU9xN8dXTXV1dLV67vTKqQTJ58mSCg4MZOHAgAGvXrmX69OmWrEsIUQVINghbk5eXx/Hjx2nfvj0AU6ZM4csvvwSgefPmPPvss/Tp04c+ffoYXtO3b1+r1GqvJBeELTp9+jTOzs54enpy/fp1goOD0Wq1ODo60rlzZ/r27UufPn0ME9CbNGli9BXQ8/LyAO7ZcBF3Z1SDZOzYsURGRhIXFwfApEmT6NChg1E7mDhxIqtWreLkyZMkJiYSEhJS4vEFCxYwevRoli9fzuDBg4GisymjRo3i2LFjuLq68u9//5uePXsa/66EEJXClGwQwhx0Oh379u0znOncunUr9erV4+zZs2g0GqKjowkLC6NPnz74+fmVuVCLMA/JBWELintHi7PhyJEjvP3227z55pvUqlWL9957j1atWtGjRw88PDxKvLagoKBc+yqeXyINkoozetnfBg0aEBgYyP33309hYSEFBQW4uLjc83XDhw9nypQpdO/e/Y7H0tLS+OKLL4iIiChx/6uvvkpERARr164lISGBIUOGcOLECZydnY0tVwhRSSqaDUJUlFIKjUZDSkoKnTt35vLly0DRwUDPnj3p27cvWq0WFxcXIiMjiYyMtG7B1ZDkgqhsxbkAMH36dGbMmIFerwdu9o527doVKLpuUE5ODvv372f//v1mq0EaJBVnVINkyZIlTJ48GQcHB06cOMHBgwd57bXX+OWXX+752rv1bOj1ev7617/yySefMHny5BKP/fTTT4arVIaHh9OsWTM2bdok3epC2BhTskEIY2VnZxMXF8e6detYt24dH3/8MQMHDqRly5aEhoYSERFB37596dq1qxwQ2ADJBVFZUlNTDblw7NgxDhw4gEajISgoiCFDhtCnTx/69u17R+/o+fPncXBwICgoyGy1ODk50a5dO7Ntr7oxqkHy3nvvsW/fPkODIDg4mJMnT5q047lz5xIZGUlYWFiJ+7OystBqtSXG7fn6+pKenl7qNubOnWu4XXxRGiFE5bBENghRbOHChXz99dds27YNrVYLFP0+KJ4g7eTkxMaNG61ZoiiF5IKwpIsXLzJt2jTWrVtnuFCpo6Mj3bp148qVK9StW5ehQ4caluYtTWFhITVq1GDQoEGVVba4B6MaJI6OjndcZdKUrtcDBw6wdOlSNm/eXOFtQNG41EmTJhluyxrxQlQuc2eDqL4uXLjA+vXrycrK4oUXXgBg//797N69m379+tG/f3/69+9P69atZR6IjZNcEOailOL3339n3bp19OnTh06dOlG7dm0WLVpEgwYNGDt2LP379+eBBx6gTp06Rm+3sLAQJyejZy2ISmDUp+Hu7s758+cNvwQ2btxI/fr1K7zTLVu2kJaWhr+/PwAZGRnExMRw7tw5xo8fj5OTExkZGYZekrS0tBJXxBVC2AZzZ4OoPgoLC9m5cydr165l7dq17Nu3D6UUHh4eht8D06ZN47333pOlNKsYyQVhij///JNff/2VtWvX8uuvv3L+/HkAXnnlFTp16oSLiwtHjhyhSZMmFT45IQ0SG6SMkJCQoDp27Kjq1KmjIiMjVbNmzVRiYqIxLzVo0aLFXV/Tq1cvtXz5csPtqKgo9dZbbymllNq9e7dq1qyZKigouOc+vLy8ylWTEKJiir9rFc2GF154QbVo0UIBpT7/q6++UkCJXDh//rzq37+/8vPzUx06dFCbNm0qd73Cuv78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E+jZsyfbtm2jsLCQr7/+mk6dOgEQGxvLP//5T2rXrs2QIUP4+9//bvhc161bx2uvvUZhYSH16tXjP//5D+3btyc+Pp6XXnqJpKQk0tLSCAkJ4cUXX2T16tVcuXKFjz/+mIEDBwKwcuVKXn31VVxcXBgwYADz589nz549+Pr6Gt7H5cuX6d27N3l5eYSFhfHkk0/SpEkTVqxYwYoVKwBYvXo1c+bMIT4+nrfffptly5YBRfMNDh48SFpaGu+99x47d+4EioYSpaSkoJQqcSG2hQsXsmjRIho1asSBAwdwdXXlp59+olWrVgC89dZbfPfdd9SrV4/+/fuzaNEi0tLS7vi/v3LlCpMnT2bnzp04OjoSFhbGV199xcaNG5k2bRp5eXkUFBQwadIkxowZA0B0dDQuLi4cP36cY8eO0bt3b8aNG8eUKVNIT09n8ODBhknY999/P4GBgezcuZNLly4xaNAg5syZg0ajYe7cuSxevBitVouzszMff/wxXbt2NXz+K1asICQkhMOHD/Pss89y9epV2rRpQ05ODk8//TTR0dFER0fj6upKamoqp06dIiAggB9++OGO5X3vxZ5yAYqW/TXHIYNkg2RDdc+Gshj1m/dvf/sbHTt2ZPTo0YwePZrQ0FCLrDFeGYqX/bWHYRlCWJs9ZYOugpPabU1iYiL+/v40aNCgxP1du3bl1KlTXLhwAYDDhw8TFRXF77//zgsvvMAbb7wBwIEDB5g+fTqbN29m3759hrH5AJmZmTz99NN8/fXX7N+/n5iYGIYPH17qweaVK1cICgpi7969fPrpp7z88suGbYwePZrly5fz+++/07ZtW8OFNm9Vt25dfvnlF9zd3UlKSuLVV18t833//e9/JykpiaSkJLp168bo0aNp0aIF8+bNIykpiT179nDffffx9ttvl/r6hIQEZs6cSXJyMn379uX9998HYM2aNSxdupTExER2797NmTNn7lrDSy+9hIuLC/v37+f33383bCM0NJStW7eSmJjIli1bePvtt0tctTg5OZnVq1dz5MgRNm/ezHvvvcf69etJTk7mu+++K3Ghv0OHDrF9+3b279/Ppk2bWLx4MQAjR44kISGBpKQkPvnkE5599tlSaxw5ciQxMTEcPHiQd999l82bN5d4PCkpif/+97/88ccfnD9/nqVLl5b5/14ae8oFAD0auzhmkGyQ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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')\n", "plt.subplot(1, 3, 1)\n", "plt.plot(stmt_ts, color='white')\n", "plt.plot(stmt_ts[:time])\n", "plt.xticks(range(0, trials + 1, int(time)))\n", "plt.xlabel('# of fuzz inputs')\n", "plt.ylabel('# of statements exercised')\n", "\n", "plt.subplot(1, 3, 2)\n", "line_cur, = plt.plot(stmt_ts[:time], label=\"Ongoing fuzzing campaign\")\n", "line_pred, = plt.plot(prediction_ts, linestyle='--',\n", " color='black', label=\"Predicted progress\")\n", "plt.legend(handles=[line_cur, line_pred])\n", "plt.xticks(range(0, trials + 1, int(time)))\n", "plt.xlabel('# of fuzz inputs')\n", "plt.ylabel('# of statements exercised')\n", "\n", "plt.subplot(1, 3, 3)\n", "line_emp, = plt.plot(stmt_ts, color='grey', label=\"Actual progress\")\n", "line_cur, = plt.plot(stmt_ts[:time], label=\"Ongoing fuzzing campaign\")\n", "line_pred, = plt.plot(prediction_ts, linestyle='--',\n", " color='black', label=\"Predicted progress\")\n", "plt.legend(handles=[line_emp, line_cur, line_pred])\n", "plt.xticks(range(0, trials + 1, int(time)))\n", "plt.xlabel('# of fuzz inputs')\n", "plt.ylabel('# of statements exercised');" ] } ], "metadata": { "ipub": { "bibliography": "fuzzingbook.bib", "toc": true }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.2" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": true, "title_cell": "", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": true }, "toc-autonumbering": false, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }