Dear all,
tldr; Checkout AFL on caffeine (= awesome performance improvements) at https://github.com/mboehme/aflfast!
Our paper on improvements of AFL has just been accepted at the 23rd ACM Conference on Computer and Communications Security (CCS'16). You can find the paper here: https://www.comp.nus.edu.sg/~mboehme/paper/CCS16.pdf ("Coverage-based Greybox Fuzzing as Markov Chain"). You can find our modifications here: https://github.com/mboehme/aflfast. The paper makes an attempt to formalise the machinery that drives AFL and discusses of challenges and opportunities (+technical improvements). Kudos to Michal Zalewski for the awesome work on AFL and everybody else who has contributed! Without your work, ours would not be possible.
AFLFast is a fork of AFL that in experiments with Binutils outperformed AFL by an order of magnitude! It helped in the success of Team Codejitsu at the finals of the DARPA Cyber Grand Challenge where their bot Galactica took 2nd place in terms of #POVs proven (see red bar at https://www.cybergrandchallenge.com/event#results; maybe it is even a tie for 1st place). In our experiments, AFLFast exposed several previously unreported CVEs that could not be exposed by AFL in 24 hours and otherwise exposed vulnerabilities significantly faster than AFL while generating orders of magnitude more unique crashes. Our experiments ran on AFL 1.95b but we ported AFLFast to the most recent version AFL 2.30b. Check out AFLFast on Github and evaluate it yourself.
Essentially, we observed that most generated inputs exercise the same few “high-frequency” paths and developed strategies to gravitate towards low-frequency paths, to stress significantly more program behavior in the same amount of time. We devised several search strategies that decide in which order the seeds should be fuzzed and power schedules that smartly regulate the number of inputs generated from a seed (i.e., the time spent fuzzing a seed). We call the number of inputs generated from a seed, the seed's energy.
We find that AFL's exploitation-based constant schedule assigns too much energy to seeds exercising high-frequency paths (e.g., paths that reject invalid inputs) and not enough energy to seeds exercising low-frequency paths (e.g., paths that stress interesting behaviors). Technically, we modified the computation of a seed's performance score (calculate_score
), which seed is marked as favourite (update_bitmap_score
), and which seed is chosen next from the circular queue (main
).
More details on the power schedule in the paper and here: https://github.com/mboehme/aflfast/blob/master/Readme.md
Happy to hear your thoughts!
Best regards,
- Marcel
In the beginning it is easy for explore to make progress. Later, energy is wasted on fuzzing seeds exercising high-frequency paths versus low frequency paths.
Perhaps we should also time-to-exposure for each vulnerability as a better measure than #unique crashes.
However, using the Markov chain model, we informally argue that our modifications have no detrimental impact on effectiveness. That is, AFL has the *same potential* to generate the unique crashes that AFLFast generated earlier. Because of the circular queue, given the same seeds, there is no reason why AFL should not generate the same unique crashes (at a later point in time) -- on average.
Fuzzing Perl: A Tale of Two American Fuzzy Lops is up at http://www.geeknik.net/71nvhf1fp. A very unscientific study performed over the last 48 hours. =)
--
You received this message because you are subscribed to the Google Groups "afl-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to afl-users+unsubscribe@googlegroups.com.
if anyone is following this, your results would be very welcome, too!