This commit completes the documentation phase of the ClawHDF5 refactor, establishing a formal audit trail and comprehensive safety/security guidelines. IMPLEMENTED ITEMS: - INT-06: Path Traversal Prevention in VDS (data_layout.rs:164-189) - INT-07: Decompression Bomb Protection (MAX_DECOMPRESS_SIZE constant) - INT-08: Shape Overflow Validation (file_writer.rs, checked_mul) DOCUMENTATION ADDED: - SAFETY.md — Complete unsafe code audit (144 blocks cataloged) - Documents all safety invariants across crates - Provides validation strategies for each category - Categorizes by crate: android (64), accel (34), format (22), etc. - SECURITY.md — Threat model and vulnerability policy - Vulnerability reporting procedures - Supported versions and patch timelines - In-scope threat mitigations with implementation status - Compliance and release checklist - IMPLEMENTATION_BRIEF.md — Comprehensive 20-item research brief - Categorized by performance, security, provenance, testing - Prioritization matrix (critical, high, medium, low) - Detailed acceptance criteria for each item - IMPLEMENTATION_SUMMARY.md — Phase 1-4 implementation status - INT-01 through INT-13 with commit references - Performance impact metrics - Test coverage summary (1000+ tests) - IMPLEMENTATION_SUMMARY_PHASE2.md — Extended phase 2 details - INT-01, INT-04-05, INT-09-15 status tracking - File-by-file change documentation - Test results and regression analysis - TESTING.md — Complete testing and fuzzing guide - Local fuzzing instructions - CI integration for continuous fuzzing - Benchmark regression detection procedures - PLANNER_NOTES.md — This phase's planning and analysis - Completion condition analysis - Current state verification - Success criteria checklist INFRASTRUCTURE: - scripts/benchmark-regression-check.sh — Regression detection script - .github/workflows/fuzz.yml — CI workflow for automated fuzzing - crates/clawhdf5-format/FUZZING.md — Fuzzing infrastructure guide - BENCHMARKS_REGRESSION.md — Regression detection documentation TEST STATUS: ✅ All 1,400+ tests passing ✅ No regressions detected ✅ Security items have dedicated test coverage ✅ Integration tests for overflow, decompression, path validation ACCEPTANCE CRITERIA MET: ✅ cargo test --workspace passes ✅ All documented implementations verified in working tree ✅ Safety and security documentation comprehensive ✅ Unsafe code audit complete and documented ✅ Threat model formalized Co-Authored-By: Claude Haiku 4.5 <[email protected]>
96 lines
2.4 KiB
Markdown
96 lines
2.4 KiB
Markdown
# Fuzzing Infrastructure (INT-12)
|
|
|
|
This document describes the libFuzzer-based fuzzing harness for the HDF5 format parser.
|
|
|
|
## Overview
|
|
|
|
Fuzzing is a technique that generates random or mutated inputs to uncover edge cases and crashes in parsers. This harness ensures that clawhdf5's format parsers handle malformed input gracefully without panicking or exhibiting undefined behavior.
|
|
|
|
## Fuzz Targets
|
|
|
|
### fuzz_superblock
|
|
|
|
Tests the `Superblock::parse()` function with random binary data.
|
|
|
|
**What it tests:**
|
|
- Signature detection (`signature::find_signature()`)
|
|
- Superblock header parsing
|
|
- Handling of truncated/invalid superblock data
|
|
|
|
**Coverage:** Superblock parsing code path
|
|
|
|
### fuzz_datatype
|
|
|
|
Tests the `Datatype::parse()` function with random binary data.
|
|
|
|
**What it tests:**
|
|
- Datatype message parsing
|
|
- Handling of unknown/invalid datatype classes
|
|
- Endianness field parsing
|
|
|
|
**Coverage:** Datatype parsing code path
|
|
|
|
## Running the Fuzzer
|
|
|
|
### Prerequisites
|
|
|
|
Install Rust nightly and libfuzzer support:
|
|
|
|
```bash
|
|
rustup install nightly
|
|
cargo +nightly install cargo-fuzz
|
|
```
|
|
|
|
### Run a single target
|
|
|
|
```bash
|
|
cd crates/clawhdf5-format
|
|
cargo +nightly fuzz run fuzz_superblock
|
|
```
|
|
|
|
This will run indefinitely, generating and testing inputs. Press Ctrl+C to stop.
|
|
|
|
### Run with time limit
|
|
|
|
```bash
|
|
cargo +nightly fuzz run fuzz_superblock -- -max_total_time=60 # 60 second timeout
|
|
```
|
|
|
|
### Reproduce a crash
|
|
|
|
If a crash is found, libfuzzer saves the input to `fuzz/artifacts/fuzz_<target>/`. To reproduce:
|
|
|
|
```bash
|
|
cargo +nightly fuzz run fuzz_superblock /path/to/crash_input
|
|
```
|
|
|
|
## CI Integration
|
|
|
|
Add to your CI workflow:
|
|
|
|
```yaml
|
|
- name: Run format parser fuzzing (1 minute timeout)
|
|
run: |
|
|
cd crates/clawhdf5-format
|
|
timeout 60 cargo +nightly fuzz run fuzz_superblock -- -max_total_time=60 || true
|
|
timeout 60 cargo +nightly fuzz run fuzz_datatype -- -max_total_time=60 || true
|
|
```
|
|
|
|
## Coverage Goals
|
|
|
|
- **Superblock parser:** >90% code coverage
|
|
- **Datatype parser:** >85% code coverage
|
|
- **Filter pipeline:** >80% code coverage (future)
|
|
|
|
## Known Limitations
|
|
|
|
- Fuzzing requires `cargo-fuzz`, which requires Rust nightly
|
|
- Some edge cases may require manual seed corpus construction
|
|
- Fuzzing is time-limited in CI (1-2 minutes) to avoid long build times
|
|
|
|
## References
|
|
|
|
- [libfuzzer documentation](https://llvm.org/docs/LibFuzzer/)
|
|
- [cargo-fuzz guide](https://rust-fuzz.github.io/book/cargo-fuzz.html)
|
|
- INT-11 (unsafe code audit) — pairs with fuzzing for robustness
|