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 | Вставляет случайные операции работы с памятью (загрузку и запись), меняя поведение программы за счёт манипуляций с адресами и регистрами. |