Project

General

Profile

Developer documentation » History » Version 3

Egor Zheliba, 04/01/2025 11:15 AM

1 1 Egor Zheliba
h1. Developer documentation
2 2 Egor Zheliba
3
В рамках проекта FuzzRV основными директориями для работы являются:
4
5
* *infra* – в этой директории расположены скрипты и логика для сборки Docker-образов и запуска фаззинга. Здесь же находятся вспомогательные инструменты и настройки, необходимые для автоматизации.
6
* *build* – директория, которая формируется после компиляции фаззера. Содержит:
7
** тесты, давшие новое покрытие (new coverage);
8
** исходные сиды (seed corpus), с которых начинается фаззинг;
9
** скомпилированный и исполняемый файл фаззера;
10
** дополнительную директорию, куда помещаются тесты, завершившиеся ошибкой соответствующего санитайзера.
11
* *projects* – основная директория с проектами, готовыми к фаззингу. В каждом проекте находятся все необходимые файлы конфигурации (Dockerfile, build.sh и т.д.). По мере развития проекта эта директория пополняется новыми проектами.
12
13
h2. Описание проекта
14
15
В каждом проекте, как минимум, должны присутствовать следующие файлы:
16
17
* *build.sh* – скрипт сборки и компиляции фаззера. Содержит информацию о процессе подготовки среды тестирования (этапы компиляции, генерация фаззинг-ядра, настройка параметров для тестовой среды).
18
19
* *Dockerfile* – файл, описывающий все зависимости и инструменты, необходимые для работы проекта в Docker-окружении (установка системных пакетов, тулчейна RISC-V, необходимых библиотек и т.д.). Обеспечивает воспроизводимость и независимость процесса фаззинга от внешней среды.
20
21
* *project.yaml* – конфигурационный файл, в котором указывается, какой движок фаззера (например, libFuzzer или AFL) используется, а также какие санитайзеры (AddressSanitizer, UndefinedBehaviorSanitizer) нужно задействовать. Определяет ключевые параметры тестирования.
22
23
* *projectName_fuzzer.cpp* – исходный код фаззера, содержащий функцию `LLVMFuzzerTestOneInput` (для libFuzzer) или аналогичную точку входа для выбранного движка, а также необязательные дополнительные мутаторы, инициализацию, вызовы тестируемой модели и т.п.
24
25
h3. Изменения в файлах и создание собственных проектов
26
27
Все перечисленные файлы (*build.sh*, *Dockerfile*, *project.yaml*, *projectName_fuzzer.cpp*) могут подвергаться модификациям по мере необходимости:
28
- обновление версий пакетов и библиотек в *Dockerfile*;
29
- корректировка процесса сборки или фаззинга в *build.sh*;
30
- дополнение или изменение настроек фаззера (движок, санитайзеры) в *project.yaml*;
31
- доработка кода фаззера (новые мутаторы, иной порядок запуска тестируемой модели) в *projectName_fuzzer.cpp*.
32
33
Если требуется создать собственный проект для фаззинга, его необходимо разместить в директории *projects* и включить туда все необходимые конфигурационные файлы, аналогично уже существующим проектам. Такой подход обеспечивает гибкость и позволяет легко расширять FuzzRV новыми сценариями тестирования или менять окружение под конкретные цели и требования.
34 3 Egor Zheliba
35
h4. Список мутаторов
36
37
1. **InsertLabelJumpsMutator**  
38
   Добавляет новые метки и условные/безусловные переходы, изменяя логику исполнения кода.
39
40
2. **StructuralArithmeticMutator**  
41
   Меняет арифметические операции и значения (например, переключение `add` на `sub`, сдвиги меток и переходов), что даёт значительные изменения в логике.
42
43
3. **ReplaceRandomInstructionsMutator**  
44
   Заменяет найденные инструкции на случайные варианты (например, `add`, `sub`, `mul`, `div`, `and`), повышая разнообразие кода.
45
46
4. **InsertRandomCSRMutator**  
47
   Внедряет операции с системными регистрами (CSR), изменяя их и потенциально влияя на счётчики инструкций.
48
49
5. **InsertRandomMemoryAccessMutator**  
50
   Вставляет случайные операции работы с памятью (загрузку и запись), меняя поведение программы за счёт манипуляций с адресами и регистрами.