[Libreoffice] RFC: Idea for fuzz-testing filters

Marc-André Laverdière marc-andre at atc.tcs.com
Wed Oct 5 05:55:29 PDT 2011

Hi everyone,

Before I start writing code, I wanted to get the input of more
experienced developers.

Why bother about this? Why not use what's available out there? Well...
 - Fuzzgrind isn't well documented and won't work out of the box,
 - zzuf has too many bells and whistles, and won't guarantee that every
byte has been messed up with. I used it to generate a lot of cases, and
it fills a disk quickly enough
 - Peachfuzz and others that rely on a specification: well, we have file
formats with hundreds of pages specified.

Here is the idea:
One process if the fuzzer process, it does the following (pseudocode):

  spawn "valgrind test-program"
  for (i = 0; i < file.length; i++)
    fuzzed = memcpy(file)
    fuzzed[i] = 0xFF (or whatever)
    write(temp-dir/random-name, fuzzed)
    read output from the spawned process until the marker is read
    if valgrind output is more than the expected valgrind start/end markers
      then copy valgrind output to results directory
      then copy fuzzed to results directory
    if spawned program crashed then restart it

The other process would do as follows:
    check if a new file is in temp-dir
    if the file name is "terminate-yourself", then exit
    try to load the file with the filter
    output a marker like "-------- Done trying to load ---------"

With this design, we avoid a lot of process creation overhead.
We can probably generalize it enough that we can put pretty much any
filter in there.

What do you think of this idea? What improvements we can add?


Marc-André Laverdière
Software Security Scientist
Innovation Labs, Tata Consultancy Services
Hyderabad, India

More information about the LibreOffice mailing list