diff --git a/build.rs b/build.rs index 7f99041..bee1c6d 100644 --- a/build.rs +++ b/build.rs @@ -1,10 +1,7 @@ //! Creates a Software Bill of Materials to be include in every build. use cargo_license::{get_dependencies_from_cargo_lock, GetDependenciesOpt}; -use std::env; -use std::fs::File; -use std::io::Write; -use std::path::Path; +use std::{env, fs::File, io::Write, path::Path}; fn main() { let dependencies = get_dependencies_from_cargo_lock( diff --git a/src/configuration.rs b/src/configuration.rs index 8d64220..8e89eef 100644 --- a/src/configuration.rs +++ b/src/configuration.rs @@ -1,9 +1,12 @@ use clap::{value_parser, Parser, Subcommand, ValueEnum}; use serde::Deserialize; -use std::convert::TryFrom; -use std::io::ErrorKind; -use std::net::ToSocketAddrs; -use std::{io, net::SocketAddr, path::Path, path::PathBuf}; +use std::{ + convert::TryFrom, + io, + io::ErrorKind, + net::{SocketAddr, ToSocketAddrs}, + path::{Path, PathBuf}, +}; const DEFAULT_REQUEST_TIMEOUT: u64 = 30000; const DEFAULT_METHOD_MUTATION_STRATEGY: MethodMutationStrategy = MethodMutationStrategy::FollowSpec; diff --git a/src/coverage_clients/coverband.rs b/src/coverage_clients/coverband.rs index 59fe50d..bf1074a 100644 --- a/src/coverage_clients/coverband.rs +++ b/src/coverage_clients/coverband.rs @@ -3,12 +3,14 @@ use super::CoverageClient; use crate::coverage_clients::MAP_SIZE; -use reqwest::blocking::{Client, Response}; -use reqwest::Url; -use std::path::Path; +use reqwest::{ + blocking::{Client, Response}, + Url, +}; use std::{ collections::{hash_map::Entry, HashMap}, fmt::Debug, + path::Path, }; #[derive(Debug, serde::Deserialize)] diff --git a/src/coverage_clients/jacoco.rs b/src/coverage_clients/jacoco.rs index b50e8e5..aa104d4 100644 --- a/src/coverage_clients/jacoco.rs +++ b/src/coverage_clients/jacoco.rs @@ -1,18 +1,24 @@ //! Coverage client for agents that communicate using Jacoco. Jacoco is the supported way //! to collect coverage from Java targets. -use std::collections::{hash_map::Entry, HashMap}; -use std::fs::{create_dir_all, read_dir, remove_file, DirBuilder, OpenOptions}; -use std::io::prelude::*; -use std::net::{SocketAddr, TcpStream}; -use std::path::{Path, PathBuf}; -use std::slice; +use std::{ + collections::{hash_map::Entry, HashMap}, + fs::{create_dir_all, read_dir, remove_file, DirBuilder, OpenOptions}, + io::prelude::*, + net::{SocketAddr, TcpStream}, + path::{Path, PathBuf}, + slice, +}; extern crate num; -use crate::configuration::{Configuration, CoverageConfiguration}; -use crate::coverage_clients::read_utilities::{read_bool_array, read_cesu8, read_char, read_u64be}; -use crate::coverage_clients::{CoverageClient, MAP_SIZE}; +use crate::{ + configuration::{Configuration, CoverageConfiguration}, + coverage_clients::{ + read_utilities::{read_bool_array, read_cesu8, read_char, read_u64be}, + CoverageClient, MAP_SIZE, + }, +}; use libafl::Error; use log::trace; diff --git a/src/coverage_clients/lcov_client.rs b/src/coverage_clients/lcov_client.rs index 5658728..d3c9002 100644 --- a/src/coverage_clients/lcov_client.rs +++ b/src/coverage_clients/lcov_client.rs @@ -3,19 +3,22 @@ use lcov::{Reader, Record}; use libafl::Error; -use std::fs::{create_dir_all, read_dir, File}; -use std::io::prelude::*; -use std::net::{SocketAddr, TcpStream}; -use std::{cmp, slice}; use std::{ + cmp, collections::HashMap, + fs::{create_dir_all, read_dir, File}, + io::prelude::*, + net::{SocketAddr, TcpStream}, path::{Path, PathBuf}, + slice, }; -use crate::configuration::{Configuration, CoverageConfiguration}; -use crate::coverage_clients::{ - read_utilities::{read_byte_vec, read_char}, - CoverageClient, MAP_SIZE, +use crate::{ + configuration::{Configuration, CoverageConfiguration}, + coverage_clients::{ + read_utilities::{read_byte_vec, read_char}, + CoverageClient, MAP_SIZE, + }, }; extern crate num; diff --git a/src/coverage_clients/read_utilities.rs b/src/coverage_clients/read_utilities.rs index 836e53e..8817f23 100644 --- a/src/coverage_clients/read_utilities.rs +++ b/src/coverage_clients/read_utilities.rs @@ -1,8 +1,9 @@ //! Collection of utility functions to read data from a stream. -use std::convert::{TryFrom, TryInto}; -use std::io::ErrorKind; -use std::io::{prelude::*, Error, Result}; +use std::{ + convert::{TryFrom, TryInto}, + io::{prelude::*, Error, ErrorKind, Result}, +}; use byteorder::{BigEndian, ByteOrder, LittleEndian}; use cesu8::{from_java_cesu8, to_java_cesu8}; diff --git a/src/fuzzer.rs b/src/fuzzer.rs index 01df9cc..cd5fc5b 100644 --- a/src/fuzzer.rs +++ b/src/fuzzer.rs @@ -1,25 +1,24 @@ use anyhow::{Context, Result}; -use libafl::corpus::Corpus; -use libafl::events::EventFirer; -use libafl::executors::hooks::inprocess::inprocess_get_event_manager; -use libafl::executors::{Executor, HasObservers}; -use libafl::feedbacks::{DifferentIsNovel, Feedback, MapFeedback, MaxReducer, TimeFeedback}; -use libafl::inputs::{BytesInput, UsesInput}; -use libafl::monitors::{AggregatorOps, UserStatsValue}; -use libafl::mutators::StdScheduledMutator; -use libafl::observers::{CanTrack, ExplicitTracking, MultiMapObserver, TimeObserver}; -use libafl::schedulers::{ - powersched::PowerSchedule, IndexesLenTimeMinimizerScheduler, PowerQueueScheduler, +use libafl::{ + corpus::Corpus, + events::EventFirer, + executors::{hooks::inprocess::inprocess_get_event_manager, Executor, HasObservers}, + feedback_or, + feedbacks::{DifferentIsNovel, Feedback, MapFeedback, MaxReducer, TimeFeedback}, + inputs::{BytesInput, UsesInput}, + monitors::{AggregatorOps, UserStatsValue}, + mutators::StdScheduledMutator, + observers::{CanTrack, ExplicitTracking, MultiMapObserver, TimeObserver}, + schedulers::{ + powersched::PowerSchedule, IndexesLenTimeMinimizerScheduler, PowerQueueScheduler, + }, + stages::{CalibrationStage, StdPowerMutationalStage}, + state::{HasCorpus, HasExecutions, NopState, UsesState}, + ExecuteInputResult, ExecutionProcessor, HasNamedMetadata, }; -use libafl::stages::{CalibrationStage, StdPowerMutationalStage}; -use libafl::state::{HasCorpus, HasExecutions, NopState, State, UsesState}; -use libafl::{feedback_or, ExecutionProcessor}; -use libafl::{ExecuteInputResult, HasNamedMetadata}; - -use libafl_bolts::current_time; -use libafl_bolts::prelude::OwnedMutSlice; -use libafl_bolts::tuples::MatchName; + +use libafl_bolts::{current_time, prelude::OwnedMutSlice, tuples::MatchName}; use openapiv3::OpenAPI; use core::marker::PhantomData; @@ -35,23 +34,25 @@ use libafl::{ observers::StdMapObserver, }; use libafl_bolts::{current_nanos, rands::StdRand, tuples::tuple_list}; -use std::borrow::Cow; -use std::ops::DerefMut; +use std::{borrow::Cow, ops::DerefMut}; -use std::fs::create_dir_all; -use std::path::PathBuf; #[cfg(windows)] use std::ptr::write_volatile; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; -use std::time::{Duration, Instant}; +use std::{ + fs::create_dir_all, + path::PathBuf, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, Mutex, + }, + time::{Duration, Instant}, +}; use log::{debug, error, info}; -use crate::coverage_clients::endpoint::EndpointCoverageClient; use crate::{ configuration::{Configuration, CrashCriterion}, - coverage_clients::CoverageClient, + coverage_clients::{endpoint::EndpointCoverageClient, CoverageClient}, input::OpenApiInput, monitors::CoverageMonitor, openapi::{ diff --git a/src/header.rs b/src/header.rs index 8082bd1..b1e99ac 100644 --- a/src/header.rs +++ b/src/header.rs @@ -5,9 +5,7 @@ use crate::configuration::Configuration; use anyhow::{Context, Result}; use reqwest::header::{HeaderMap, HeaderName, HeaderValue}; -use std::collections::HashMap; -use std::fs::File; -use std::str::FromStr; +use std::{collections::HashMap, fs::File, str::FromStr}; /// Load default headers from a file specified in configuration and apply /// them to the given ClientBuilder diff --git a/src/input/mod.rs b/src/input/mod.rs index 7fd1f0e..b2cf56d 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -52,19 +52,26 @@ use self::parameter::ParameterKind; pub use self::{method::Method, parameter::ParameterContents}; -use crate::openapi::{JsonContent, TextPlain, WwwForm}; use crate::{ - openapi::find_operation, parameter_feedback::ParameterFeedback, state::HasRandAndOpenAPI, + openapi::{find_operation, JsonContent, TextPlain, WwwForm}, + parameter_feedback::ParameterFeedback, + state::HasRandAndOpenAPI, }; use ahash::RandomState; -use indexmap::map::ValuesMut; -use indexmap::{map::Iter, IndexMap}; -use libafl::corpus::CorpusId; -use libafl::{inputs::Input, Error}; +use indexmap::{ + map::{Iter, ValuesMut}, + IndexMap, +}; +use libafl::{corpus::CorpusId, inputs::Input, Error}; use libafl_bolts::{fs::write_file_atomic, rands::Rand, HasLen}; use openapiv3::{OpenAPI, Operation, SchemaKind, Type}; -use std::{borrow::Cow, hash::BuildHasher, hash::Hasher}; -use std::{fs::File, io::Read, path::Path}; +use std::{ + borrow::Cow, + fs::File, + hash::{BuildHasher, Hasher}, + io::Read, + path::Path, +}; pub mod method; pub mod parameter; diff --git a/src/openapi/examples.rs b/src/openapi/examples.rs index c62b98c..3415f60 100644 --- a/src/openapi/examples.rs +++ b/src/openapi/examples.rs @@ -2,17 +2,14 @@ //! fuzzing target during normal fuzzing operation. These functions need an OpenAPI struct //! to generate realistic requests for the given target. -use std::borrow::Cow; -use std::{collections::VecDeque, f64::consts::PI}; +use std::{borrow::Cow, collections::VecDeque, f64::consts::PI}; use indexmap::IndexMap; use openapiv3::{ OpenAPI, Operation, Parameter, ParameterData, RefOr, Schema, SchemaKind, StringFormat, Type, }; -use petgraph::prelude::NodeIndex; -use petgraph::{csr::DefaultIx, graph::DiGraph, visit::EdgeRef}; -use rand::prelude::Distribution; -use rand::Rng; +use petgraph::{csr::DefaultIx, graph::DiGraph, prelude::NodeIndex, visit::EdgeRef}; +use rand::{prelude::Distribution, Rng}; use regex::Regex; use serde_json::Value; use unicode_truncate::UnicodeTruncateStr; diff --git a/src/openapi/mod.rs b/src/openapi/mod.rs index ba12861..80fbc17 100644 --- a/src/openapi/mod.rs +++ b/src/openapi/mod.rs @@ -1,8 +1,7 @@ use anyhow::{Context, Result}; use indexmap::IndexMap; use openapiv3::{MediaType, OpenAPI, Operation, PathItem, VersionedOpenAPI}; -use std::fmt::Debug; -use std::{convert::TryFrom, path::Path}; +use std::{convert::TryFrom, fmt::Debug, path::Path}; use crate::input::{method::InvalidMethodError, Method}; diff --git a/src/openapi_mutator/add_request.rs b/src/openapi_mutator/add_request.rs index d843b08..5bea393 100644 --- a/src/openapi_mutator/add_request.rs +++ b/src/openapi_mutator/add_request.rs @@ -1,12 +1,12 @@ //! Mutates a request series by adding a new request to it. The new request is taken //! at random from the API specification. -use crate::openapi::JsonContent; use crate::{ input::{ new_rand_input, parameter::ParameterKind, Body, OpenApiInput, OpenApiRequest, ParameterContents, }, + openapi::JsonContent, state::HasRandAndOpenAPI, }; use indexmap::IndexMap; @@ -15,11 +15,9 @@ use libafl::{ mutators::{MutationResult, Mutator}, Error, }; -use libafl_bolts::rands::Rand; -use libafl_bolts::Named; +use libafl_bolts::{rands::Rand, Named}; use openapiv3::{OpenAPI, RequestBody}; -use std::borrow::Cow; -use std::convert::TryInto; +use std::{borrow::Cow, convert::TryInto}; /// The `AddRequestMutator` adds a request to a random path from the specification /// to the series of requests. The request is added at the end of the series, and diff --git a/src/openapi_mutator/different_method.rs b/src/openapi_mutator/different_method.rs index a51d576..7f362fb 100644 --- a/src/openapi_mutator/different_method.rs +++ b/src/openapi_mutator/different_method.rs @@ -13,10 +13,8 @@ use libafl::{ mutators::{MutationResult, Mutator}, Error, }; -use libafl_bolts::rands::Rand; -use libafl_bolts::Named; -use std::borrow::Cow; -use std::convert::TryInto; +use libafl_bolts::{rands::Rand, Named}; +use std::{borrow::Cow, convert::TryInto}; /// The `DifferentMethodMutator` changes an existing request from the series /// to use a different method. Only methods available for the current path diff --git a/src/openapi_mutator/different_path.rs b/src/openapi_mutator/different_path.rs index 9fc18e5..797c562 100644 --- a/src/openapi_mutator/different_path.rs +++ b/src/openapi_mutator/different_path.rs @@ -1,14 +1,16 @@ //! Mutates a request series by changing the path and method on one of the HTTP requests. //! The new path and method are taken from the API specification. -use crate::{input::fix_input_parameters, input::OpenApiInput, state::HasRandAndOpenAPI}; +use crate::{ + input::{fix_input_parameters, OpenApiInput}, + state::HasRandAndOpenAPI, +}; pub use libafl::mutators::mutations::*; use libafl::{ mutators::{MutationResult, Mutator}, Error, }; -use libafl_bolts::rands::Rand; -use libafl_bolts::Named; +use libafl_bolts::{rands::Rand, Named}; use std::{borrow::Cow, convert::TryInto}; /// The `DifferentPathMutator` changes an existing request from the series diff --git a/src/openapi_mutator/duplicate_request.rs b/src/openapi_mutator/duplicate_request.rs index 542ff5b..27d5a2b 100644 --- a/src/openapi_mutator/duplicate_request.rs +++ b/src/openapi_mutator/duplicate_request.rs @@ -9,8 +9,7 @@ use libafl::{ state::HasRand, Error, }; -use libafl_bolts::rands::Rand; -use libafl_bolts::Named; +use libafl_bolts::{rands::Rand, Named}; /// The `DuplicateRequestMutator` duplicates an existing request in the series. pub struct DuplicateRequestMutator; diff --git a/src/openapi_mutator/establish_link.rs b/src/openapi_mutator/establish_link.rs index 19a42d9..c30790c 100644 --- a/src/openapi_mutator/establish_link.rs +++ b/src/openapi_mutator/establish_link.rs @@ -3,7 +3,10 @@ use std::borrow::Cow; -use crate::{input::OpenApiInput, input::ParameterContents, state::HasRandAndOpenAPI}; +use crate::{ + input::{OpenApiInput, ParameterContents}, + state::HasRandAndOpenAPI, +}; pub use libafl::mutators::mutations::*; use libafl::{ mutators::{MutationResult, Mutator}, diff --git a/src/openapi_mutator/mod.rs b/src/openapi_mutator/mod.rs index bf67881..5b52584 100644 --- a/src/openapi_mutator/mod.rs +++ b/src/openapi_mutator/mod.rs @@ -8,21 +8,23 @@ use core::num::NonZero; use std::borrow::Cow; -use crate::input::parameter::SimpleValue; -use crate::input::{new_rand_input, OpenApiInput, ParameterContents}; -use crate::state::OpenApiFuzzerState; -use libafl::corpus::Corpus; -use libafl::inputs::Input; +use crate::{ + input::{new_rand_input, parameter::SimpleValue, OpenApiInput, ParameterContents}, + state::OpenApiFuzzerState, +}; pub use libafl::mutators::mutations::*; use libafl::{ - inputs::{BytesInput, HasMutatorBytes}, + corpus::Corpus, + inputs::{BytesInput, HasMutatorBytes, Input}, mutators::{MutationResult, Mutator}, state::HasRand, Error, }; -use libafl_bolts::rands::Rand; -use libafl_bolts::tuples::{tuple_list, tuple_list_type}; -use libafl_bolts::Named; +use libafl_bolts::{ + rands::Rand, + tuples::{tuple_list, tuple_list_type}, + Named, +}; pub mod add_request; use add_request::AddRequestMutator; diff --git a/src/openapi_mutator/remove_request.rs b/src/openapi_mutator/remove_request.rs index e2b8a2b..c803f84 100644 --- a/src/openapi_mutator/remove_request.rs +++ b/src/openapi_mutator/remove_request.rs @@ -10,8 +10,7 @@ use libafl::{ state::HasRand, Error, }; -use libafl_bolts::rands::Rand; -use libafl_bolts::Named; +use libafl_bolts::{rands::Rand, Named}; /// The `RemoveRequestMutator` removes an existing request in the series, /// but it will never leave a series empty. diff --git a/src/openapi_mutator/swap_requests.rs b/src/openapi_mutator/swap_requests.rs index f403087..8643b02 100644 --- a/src/openapi_mutator/swap_requests.rs +++ b/src/openapi_mutator/swap_requests.rs @@ -9,8 +9,7 @@ use libafl::{ state::HasRand, Error, }; -use libafl_bolts::rands::Rand; -use libafl_bolts::Named; +use libafl_bolts::{rands::Rand, Named}; /// The `SwapRequestsMutator` swaps two requests in the series. pub struct SwapRequestsMutator; diff --git a/src/reporting/mod.rs b/src/reporting/mod.rs index 68a4268..4a0417c 100644 --- a/src/reporting/mod.rs +++ b/src/reporting/mod.rs @@ -1,11 +1,14 @@ -use libafl::corpus::{Corpus, InMemoryOnDiskCorpus, OnDiskCorpus}; -use libafl::executors::hooks::inprocess::inprocess_get_state; -use libafl::state::HasCorpus; +use libafl::{ + corpus::{Corpus, InMemoryOnDiskCorpus, OnDiskCorpus}, + executors::hooks::inprocess::inprocess_get_state, + state::HasCorpus, +}; -use crate::input::{OpenApiInput, OpenApiRequest}; -use crate::openapi::curl_request::CurlRequest; -use crate::openapi::validate_response::Response; -use crate::state::OpenApiFuzzerState; +use crate::{ + input::{OpenApiInput, OpenApiRequest}, + openapi::{curl_request::CurlRequest, validate_response::Response}, + state::OpenApiFuzzerState, +}; pub mod sqlite; diff --git a/src/reporting/sqlite.rs b/src/reporting/sqlite.rs index 4c5fca1..32fd6b1 100644 --- a/src/reporting/sqlite.rs +++ b/src/reporting/sqlite.rs @@ -1,13 +1,14 @@ -use crate::configuration::Configuration; -use crate::openapi::validate_response::Response; -use crate::reporting::Reporting; -use crate::{input::OpenApiRequest, openapi::curl_request::CurlRequest}; +use crate::{ + configuration::Configuration, + input::OpenApiRequest, + openapi::{curl_request::CurlRequest, validate_response::Response}, + reporting::Reporting, +}; use anyhow::Context; use chrono::SecondsFormat; use log::info; use rusqlite::{named_params, Connection}; -use std::fs::create_dir_all; -use std::path::Path; +use std::{fs::create_dir_all, path::Path}; /// Instantiates a MySqLite reporter if desired by the configuration pub fn get_reporter(config: &Configuration) -> Result, anyhow::Error> { diff --git a/src/wuppie_version.rs b/src/wuppie_version.rs index 5c709ad..4710a53 100644 --- a/src/wuppie_version.rs +++ b/src/wuppie_version.rs @@ -1,5 +1,4 @@ -use std::env; -use std::process::Command; +use std::{env, process::Command}; pub fn get_wuppie_version() -> String { let git_output = Command::new("git").arg("rev-parse").arg("HEAD").output();