mirror of
https://github.com/outbackdingo/optimclaw.git
synced 2026-09-03 01:59:23 +00:00
* refactor: extract safety module into ironclaw_safety crate Move prompt injection defense, input validation, secret leak detection, and safety policy enforcement into a standalone crate under crates/. The safety module was a leaf dependency with no async, no database, and no other ironclaw traits — only pure computation with pattern matching. SafetyConfig (2 fields) moves into the crate; env-var resolution stays in ironclaw's config module as a free function. src/safety/mod.rs becomes a thin re-export so all existing `crate::safety::*` imports keep working. Co-Authored-By: Claude Opus 4.6 <[email protected]> * docs: update CLAUDE.md for ironclaw_safety crate extraction Add guidance to migrate imports from crate::safety to ironclaw_safety when touching files. Update project structure to reflect crates/ dir. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: move safety fuzz targets into ironclaw_safety crate Split fuzz infrastructure: - crates/ironclaw_safety/fuzz/ — 5 safety-only targets (sanitizer, validator, leak_detector, credential_detect, config_env) depending only on ironclaw_safety for faster builds - fuzz/ — keeps fuzz_tool_params which needs ironclaw::tools Add seed corpus files (51 total) covering each pattern family: sanitizer injection patterns, validator edge cases, leak detector secret formats, credential detect HTTP param shapes. Add new fuzz_credential_detect target exercising params_contain_manual_credentials with arbitrary JSON. Co-Authored-By: Claude Opus 4.6 <[email protected]> * fix: address PR review — single-pass XML escaping and versioned path dep Rewrite escape_xml_attr from chained .replace() to single-pass char iteration (O(n) instead of O(4n) with intermediate allocations). Add version = "0.1.0" to ironclaw_safety path dep to satisfy cargo-deny wildcards = "deny". Co-Authored-By: Claude Opus 4.6 <[email protected]> --------- Co-authored-by: Claude Opus 4.6 <[email protected]>
43 lines
1.4 KiB
Markdown
43 lines
1.4 KiB
Markdown
# ironclaw_safety Fuzz Targets
|
|
|
|
Fuzz testing for the `ironclaw_safety` crate using [cargo-fuzz](https://github.com/rust-fuzz/cargo-fuzz) (libFuzzer).
|
|
|
|
## Targets
|
|
|
|
| Target | What it exercises |
|
|
|--------|-------------------|
|
|
| `fuzz_safety_sanitizer` | Prompt injection pattern detection (Aho-Corasick + regex) |
|
|
| `fuzz_safety_validator` | Input validation (length, encoding, forbidden patterns) |
|
|
| `fuzz_leak_detector` | Secret leak detection (API keys, tokens, credentials) |
|
|
| `fuzz_credential_detect` | HTTP request credential detection |
|
|
| `fuzz_config_env` | SafetyLayer end-to-end (sanitize, validate, policy check) |
|
|
|
|
## Setup
|
|
|
|
```bash
|
|
cargo install cargo-fuzz
|
|
rustup install nightly
|
|
```
|
|
|
|
## Running
|
|
|
|
```bash
|
|
cd crates/ironclaw_safety
|
|
|
|
# Run a specific target (runs until stopped or crash found)
|
|
cargo +nightly fuzz run fuzz_safety_sanitizer
|
|
|
|
# Run with a time limit (5 minutes)
|
|
cargo +nightly fuzz run fuzz_leak_detector -- -max_total_time=300
|
|
|
|
# Run all targets for 60 seconds each
|
|
for target in fuzz_safety_sanitizer fuzz_safety_validator fuzz_leak_detector fuzz_credential_detect fuzz_config_env; do
|
|
echo "==> $target"
|
|
cargo +nightly fuzz run "$target" -- -max_total_time=60
|
|
done
|
|
```
|
|
|
|
## Seed Corpus
|
|
|
|
Each target has a seed corpus in `corpus/<target>/` with representative inputs covering the major pattern families. The fuzzer uses these as starting points for mutation.
|