LibreOffice oss-fuzz, crashtesting, coverity Overview Oss-Fuzz - - PowerPoint PPT Presentation

▶
libreoffice oss fuzz crashtesting coverity overview
SMART_READER_LITE
LIVE PREVIEW

LibreOffice oss-fuzz, crashtesting, coverity Overview Oss-Fuzz - - PowerPoint PPT Presentation

LibreOffice oss-fuzz, crashtesting, coverity Overview Oss-Fuzz Crashtesting Coverity Oss-Fuzz Overview Continuous Fuzzing of our import filters Thanks to Google we get to use their infrastructure and resources


slide-1
SLIDE 1

LibreOffice oss-fuzz, crashtesting, coverity

slide-2
SLIDE 2

Overview

  • Oss-Fuzz
  • Crashtesting
  • Coverity
slide-3
SLIDE 3

Oss-Fuzz

slide-4
SLIDE 4

Overview

  • Continuous Fuzzing of our import filters
  • Thanks to Google we get to use their infrastructure and resources
slide-5
SLIDE 5

Configuration

  • Build remotely on google’s side

–

Calls our bin/oss-fuzz-build.sh

  • 45 fuzzer targets in vcl/workben
  • Each one is built with

–

libfuzzer + asan

–

libfuzzer + ubsan

–

afl + asan

–

honggfuzz + asan => 180 total

slide-6
SLIDE 6

Configuration

  • No dynamic libraries allowed

–

A serious pain for us

–

distro-configs/LibreOfficeOssFuzz.conf

–

Reuse --disable-dynamic-loading intended for iOS

–

Individual fuzzers are unfortunately v. large

  • Run without config layer

–

Hardcoded suitable default for –enable-fuzzers

–

utl::ConfigManager::IsAvoidConfig()

  • https://dev-www.libreoffice.org/corpus/

–

Contains our seed corpuses for 60 file formats

–

15 are dtardons and co’s dlplib filters and are fuzzed separately

slide-7
SLIDE 7

Oss-Fuzz Reports per Year

  • Over 1100 issues over four years

2017 2018 2019 2020 50 100 150 200 250 300 350 400 450 500

  • ss-fuzz: Last 4 Years

Projected Filed

Year Reports

  • More than one a day in 2017 and 2018
  • 113 this year to date, estimate 142 by end of year
  • This years uptick due to a new route from sftfuzzer into old untested code
slide-8
SLIDE 8

What a report looks like

Auto minimize

slide-9
SLIDE 9

Sample ubsan bug

  • Buggy change, the unsigned

short is promoted to int, undefined behavior in addition

  • Change back to a larger

unsigned type

slide-10
SLIDE 10

Timeouts

  • Sometimes timeout is genuine infinite loop

–

More often it’s just slow

  • OssFuzz will report a maximum of one timeout per fuzzer
  • Fix a timeout, another typically gets reported soon after
  • Limit input size with a .options files

[libfuzzer] max_len = 65536

  • Some file formats have ~infinite decompression support

–

Tiny input can legitimately provide mega data to process

–

Examine FUZZ_MAX_INPUT_LEN (from .options) at runtime and limit to some factor of that

slide-11
SLIDE 11

OOM

  • Limit memory usage with

setenv("JPEGMEM", "768M", 1); setenv("SC_MAX_MATRIX_ELEMENTS", "60000000", 1); setenv("SC_NO_THREADED_CALCULATION", "1", 1);

  • Pre-allocating buffers depending on potentially lying headers

–

Often a known relationship between remaining length of the file and the amount of data that it can produce

–

So short reads can be predicted before buffer allocation

  • GIF’s have a max compression of ~1:2560,
slide-12
SLIDE 12

Current Open Bugs

  • 10 open bugs

–

All Timeouts

slide-13
SLIDE 13

CrashTesting

slide-14
SLIDE 14

Overview

  • Document Corpus

–

Most scraped out of various bugzilla instances with get-bugzilla-attachments-by-mimetype

–

116,200 files

  • Import them all

–

With Markus Mohrhard’s test-bugzilla-files

  • For many formats, then export to multiple formats
  • Reimport exported output
  • Report failed imports/exports
  • Backtraces extracted from coredumps
slide-15
SLIDE 15

New Setup

  • New Hardware this year

–

Next day results

–

Vs ~3 days with old setup

  • Thanks to Adfinis
slide-16
SLIDE 16

12 Months of Importing

  • Persistent <10 cluster of failures

1 4 7 1 1 3 1 6 1 9 2 2 2 5 2 8 3 1 3 4 3 7 4 4 3 4 6 4 9 5 2 5 5 5 8 6 1 6 4 6 7 7 7 3 10 20 30 40 50 60 70

Import Failures

Import

Build Failures

slide-17
SLIDE 17

12 Months of Exporting

  • Large jumps as regressions detected and fixed

1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 50 100 150 200 250 300

Export Failures

Export

Build Failures

slide-18
SLIDE 18

Coverity

slide-19
SLIDE 19

Configuration

  • Build locally with coverity’s tooling
  • Outputs a big blob which we upload to their server which does

the analysis

  • https://scan.coverity.com/projects/libreoffice
  • Project settings are open, no need to apply to be a “member” to

see the findings

  • Contemporary coverity scans both C++ and Java
  • Coverity currently supports C++17, but not C++2a

–

patch configure.ac to not try c++2a for the coverity run

  • We only scan LibreOffice, not dependencies

–

distro-configs/LibreOfficeCoverity.conf

–

So no ignored “external” category anymore

slide-20
SLIDE 20

Example warning

  • uninit_member

–

If a class initializes none of its members in its ctors there is no warning as its assumed to be intentional

–

If it initializes most of them, it warns about the uninitialized ones

–

A common mistake is with a class with multiple ctors, new member gets added and initialized in one ctor but not the other

warning type

slide-21
SLIDE 21

Pattern for waiving warnings

  • An issue can be marked as a false positive or intentional in the web UI

–

But that only affects that coverity instance. Red Hat runs another one f.e.

–

If the code changes enough coverity will loose the ability to detect its the same code and reissue the warning

  • INTENTIONAL pattern

–

// coverity[WARNING] - OPTIONAL_COMMENT

–

WARNING is the text before the : in the report

– – –

  • FALSE POSITIVE pattern

–

// coverity[WARNING : FALSE] - OPTIONAL_COMMENT

slide-22
SLIDE 22

Pattern to indicate program exit

  • // coverity[+kill] indicates that the annotated function is intended to

kill the program

– – –

  • We use this in cppunit to indicate that that Asserter::fail is intended

to exit the program. In reality it throws a deliberately unhandled exception which would be warned about otherwise

  • Note that –enable-assert-always-abort is active for our coverity

builds so failing asserts terminate program flow so coverity warnings about “impossible” situations are resolvable by adding appropriate asserts

slide-23
SLIDE 23

Tainted data

  • Coverity detects common byteswapping techniques as indicating

that data is probably untrusted tainted data

  • Very helpful for our general file format parsing, but not for our own

legacy registry data format

  • __coverity_tainted_data_sanitize__ can be used to sanitize the data
slide-24
SLIDE 24

Tainted data

  • Validating untrusted data

–

A simple sanity test of tainted example

slide-25
SLIDE 25

Outstanding vs Fixed defects

Gap between requiring C++17 and coverity support

slide-26
SLIDE 26

Coverity Stats 2020