Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
52 changes: 52 additions & 0 deletions Containers/sqlite/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#Basic Image (ubuntu 21.04 предоставляет наиболее актуальную версию llvm/clang для работы AFL++)
FROM ubuntu:21.04 AS base_image

#Сведения о контейнере
LABEL maintainer="a.irkhin@gardatech.ru"
LABEL version="1.0"
LABEL description="Докер контейнер для фаззинга sqlite с применением AFL++ на Ubuntu 21.04"

#запускаем обновление репозитория и устанавливаем с временной зоной tzdata (необходимо для следующих пакетов)
RUN apt-get update && DEBIAN_FRONTEND="noninteractive" TZ="Russia/Moscow" apt-get install -y tzdata

#ставим пакеты для AFL++. На данный момент рекомендуется версия >=11, в репозитории 12я
RUN apt-get -y install build-essential python3-dev automake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools \
lld llvm llvm-dev clang

RUN apt-get -y install gcc-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-dev

#ставим пакеты для sqlite
RUN apt-get -y install tcl locales wget

RUN locale-gen en_US.UTF-8

#ставим AFL++
WORKDIR /afl
RUN wget https://github.com/AFLplusplus/AFLplusplus/archive/refs/tags/3.14c.tar.gz && \
tar -xf 3.14c.tar.gz && \
cd AFLplusplus-3.14c && \
make && make install
#make ASAN_BUILD=1 && make install рекомендуется компилировать с опцией ASAN_BUILD=1 при сборке для санитайзеров

#настройка переменных окружения
ENV CC=afl-cc
ENV CXX=afl-cc
ENV LD=afl-cc
#ENV AFL_USE_ASAN=1 для компиляции с ASAN санитайзером

#сборка sqlite
WORKDIR /sourcecode
RUN git clone https://github.com/sqlite/sqlite && cd sqlite && \
./configure --disable-shared && make sqlite3.c

#сборка фаззинг обёртки для sqlite
WORKDIR /fuzzingapp
RUN cp /sourcecode/sqlite/sqlite3.[ch] .; cp /sourcecode/sqlite/tool/fuzzershell.c .
RUN afl-cc -O3 -o fuzzershell -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_LOAD_EXTENSION=0 -DSQLITE_DEBUG -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_RTREE -DSQLITE_OMIT_RANDOMNESS -I. fuzzershell.c sqlite3.c -ldl

#передача тестовых образцов в докер контейнер
RUN mkdir Testcases
COPY Testcases/ ./Testcases


CMD if [ -f "samples.dict" ]; then afl-fuzz -i Testcases/ -o out -T sqlite -x samples.dict -- ./fuzzershell --oom --autovacuum; else afl-fuzz -i Testcases/ -o out -T sqlite -x /afl/AFLplusplus-3.14c/dictionaries/sql.dict -- ./fuzzershell --oom --autovacuum; fi
33 changes: 33 additions & 0 deletions Containers/sqlite/Dockerfile-for-coverage
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#Basic Image (выбран ubuntu 21.04 т.к. на нём выполняется фаззинг тестирование)
FROM ubuntu:21.04 AS base_image

#Сведения о контейнере
LABEL maintainer="a.irkhin@gardatech.ru"
LABEL version="1.0"
LABEL description="Докер контейнер для сборки покрытия sqlite"

#запускаем обновление репозитория и устанавливаем с временной зоной tzdata (необходимо для следующих пакетов)
RUN apt-get update && DEBIAN_FRONTEND="noninteractive" TZ="Russia/Moscow" apt-get install -y tzdata

#ставим пакеты для установки sqlite и сборки покрытия (lcov)
RUN apt-get -y install build-essential tcl git lcov

#сборка sqlite
WORKDIR /sourcecode
RUN git clone https://github.com/sqlite/sqlite && cd sqlite && \
./configure && make sqlite3.c

#сборка фаззинг обёртки для sqlite
WORKDIR /coverageapp
RUN cp /sourcecode/sqlite/sqlite3.[ch] .; cp /sourcecode/sqlite/tool/fuzzershell.c .
RUN gcc -g --coverage -O3 -o fuzzershell -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_LOAD_EXTENSION=0 \
-DSQLITE_DEBUG -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_RTREE -I. fuzzershell.c sqlite3.c -ldl
RUN mkdir Testcases
COPY Testcases/ ./Testcases


