This directory contains fuzzing infrastructure using cargo-fuzz and ClusterFuzzLite.
Continuous fuzzing helps discover:
- Panics and crashes
- Logic bugs in parsers and validators
- Performance issues (algorithmic complexity attacks)
# Install cargo-fuzz (requires nightly)
cargo install cargo-fuzz# Build all fuzz targets
make fuzz-build
# Run all targets (smoke test - 30s each)
make fuzz
# Run specific target for longer
make fuzz-run FUZZ_TARGET=fuzz_odata_filter FUZZ_SECONDS=300
# List all available targets
make fuzz-list# Build fuzz targets
python scripts/ci.py fuzz-build
# Run smoke tests
python scripts/ci.py fuzz --seconds 60
# Run specific target
python scripts/ci.py fuzz-run fuzz_odata_filter --seconds 300| Target | Priority | Component | Description |
|---|---|---|---|
fuzz_odata_filter |
HIGH | OData parsing | Fuzzes $filter query string parser |
fuzz_odata_cursor |
HIGH | Pagination | Fuzzes cursor decoder (base64+JSON) |
fuzz_yaml_config |
HIGH | Configuration | Fuzzes YAML config parser |
fuzz_html_parser |
MEDIUM | file_parser | Fuzzes HTML document parser |
fuzz_pdf_parser |
MEDIUM | file_parser | Fuzzes PDF document parser |
fuzz_json_config |
MEDIUM | Configuration | Fuzzes JSON parser |
fuzz_odata_orderby |
MEDIUM | OData parsing | Fuzzes $orderby token parser |
fuzz_markdown_parser |
LOW | file_parser | Fuzzes Markdown parser |
ClusterFuzzLite runs automatically:
- On Pull Requests: 10 minutes per target
- On main branch: 1 hour per target
- Scheduled (nightly): 1 hour per target
Results are uploaded as artifacts and issues are created automatically.
If a crash is found:
# Crashes are saved in artifacts/
cd fuzz
cargo fuzz run fuzz_odata_filter artifacts/fuzz_odata_filter/crash-*# Minimize corpus (remove redundant inputs)
make fuzz-corpus FUZZ_TARGET=fuzz_odata_filter
# Add seed inputs
echo 'name eq "test"' > corpus/fuzz_odata_filter/my_seed.txt- Don't panic on invalid input - use
Resulttypes - Limit resource usage - add timeouts and size limits
- Add seed corpus - good inputs speed up fuzzing
- Run locally before PR - catch issues early
# Remove all fuzzing artifacts
make fuzz-clean
# Or using CI script
python scripts/ci.py fuzz-cleancargo install cargo-fuzzrustup install nightly
# Use +nightly flag with cargo-fuzz commands:
cargo +nightly fuzz run fuzz_odata_filterMake sure all dependencies are available:
cd fuzz
cargo check --all