1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//! A coverage-guided fuzzing framework for Internet Computer canisters.
//!
//! This framework is built on `libafl` and `pocket-ic` to find bugs in IC canisters
//! by automatically generating and executing a vast number of inputs.
//! It supports both Rust and Motoko canisters.
//!
//! ## Getting Started
//!
//! To create a fuzzer, implement the [`orchestrator::FuzzerOrchestrator`] trait.
//! This trait defines the setup and execution logic for your
//! fuzzing campaign.
//!
//! ```no_run
//! use canfuzz::fuzzer::{CanisterInfo, CanisterType, FuzzerState, WasmPath};
//! use canfuzz::orchestrator::{FuzzerOrchestrator, FuzzerStateProvider};
//! use canfuzz::libafl::executors::ExitKind;
//! use canfuzz::libafl::inputs::BytesInput;
//! use std::path::PathBuf;
//!
//! // 1. Define a struct for your fuzzer.
//! struct MyFuzzer(FuzzerState);
//!
//! // 2. Provide access to the fuzzer state.
//! impl FuzzerStateProvider for MyFuzzer {
//! fn get_fuzzer_state(&self) -> &FuzzerState { &self.0 }
//! }
//!
//! // 3. Implement the fuzzing logic.
//! impl FuzzerOrchestrator for MyFuzzer {
//! fn init(&mut self) {
//! // Setup PocketIc and install canisters.
//! println!("Canisters installed");
//! }
//!
//! fn corpus_dir(&self) -> PathBuf {
//! PathBuf::from("./corpus")
//! }
//!
//! fn execute(&self, input: BytesInput) -> ExitKind {
//! let payload: Vec<u8> = input.into();
//! println!("Executing input: {:?}", payload);
//! // Execute a canister call with the input.
//! ExitKind::Ok
//! }
//! }
//!
//! // 4. Set up and run the fuzzer.
//! fn main() {
//! let mut fuzzer = MyFuzzer(FuzzerState::new(
//! "my_fuzzer",
//! vec![
//! CanisterInfo {
//! id: None,
//! name: "my_target_canister".to_string(),
//! wasm_path: WasmPath::Path("./my_canister.wasm".into()),
//! ty: CanisterType::Coverage,
//! },
//! ],
//! ));
//!
//! fuzzer.run();
//! }
//! ```
//!
//! For a complete example, see the `examples/` directory in the project repository.
// re-export libAFL and libAFL_bolts
pub use libafl;
pub use libafl_bolts;