CMD ./fuzzershell --oom --autovacuum -v --unique-cases unique-cases_fuzzershell.txt Testcases/* > log-fuzzershell.txt \
&& lcov -t "sqlite3" -o sqlite3.info -c -d . \
&& genhtml -o report-sqlite3 sqlite3.info \
; cp unique-cases_fuzzershell.txt report-sqlite3/ \
; cp log-fuzzershell.txt report-sqlite3/
106 changes: 106 additions & 0 deletions Containers/sqlite/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# Фаззинг стандартных функций sqlite

Проект по фаззингу обработки SQL команд в sqlite. Для фаззинга применяется AFL++

Зависимости:
* Docker

Результаты тестирования расположены в папке [results](results)

## Формирование цели

Для формирования цели необходимо создать директорию в которой расположить следующие элементы:
* Testcases - [обязательно] директория с входным корпусом данных для фаззинга и анализа покрытия
* samples.dict - [не обязательно] словарь для фаззинга (если словать будет отсутствовать, то AFL++ будет запущен с обычным SQL словарём из коробки)

## Описание сборки Dockerfile

1. Производится сборка AFL++ (/afl/AFLplusplus-3.14c)
2. Производится сборка sqlite (/sourcecode)
3. Производится сборка модуля fuzzershell, реализующий цель для фаззинга
4. Запускаем фаззинг
* /sourcecode/sqlite - исходники и собранный код sqlite
* /fuzzingapp - собранный sqlite и его модуль fuzzershell
* /fuzzingapp/Testcases - директория с входным корпусом данных для фаззинга
* /fuzzingapp/out - результаты работы AFL


## Запуск фаззинга

Производим сборку Docker контейнера:
``` bash
docker build -f Dockerfile --tag=sqlite .
```

Запускаем фаззинг:
``` bash
docker run -ti -v $(pwd)/findings:/fuzzingapp/out sqlite
```

Результаты фаззинга должны сохраниться в локальной директории findings, где был запущен контейнер.

## Сборка покрытия

Производим сборку Docker контейнера:
``` bash
docker build -f Dockerfile-for-coverage --tag=sqlite-coverage .
```

Запускаем анализ покрытия:
``` bash
docker run -ti -v $(pwd)/coverage:/coverageapp/report-sqlite3 sqlite-coverage
```

## Особенности фаззинг сборки
Флаги при сборке sqlite
```
-DSQLITE_DEBUG для включения assert() проверок
-DSQLITE_OMIT_RANDOMNESS выключение ГПСЧ (иначе AFL++ будет считать каждый запуск уникальным)
-DSQLITE_THREADSAFE=0 и -DSQLITE_ENABLE_LOAD_EXTENSION=0 для корректной компановки
-DSQLITE_ENABLE_FTS4 для сборки с поддержкой FTS4 дополнения (полнотекстовый поиск), может быть необходимо для тестирования большего функционала
-DSQLITE_ENABLE_RTREE для сборки с поддержкой R*Tree модуля, может быть необходимо для тестирования большего функционала
-ldl обозначение библиотеки для компоновщика
```

Фаззинг обёртка имеет несколько дополнительных опций:
```
--autovacuum Включение AUTOVACUUM режима
--database FILE Использование файла базы данных вместо ОЗУ
--disable-lookaside Выключение lookaside памяти (описание в ссылках)
--heap SZ MIN Размер кучи
--help Вывод справочной информации
--lookaside N SZ Настройка lookaside
--oom Запуск каждого теста несколько раз с симуляцией out of memory состояния
--pagesize N Настройка размера страницы
--pcache N SZ Настройка размера pagecache
-q Уменьшение вывода в консоль
--quiet Уменьшение вывода в консоль (альтерантивная запись -q)
--scratch N SZ Настройка scratch памяти
--unique-cases FILE Запись уникальных тестовых случаев в файл FILE
--utf16be Установка кодировки UTF-16BE
--utf16le Установка кодировки UTF-16LE
-v Увеличение вывода в консоль
--verbose Увеличение вывода в консоль (альтерантивная запись -v)
```
В данном случае используется только:
```
--autovacuum Тестирование как будет работать сжатие базы данных
--oom Для тестирования в более сложных условиях
--unique-cases FILE Запись уникальных тестовых случаев в файл FILE (для возможного сравнения результатов)
-v Для вывода большего количества информации о выполнении теста (при сборке покрытия)
```
Некоторые константы
* По умолчанию у `OOM_MAX` (определяет максимальное количество итераций при использовании --oom) стоит значение `625`

## Полезные ссылки

* https://github.com/AFLplusplus/AFLplusplus - репозиторий AFL++
* https://github.com/sqlite/sqlite - репозиторий sqlite
* https://github.com/sqlite/sqlite/blob/master/tool/fuzzershell.c - код фаззинг обёртки
* https://www.sqlite.org/afl/doc/trunk/README.md - описание фаззинг тестирования sqlite через fuzzershell
* https://github.com/ispras/crusher/
* https://www.sqlite.org/malloc.html - описание работы с памятью (lookaside)
* https://www.sqlite.org/rtree.html - описание R*Tree модуля
* https://www.sqlite.org/fts3.html - описание FTS4 дополнения

Данный набор контейнеров подготовлен компанией ООО "Гарда Технологии"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
!
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/*
L*//*
�/*�*//****6666$6666��)**//**//****6666��*~**//****6H****696���*66****666696666��**//*

/*****//*

/*�*//****6666$6666�***696666��*~**//****6H****696���*66****666696666���*//*

/***//****666696666��****//****66696666��**//*

/***/--�

