
Фаззер на основе покрытия для Python-приложений
pip3 install frelatage
Фаззер на Python, которого заслуживает мир
Установка | Как это работает | Возможности | Использование Frelatage | Конфигурация
Frelatage — это библиотека для фазинга Python на основе покрытия кода, которую можно использовать для фазинга Python-кода. Разработка Frelatage была вдохновлена различными другими фаззерами, включая AFL/AFL++, Atheris и PythonFuzz. Основная цель проекта — объединить лучшие возможности этих фаззеров в одном новом инструменте для эффективного фазинга Python-приложений.
ПРЕДУПРЕЖДЕНИЕ: Этот проект находится на стадии альфа-версии и может вызывать множество неожиданных поведений. На данный момент Frelatage не следует использовать в производственной среде.
pip3 install frelatage
Рекомендуется для разработчиков. Автоматически клонирует основную ветку из репозитория frelatage и устанавливает из исходников.
# Автоматически клонирует репозиторий Frelatage и устанавливает Frelatage из исходников
bash <(wget -q https://raw.githubusercontent.com/Rog3rSm1th/Frelatage/main/scripts/autoinstall.sh -O -)
Идея, лежащая в основе дизайна Frelatage, заключается в использовании генетического алгоритма для генерации мутаций, которые покроют как можно больше кода. Работа цикла фазинга может быть приблизительно описана следующей диаграммой:
graph TB
m1(Мутация 1) --> |входные данные| function(Фаззируемая функция)
m2(Мутация 2) --> |входные данные| function(Фаззируемая функция)
mplus(Мутация ...) --> |входные данные| function(Фаззируемая функция)
mn(Мутация n) --> |входные данные| function(Фаззируемая функция)
function --> generate_reports(Генерация отчётов)
generate_reports --> rank_reports(Ранжирование отчётов)
rank_reports --> select(Выбор n лучших отчётов)
select --> |мутировать| nm1(Мутация 1) & nm2(Мутация 2) & nmplus(Мутация ...) & nmn(Мутация n)
subgraph Мутации цикла
direction LR
m1
m2
mplus
mn
end
subgraph Мутации следующего цикла
direction LR
nm1
nm2
nmplus
nmn
end
style function fill:#5388e8,stroke:white,stroke-width:4px
Frelatage позволяет фаззить функцию, передавая ей файл в качестве входных данных.
import frelatage
import my_vulnerable_library
def MyFunctionFuzz(data):
my_vulnerable_library.parse(data)
input = frelatage.Input(value="initial_value")
f = frelatage.Fuzzer(MyFunctionFuzz, [[input]])
f.fuzz()
Frelatage предоставляет возможность фаззить входные параметры файлового типа. Чтобы инициализировать значение таких файлов, необходимо создать файлы в папке ввода (по умолчанию ./in).
Если мы хотим инициализировать значение файла, используемого для фазинга, мы можем сделать это следующим образом:
echo "initial value" > ./in/input.txt
А затем запустить фаззер:
import frelatage
import my_vulnerable_library
def MyFunctionFuzz(data):
my_vulnerable_library.load_file(data)
input = frelatage.Input(file=True, value="input.txt")
f = frelatage.Fuzzer(MyFunctionFuzz, [[input]])
f.fuzz()
import frelatage
import my_vulnerable_library
input = frelatage.Input(file=True, value="input.txt")
@frelatage.instrument([[input]])
def MyFunctionFuzz_1(data):
my_vulnerable_library.load_file(data)
@frelatage.instrument([[input]])
def MyFunctionFuzz_1(data):
my_vulnerable_library.load_file_but_different(data)
# And so on
# It will fuzz the instrumented methods one after the other
frelatage.Fuzzer.fuzz_all()
Если вам нужно загрузить несколько файлов в корпус за один раз (полезно, если вы используете большой корпус), вы можете использовать встроенную функцию Frelatage load_corpus. Эта функция возвращает список входных данных.
load_corpus(directory: str, file_extensions: list) -> list[Input]
./, ./images["jpeg", "gif"], ["pdf"]import frelatage
import my_vulnerable_library
def MyFunctionFuzz(data):
my_vulnerable_library.load_file(data)
my_vulnerable_library.load_file(data2)
# Load every every file in the ./in directory
corpus_1 = frelatage.load_corpus(directory="./")
# Load every .gif/.jpeg file in the ./in/images subdirectory
corpus_2 = frelatage.load_corpus(directory="./images", file_extension=["gif", "jpeg"])
f = frelatage.Fuzzer(MyFunctionFuzz, [corpus_1, corpus_2])
f.fuzz()
Вы можете скопировать один или несколько словарей, расположенных здесь, в каталог, предназначенный для словарей (по умолчанию ./dict).
Дифференциальный фазинг — это популярная техника тестирования программного обеспечения, которая пытается обнаружить ошибки, передавая одни и те же входные данные нескольким библиотекам/программам и наблюдая за различиями в их поведении. Пример использования дифференциального фазинга с Frelatage с библиотеками json и ujson вы найдете здесь.
Вы можете найти больше примеров фаззеров и корпусов в каталоге examples.