
파이썬 애플리케이션을 위한 커버리지 기반 퍼저
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(Mutation 1) --> |input| function(Fuzzed function)
m2(Mutation 2) --> |input| function(Fuzzed function)
mplus(Mutation ...) --> |input| function(Fuzzed function)
mn(Mutation n) --> |input| function(Fuzzed function)
function --> generate_reports(Generate reports)
generate_reports --> rank_reports(Rank reports)
rank_reports --> select(Select n best reports)
select --> |mutate| nm1(Mutation 1) & nm2(Mutation 2) & nmplus(Mutation ...) & nmn(Mutation n)
subgraph Cycle mutations
direction LR
m1
m2
mplus
mn
end
subgraph Next cycle mutations
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)
# 추가 메서드...
# 계측된 메서드를 하나씩 퍼징합니다
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)
# ./in 디렉토리의 모든 파일을 로드
corpus_1 = frelatage.load_corpus(directory="./")
# ./in/images 하위 디렉토리의 모든 .gif/.jpeg 파일을 로드
corpus_2 = frelatage.load_corpus(directory="./images", file_extension=["gif", "jpeg"])
f = frelatage.Fuzzer(MyFunctionFuzz, [corpus_1, corpus_2])
f.fuzz()
여기에 있는 하나 이상의 딕셔너리를 딕셔너리 전용 디렉토리(기본값 ./dict)에 복사할 수 있습니다.
차등 퍼징은 동일한 입력을 여러 라이브러리/프로그램에 제공하고 동작 차이를 관찰하여 버그를 탐지하는 인기 있는 소프트웨어 테스트 기법입니다. json 및 ujson 라이브러리를 사용한 Frelatage 차등 퍼징 사용 예제는 여기에서 찾을 수 있습니다.
퍼저와 코퍼스의 추가 예제는 examples 디렉토리에서 찾을 수 있습니다.
각 크래시 보고서는 출력 폴더(기본값 ./out)에 id:<crash ID>,err:<error type>,err_pos:<error>,err_file:<error file> 형식의 폴더 이름으로 저장됩니다.
보고서 디렉토리는 다음과 같은 형태입니다:
├── out
│ ├── id:<crash ID>,err:<error type>,err_file:<error file>,err_pos:<err_pos>
│ ├── message
│ ├── input
│ ├── 0
│ ├── <inputfile1>
│ ├── ...
│ ├── ...
각 크래시 보고서에는 오류 메시지가 포함된 message 파일이 포함되어 있습니다.
각 커버리지 증가 보고서는 커버리지 폴더(기본값 ./cov)에 coverage_<ID> 형식의 폴더 이름으로 저장되며, 보고서 디렉토리는 크래시 보고서 디렉토리와 동일한 형태입니다.
함수에 전달된 입력은 <report_folder>/input 파일에 저장되기 전에 pickle 모듈을 사용하여 직렬화됩니다. 따라서 파일 내용을 읽으려면 역직렬화해야 합니다. 이 작업은 frelatage-report 명령으로 수행할 수 있습니다.
$ frelatage-report input
Frelatage를 설정하는 방법은 두 가지입니다: