2024-07-15 17:00:53 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
import configparser
|
|
|
|
import logging
|
|
|
|
import os
|
|
|
|
from pathlib import Path
|
|
|
|
import subprocess
|
|
|
|
|
|
|
|
DEBUGGER = os.getenv("DEBUGGER", "")
|
|
|
|
FUZZER_ARGS = os.getenv("FUZZER_ARGS", "")
|
|
|
|
|
|
|
|
|
|
|
|
def run_fuzzer(fuzzer: str):
|
2024-07-16 14:17:51 +00:00
|
|
|
logging.info("Running fuzzer %s...", fuzzer)
|
2024-07-15 17:00:53 +00:00
|
|
|
|
|
|
|
corpus_dir = f"{fuzzer}.in"
|
|
|
|
with Path(corpus_dir) as path:
|
|
|
|
if not path.exists() or not path.is_dir():
|
|
|
|
corpus_dir = ""
|
|
|
|
|
|
|
|
options_file = f"{fuzzer}.options"
|
|
|
|
custom_libfuzzer_options = ""
|
|
|
|
fuzzer_arguments = ""
|
|
|
|
|
|
|
|
with Path(options_file) as path:
|
|
|
|
if path.exists() and path.is_file():
|
|
|
|
parser = configparser.ConfigParser()
|
|
|
|
parser.read(path)
|
|
|
|
|
|
|
|
if parser.has_section("asan"):
|
|
|
|
os.environ["ASAN_OPTIONS"] = (
|
2024-07-16 15:01:43 +00:00
|
|
|
f"{os.environ['ASAN_OPTIONS']}:{':'.join(f'{key}={value}' for key, value in parser['asan'].items())}"
|
2024-07-15 17:00:53 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
if parser.has_section("msan"):
|
|
|
|
os.environ["MSAN_OPTIONS"] = (
|
2024-07-16 15:01:43 +00:00
|
|
|
f"{os.environ['MSAN_OPTIONS']}:{':'.join(f'{key}={value}' for key, value in parser['msan'].items())}"
|
2024-07-15 17:00:53 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
if parser.has_section("ubsan"):
|
|
|
|
os.environ["UBSAN_OPTIONS"] = (
|
2024-07-16 15:01:43 +00:00
|
|
|
f"{os.environ['UBSAN_OPTIONS']}:{':'.join(f'{key}={value}' for key, value in parser['ubsan'].items())}"
|
2024-07-15 17:00:53 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
if parser.has_section("libfuzzer"):
|
|
|
|
custom_libfuzzer_options = " ".join(
|
2024-07-16 15:16:11 +00:00
|
|
|
f"-{key}={value}" for key, value in parser["libfuzzer"].items()
|
2024-07-15 17:00:53 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
if parser.has_section("fuzzer_arguments"):
|
|
|
|
fuzzer_arguments = " ".join(
|
2024-07-16 14:17:51 +00:00
|
|
|
(f"{key}") if value == "" else (f"{key}={value}")
|
2024-07-15 17:00:53 +00:00
|
|
|
for key, value in parser["fuzzer_arguments"].items()
|
|
|
|
)
|
|
|
|
|
|
|
|
cmd_line = f"{DEBUGGER} ./{fuzzer} {FUZZER_ARGS} {corpus_dir}"
|
|
|
|
if custom_libfuzzer_options:
|
|
|
|
cmd_line += f" {custom_libfuzzer_options}"
|
|
|
|
if fuzzer_arguments:
|
|
|
|
cmd_line += f" {fuzzer_arguments}"
|
|
|
|
|
|
|
|
if not "-dict=" in cmd_line and Path(f"{fuzzer}.dict").exists():
|
|
|
|
cmd_line += f" -dict={fuzzer}.dict"
|
|
|
|
|
|
|
|
cmd_line += " < /dev/null"
|
|
|
|
|
2024-07-16 14:17:51 +00:00
|
|
|
logging.info("...will execute: %s", cmd_line)
|
2024-07-15 17:00:53 +00:00
|
|
|
subprocess.check_call(cmd_line, shell=True)
|
|
|
|
|
|
|
|
|
2024-07-15 19:10:07 +00:00
|
|
|
def main():
|
2024-07-15 17:00:53 +00:00
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
|
|
|
|
|
|
subprocess.check_call("ls -al", shell=True)
|
|
|
|
|
|
|
|
with Path() as current:
|
|
|
|
for fuzzer in current.iterdir():
|
|
|
|
if (current / fuzzer).is_file() and os.access(current / fuzzer, os.X_OK):
|
|
|
|
run_fuzzer(fuzzer)
|
2024-07-15 19:10:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|