SatFuzz is a command-aware greybox fuzzing framework for flight software (FSW). It includes reproducible SatFuzz and AFL++ experiments for cFS, SUCHAI, and C2A.
satfuzz/ shared Python package
fuzzer/
cfs/ cFS target fuzzer
suchai/ SUCHAI target fuzzer
c2a/ C2A target fuzzer
specs/
<target>/ canonical target spec used by runs
output/
<target>/<run-tag>/ one fuzzing experiment directory
coverage/ lcov trace, summary, and HTML report
spec/ spec files used for the run
metadata/ target settings and coverage collection status
satfuzz-status.json
run_existing_target_fuzz.py SatFuzz target-fuzzing entrypoint
run_aflpp_experiment.py AFL++ experiment entrypoint
scripts/ supporting utilities
Target versions:
cFS 7.0.0
SUCHAI 3.0.0.rc-2
C2A 4.5.1
Default runtime roots:
cFS Input/cfs/source/cFS
SUCHAI Input/suchai/source/suchai-flight-software
C2A Input/c2a/source/c2a-core
Override them with SATFUZZ_CFS_DIR, SATFUZZ_SUCHAI_DIR, or
SATFUZZ_C2A_DIR only when using an equivalent gcov-built runtime tree.
cFS requires build/coverage_base.info and .gcno files under its runtime
root before fuzzing starts.
Install the Python command from the repository root. Editable installation is recommended because target sources and specifications remain in this checkout.
python3 -m pip install -e .Verify the installed command:
satfuzz --helpIf a user-level installation reports satfuzz: command not found, add the
user scripts directory to PATH and start a new shell:
export PATH="$HOME/.local/bin:$PATH"python3 -m satfuzz --help is an equivalent fallback that does not depend on
PATH.
Install host tools used by the target fuzzers:
sudo apt-get install -y python3 python3-pip cmake lcov gcovr gcc g++ \
gcc-multilib g++-multilib libc6-dev-i386 docker.io pkg-config libzmq3-dev \
afl++C2A also needs Docker and pnpm available on PATH. Build the local target
images once after submodules are available:
./scripts/build_target_images.shSUCHAI needs libzmq3-dev and its Python dependencies:
python3 -m pip install --target satfuzz/fuzzer/suchai/build/python-deps \
-r satfuzz/fuzzer/suchai/requirements.txtThe included specifications were generated with GPT-5.5 through the Codex CLI.
Regenerate one with an authenticated codex executable on PATH:
satfuzz spec generate --target cfs --model gpt-5.5When --seconds is omitted, target campaigns and experiments run each target
for 43,200 seconds (12 hours).
Run SatFuzz only:
satfuzz experiment run --targets cfs suchai c2a --seconds 600 \
--run-tag satfuzz-10m --backend satfuzzRun AFL++ only:
satfuzz experiment run --targets cfs suchai c2a --seconds 600 \
--run-tag aflpp-10m --backend aflppRun both for a matched comparison:
satfuzz experiment run --targets cfs suchai c2a --seconds 600 \
--run-tag comparison-10m --backend bothEach run writes to:
output/<target>/<date>-<run-tag>/
Important files:
coverage/summary.txt line, function, and branch coverage summary
coverage/coverage_total.info
coverage/html/index.html
metadata/spec.json spec copied for this exact run
metadata/ target settings and coverage collection status
satfuzz-status.json machine-readable run status
logs/satfuzz-runner.log wrapper and target-runner log
You can cite our paper with the following bibtex entry. The page field will be updated later.
@INPROCEEDINGS{park:wisa:2026,
author = {Geonwoo Park and Junhak Lee and Sang Kil Cha},
title = {LLM-Assisted Command Syntax Extraction for Flight Software Fuzzing},
booktitle = {Proceedings of the World Conference on Information Security Applications},
year = 2026
}