--****66696666��**//*

/*�*//****6666$3646��**//**//*****6H�)**//**//**
*6H****696666��*~**//****6H****696���*66****666696666��**//*

/***//****666696666��****//****66696666��**//*

/***/--�

--*;

/***//****666696666��**//*

/***//****666>96666��****//****66696666��**//*

/*�*//****6666*/--�

--*;

/***//****666696666��**//*
66666
/***//****6*

/*�*//****6666$6666�***696666��*66696666��**//*
/***//****666>96666��***//****66696666��**//*

/*�*//****6666$3646��**//*�//*****6H****�*66****666696666H�**//*

/***//*
;�;S;;;;;;;;;;;;;;;;;;;;;;;;;;;;;//****666696666��****//****6696:::��**//*

/***/--�

--*;

/***//****666696666��**//*
66666
/***//****666>96666��****//****66696666��**//*

/*�*//****6666$3646��**//**//*****6H�)**//**//****6H****696666��*~**//****6H****696���*66****666696666��**//*

/***//****666696666��****//****66696666��**//*

/***/--�
--*;

/***//****666696666��**//*

/***//****666>96666��****//****66696666��**//*

/*�*//****6666$3646��**//*�//*****6H****�*66****666696666H�**//*

/***//*
;;;;S;;;;;;;;;;;;;;;;;;;;;;;;;;;;;//****666696666��****//****66696666��**//*

/***/--�

--*;

/***//****666696666��**//*
66666
/***//****666>96666��****//****66696666��**//*

/*�*//****6666$3646��**//**//*****6H****�*66****666696666H�66>96666��****//****66696666��**//*

/*�*//****6666$3646��**//**//*****6H�)**//**//****6H****696666��*~**//****6H****696���*66****666696666��**//*
666��**//*
6696666��****//****66696666��**//*

/***/--�

--*;

/***//*#**666696666��**//*

/***//****666>96666��****//****66696666��**//*

/*�*//****6666$3646��**//*�//*****6H****�*66****666696666H�**//*

/***//*
;;;;S;;;;;;;;;;;;;;;;;;;;;;;;��**//*

/***//****666696666��****//****66696666��**//*

/***/--�

--*;

/***//****666696666��**//*

8***//****666>96666��****//****66696666��**//*

/*�*//****6666*/--�

--*;

/***//****666696666��**//*
66666
/***//****6*

/*�*//****6666$6666�***696666��*66696666��**//*
/***//****666>96666��***//****66696666��**//*

/*�*//****6666$3646��**//*�//*****6H****�*66****666696666H�**//*

/***//*
;;;;S;;;;;;;;;;;;;;;;;;;;;;;;;;;;;//****666696666��****//****6696:::��**//*

/***/--�

--*;

/***//****666696666��**//*
66666
/***//****666>96666��****//****66696666��**//*

/*�*//****6666$3646���)*//**//*****6H�)**//**//****6H****�96666��*~**//****6H****696���*66****666696666��**//*

/***//****666696666��****//****66696666��**//*

/***/--�

--*;

/***//****666696666��**//*

/***`/****666>96666��****//****66696666��**//*

/*�*//****6666$3646��**//*�//*****6H****�*66****666696666H�**//*

/***//*
;;;;S;;;;;;;;;;;;;;;;;;;;;;;;;;;;;//****666696666��****//****66696666��**//*

/***/--�

--*;

/***//****666696666��**//*
66666
/***//****666>96666��****//****66696666��**//*

/*�*//****6666$3646��**//**//*****6H****�*66****666696666H�66>96666��****//****66696666��**//*

/*�*//****6666$3646��**//**//*****6H�)**//**//****6H****696666��*~**//****6H****696�::::::�:::::::::::::::��*66****666696666��**//*

/***//****666696666��****//****66696666��**//*

/***/--�

--*;

/*6666$3646��**//**//*****6H****�*66***
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
>>
Loading