Decouple address_filters() from EmulatorModuleTuple into HasAddressFilters (#2869)

* 1

* fixe
This commit is contained in:
Dongjia "toka" Zhang 2025-01-20 17:44:44 +01:00 committed by GitHub
parent 8089b18d34
commit 6ee26a8afa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 165 additions and 113 deletions

View File

@ -27,7 +27,7 @@ use libafl::{
ShadowTracingStage, StagesTuple, StdMutationalStage, ShadowTracingStage, StagesTuple, StdMutationalStage,
}, },
state::{HasCorpus, StdState}, state::{HasCorpus, StdState},
Error, HasMetadata, NopFuzzer, Error, HasMetadata,
}; };
#[cfg(not(feature = "simplemgr"))] #[cfg(not(feature = "simplemgr"))]
use libafl_bolts::shmem::{StdShMem, StdShMemProvider}; use libafl_bolts::shmem::{StdShMem, StdShMemProvider};
@ -41,8 +41,8 @@ use libafl_qemu::{
modules::{ modules::{
cmplog::CmpLogObserver, cmplog::CmpLogObserver,
edges::EdgeCoverageFullVariant, edges::EdgeCoverageFullVariant,
utils::filters::{NopPageFilter, StdAddressFilter}, utils::filters::{HasAddressFilter, NopPageFilter, StdAddressFilter},
EdgeCoverageModule, EmulatorModule, EmulatorModuleTuple, StdEdgeCoverageModule, EdgeCoverageModule, EmulatorModuleTuple, StdEdgeCoverageModule,
}, },
Emulator, GuestAddr, Qemu, QemuExecutor, Emulator, GuestAddr, Qemu, QemuExecutor,
}; };
@ -140,10 +140,10 @@ impl<M: Monitor> Instance<'_, M> {
let qemu = emulator.qemu(); let qemu = emulator.qemu();
// update address filter after qemu has been initialized // update address filter after qemu has been initialized
<EdgeCoverageModule<StdAddressFilter, NopPageFilter, EdgeCoverageFullVariant, false, 0> as EmulatorModule<BytesInput, ClientState>>::update_address_filter(emulator.modules_mut() emulator.modules_mut()
.modules_mut() .modules_mut()
.match_first_type_mut::<EdgeCoverageModule<StdAddressFilter, NopPageFilter, EdgeCoverageFullVariant, false, 0>>() .match_first_type_mut::<EdgeCoverageModule<StdAddressFilter, NopPageFilter, EdgeCoverageFullVariant, false, 0>>()
.expect("Could not find back the edge module"), qemu, self.coverage_filter(qemu)?); .expect("Could not find back the edge module").update_address_filter(qemu, self.coverage_filter(qemu)?);
// Create an observation channel to keep track of the execution time // Create an observation channel to keep track of the execution time
let time_observer = TimeObserver::new("time"); let time_observer = TimeObserver::new("time");

View File

@ -40,8 +40,8 @@ use libafl_qemu::{
emu::Emulator, emu::Emulator,
executor::QemuExecutor, executor::QemuExecutor,
modules::{ modules::{
cmplog::CmpLogObserver, edges::StdEdgeCoverageClassicModule, CmpLogModule, cmplog::CmpLogObserver, edges::StdEdgeCoverageClassicModule,
EmulatorModuleTuple, utils::filters::HasAddressFilterTuples, CmpLogModule, EmulatorModuleTuple,
}, },
FastSnapshotManager, NopSnapshotManager, QemuInitError, FastSnapshotManager, NopSnapshotManager, QemuInitError,
}; };
@ -78,7 +78,7 @@ fn get_emulator<C, ET, I, S>(
QemuInitError, QemuInitError,
> >
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: HasExecutions + Unpin, S: HasExecutions + Unpin,
{ {

View File

@ -40,8 +40,8 @@ use libafl_qemu::{
emu::Emulator, emu::Emulator,
executor::QemuExecutor, executor::QemuExecutor,
modules::{ modules::{
cmplog::CmpLogObserver, edges::StdEdgeCoverageClassicModule, CmpLogModule, cmplog::CmpLogObserver, edges::StdEdgeCoverageClassicModule,
EmulatorModuleTuple, utils::filters::HasAddressFilterTuples, CmpLogModule, EmulatorModuleTuple,
}, },
FastSnapshotManager, NopSnapshotManager, QemuInitError, QemuSnapshotManager, FastSnapshotManager, NopSnapshotManager, QemuInitError, QemuSnapshotManager,
}; };
@ -78,7 +78,7 @@ fn get_emulator<C, ET, I, S>(
QemuInitError, QemuInitError,
> >
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: HasExecutions + Unpin, S: HasExecutions + Unpin,
{ {

View File

@ -23,7 +23,7 @@ use crate::{
VersionCommandParser, VersionCommandParser,
}, },
get_exit_arch_regs, get_exit_arch_regs,
modules::EmulatorModuleTuple, modules::{utils::filters::HasAddressFilterTuples, EmulatorModuleTuple},
sync_exit::ExitArgs, sync_exit::ExitArgs,
Emulator, EmulatorDriverError, EmulatorDriverResult, GuestReg, InputLocation, Emulator, EmulatorDriverError, EmulatorDriverResult, GuestReg, InputLocation,
IsSnapshotManager, Qemu, QemuMemoryChunk, QemuRWError, Regs, StdEmulatorDriver, CPU, IsSnapshotManager, Qemu, QemuMemoryChunk, QemuRWError, Regs, StdEmulatorDriver, CPU,
@ -98,7 +98,7 @@ macro_rules! define_std_command_manager {
impl<C, ET, I, S, SM> CommandManager<C, StdEmulatorDriver, ET, I, S, SM> for $name<S> impl<C, ET, I, S, SM> CommandManager<C, StdEmulatorDriver, ET, I, S, SM> for $name<S>
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,
@ -127,7 +127,7 @@ macro_rules! define_std_command_manager {
impl<C, ET, I, S, SM> IsCommand<C, $name<S>, StdEmulatorDriver, ET, I, S, SM> for [<$name Commands>] impl<C, ET, I, S, SM> IsCommand<C, $name<S>, StdEmulatorDriver, ET, I, S, SM> for [<$name Commands>]
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,
@ -385,7 +385,7 @@ pub struct StartCommand {
impl<C, ET, I, S, SM> IsCommand<C, StdCommandManager<S>, StdEmulatorDriver, ET, I, S, SM> impl<C, ET, I, S, SM> IsCommand<C, StdCommandManager<S>, StdEmulatorDriver, ET, I, S, SM>
for StartCommand for StartCommand
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,
@ -546,7 +546,7 @@ pub struct PageAllowCommand {
#[cfg(feature = "systemmode")] #[cfg(feature = "systemmode")]
impl<C, CM, ED, ET, I, S, SM> IsCommand<C, CM, ED, ET, I, S, SM> for PageAllowCommand impl<C, CM, ED, ET, I, S, SM> IsCommand<C, CM, ED, ET, I, S, SM> for PageAllowCommand
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: Unpin, I: Unpin,
S: Unpin, S: Unpin,
{ {
@ -574,7 +574,7 @@ pub struct AddressAllowCommand {
} }
impl<C, CM, ED, ET, I, S, SM> IsCommand<C, CM, ED, ET, I, S, SM> for AddressAllowCommand impl<C, CM, ED, ET, I, S, SM> IsCommand<C, CM, ED, ET, I, S, SM> for AddressAllowCommand
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: Unpin, I: Unpin,
S: Unpin, S: Unpin,
{ {

View File

@ -32,7 +32,7 @@ use crate::{
CommandError, CommandManager, IsCommand, NativeCommandParser, CommandError, CommandManager, IsCommand, NativeCommandParser,
}, },
get_exit_arch_regs, get_exit_arch_regs,
modules::EmulatorModuleTuple, modules::{utils::filters::HasAddressFilterTuples, EmulatorModuleTuple},
sync_exit::ExitArgs, sync_exit::ExitArgs,
Emulator, EmulatorDriverError, EmulatorDriverResult, GuestReg, InputLocation, Emulator, EmulatorDriverError, EmulatorDriverResult, GuestReg, InputLocation,
IsSnapshotManager, NyxEmulatorDriver, Qemu, QemuMemoryChunk, Regs, IsSnapshotManager, NyxEmulatorDriver, Qemu, QemuMemoryChunk, Regs,
@ -98,7 +98,7 @@ macro_rules! define_nyx_command_manager {
impl<C, ET, I, S, SM> CommandManager<C, NyxEmulatorDriver, ET, I, S, SM> for $name<S> impl<C, ET, I, S, SM> CommandManager<C, NyxEmulatorDriver, ET, I, S, SM> for $name<S>
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,
@ -133,7 +133,7 @@ macro_rules! define_nyx_command_manager {
impl<C, ET, I, S, SM> IsCommand<C, $name<S>, NyxEmulatorDriver, ET, I, S, SM> for [<$name Commands>] impl<C, ET, I, S, SM> IsCommand<C, $name<S>, NyxEmulatorDriver, ET, I, S, SM> for [<$name Commands>]
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,
@ -295,7 +295,7 @@ pub struct NextPayloadCommand;
impl<C, ET, I, S, SM> IsCommand<C, NyxCommandManager<S>, NyxEmulatorDriver, ET, I, S, SM> impl<C, ET, I, S, SM> IsCommand<C, NyxCommandManager<S>, NyxEmulatorDriver, ET, I, S, SM>
for NextPayloadCommand for NextPayloadCommand
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,
@ -359,7 +359,7 @@ pub struct SubmitCR3Command;
impl<C, ET, I, S, SM> IsCommand<C, NyxCommandManager<S>, NyxEmulatorDriver, ET, I, S, SM> impl<C, ET, I, S, SM> IsCommand<C, NyxCommandManager<S>, NyxEmulatorDriver, ET, I, S, SM>
for SubmitCR3Command for SubmitCR3Command
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,
@ -407,7 +407,7 @@ impl RangeSubmitCommand {
impl<C, ET, I, S, SM> IsCommand<C, NyxCommandManager<S>, NyxEmulatorDriver, ET, I, S, SM> impl<C, ET, I, S, SM> IsCommand<C, NyxCommandManager<S>, NyxEmulatorDriver, ET, I, S, SM>
for RangeSubmitCommand for RangeSubmitCommand
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,

View File

@ -11,7 +11,7 @@ use crate::{
IsCommand, LoadCommand, LqprintfCommand, NativeExitKind, SaveCommand, StartCommand, IsCommand, LoadCommand, LqprintfCommand, NativeExitKind, SaveCommand, StartCommand,
StdCommandManager, TestCommand, VersionCommand, StdCommandManager, TestCommand, VersionCommand,
}, },
modules::EmulatorModuleTuple, modules::{utils::filters::HasAddressFilterTuples, EmulatorModuleTuple},
sync_exit::ExitArgs, sync_exit::ExitArgs,
GuestReg, IsSnapshotManager, Qemu, QemuMemoryChunk, Regs, StdEmulatorDriver, GuestReg, IsSnapshotManager, Qemu, QemuMemoryChunk, Regs, StdEmulatorDriver,
}; };
@ -92,7 +92,7 @@ pub struct StartPhysCommandParser;
impl<C, ET, I, S, SM> NativeCommandParser<C, StdCommandManager<S>, StdEmulatorDriver, ET, I, S, SM> impl<C, ET, I, S, SM> NativeCommandParser<C, StdCommandManager<S>, StdEmulatorDriver, ET, I, S, SM>
for StartPhysCommandParser for StartPhysCommandParser
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,
@ -121,7 +121,7 @@ pub struct StartVirtCommandParser;
impl<C, ET, I, S, SM> NativeCommandParser<C, StdCommandManager<S>, StdEmulatorDriver, ET, I, S, SM> impl<C, ET, I, S, SM> NativeCommandParser<C, StdCommandManager<S>, StdEmulatorDriver, ET, I, S, SM>
for StartVirtCommandParser for StartVirtCommandParser
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,
@ -242,7 +242,7 @@ pub struct VaddrFilterAllowRangeCommandParser;
impl<C, CM, ED, ET, I, S, SM> NativeCommandParser<C, CM, ED, ET, I, S, SM> impl<C, CM, ED, ET, I, S, SM> NativeCommandParser<C, CM, ED, ET, I, S, SM>
for VaddrFilterAllowRangeCommandParser for VaddrFilterAllowRangeCommandParser
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: Unpin, I: Unpin,
S: Unpin, S: Unpin,
{ {

View File

@ -15,7 +15,7 @@ use crate::{
parser::NativeCommandParser, parser::NativeCommandParser,
CommandError, NativeExitKind, CommandError, NativeExitKind,
}, },
modules::EmulatorModuleTuple, modules::{utils::filters::HasAddressFilterTuples, EmulatorModuleTuple},
sync_exit::ExitArgs, sync_exit::ExitArgs,
IsSnapshotManager, NyxEmulatorDriver, Qemu, QemuMemoryChunk, Regs, IsSnapshotManager, NyxEmulatorDriver, Qemu, QemuMemoryChunk, Regs,
}; };
@ -80,7 +80,7 @@ pub struct SubmitCR3CommandParser;
impl<C, ET, I, S, SM> NativeCommandParser<C, NyxCommandManager<S>, NyxEmulatorDriver, ET, I, S, SM> impl<C, ET, I, S, SM> NativeCommandParser<C, NyxCommandManager<S>, NyxEmulatorDriver, ET, I, S, SM>
for SubmitCR3CommandParser for SubmitCR3CommandParser
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,
@ -100,7 +100,7 @@ pub struct RangeSubmitCommandParser;
impl<C, ET, I, S, SM> NativeCommandParser<C, NyxCommandManager<S>, NyxEmulatorDriver, ET, I, S, SM> impl<C, ET, I, S, SM> NativeCommandParser<C, NyxCommandManager<S>, NyxEmulatorDriver, ET, I, S, SM>
for RangeSubmitCommandParser for RangeSubmitCommandParser
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,
@ -188,7 +188,7 @@ pub struct NextPayloadCommandParser;
impl<C, ET, I, S, SM> NativeCommandParser<C, NyxCommandManager<S>, NyxEmulatorDriver, ET, I, S, SM> impl<C, ET, I, S, SM> NativeCommandParser<C, NyxCommandManager<S>, NyxEmulatorDriver, ET, I, S, SM>
for NextPayloadCommandParser for NextPayloadCommandParser
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S> + HasAddressFilterTuples,
I: HasTargetBytes + Unpin, I: HasTargetBytes + Unpin,
S: Unpin, S: Unpin,
SM: IsSnapshotManager, SM: IsSnapshotManager,

View File

@ -10,6 +10,7 @@ use libafl_bolts::tuples::{Handle, Handled, MatchFirstType, MatchNameRef};
use libafl_qemu_sys::GuestAddr; use libafl_qemu_sys::GuestAddr;
use thread_local::ThreadLocal; use thread_local::ThreadLocal;
use super::utils::filters::HasAddressFilter;
#[cfg(feature = "systemmode")] #[cfg(feature = "systemmode")]
use crate::modules::utils::filters::{NopPageFilter, NOP_PAGE_FILTER}; use crate::modules::utils::filters::{NopPageFilter, NOP_PAGE_FILTER};
use crate::{ use crate::{
@ -415,10 +416,6 @@ where
S: Unpin, S: Unpin,
T: CallTraceCollectorTuple + Debug, T: CallTraceCollectorTuple + Debug,
{ {
type ModuleAddressFilter = StdAddressFilter;
#[cfg(feature = "systemmode")]
type ModulePageFilter = NopPageFilter;
fn post_qemu_init<ET>(&mut self, _qemu: Qemu, emulator_modules: &mut EmulatorModules<ET, I, S>) fn post_qemu_init<ET>(&mut self, _qemu: Qemu, emulator_modules: &mut EmulatorModules<ET, I, S>)
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S>,
@ -459,7 +456,15 @@ where
.unwrap() .unwrap()
.post_exec_all(qemu, input, observers, exit_kind); .post_exec_all(qemu, input, observers, exit_kind);
} }
}
impl<T> HasAddressFilter for CallTracerModule<T>
where
T: CallTraceCollectorTuple,
{
type ModuleAddressFilter = StdAddressFilter;
#[cfg(feature = "systemmode")]
type ModulePageFilter = NopPageFilter;
fn address_filter(&self) -> &Self::ModuleAddressFilter { fn address_filter(&self) -> &Self::ModuleAddressFilter {
&self.filter &self.filter
} }

View File

@ -19,7 +19,8 @@ use crate::{capstone, qemu::ArchExtras, CallingConvention};
use crate::{ use crate::{
emu::EmulatorModules, emu::EmulatorModules,
modules::{ modules::{
utils::filters::StdAddressFilter, AddressFilter, EmulatorModule, EmulatorModuleTuple, utils::filters::{HasAddressFilter, StdAddressFilter},
AddressFilter, EmulatorModule, EmulatorModuleTuple,
}, },
qemu::Hook, qemu::Hook,
Qemu, Qemu,
@ -75,10 +76,6 @@ where
I: Unpin, I: Unpin,
S: Unpin + HasMetadata, S: Unpin + HasMetadata,
{ {
type ModuleAddressFilter = StdAddressFilter;
#[cfg(feature = "systemmode")]
type ModulePageFilter = NopPageFilter;
fn first_exec<ET>( fn first_exec<ET>(
&mut self, &mut self,
_qemu: Qemu, _qemu: Qemu,
@ -95,6 +92,12 @@ where
Hook::Raw(trace_cmp8_cmplog), Hook::Raw(trace_cmp8_cmplog),
); );
} }
}
impl HasAddressFilter for CmpLogModule {
type ModuleAddressFilter = StdAddressFilter;
#[cfg(feature = "systemmode")]
type ModulePageFilter = NopPageFilter;
fn address_filter(&self) -> &Self::ModuleAddressFilter { fn address_filter(&self) -> &Self::ModuleAddressFilter {
&self.address_filter &self.address_filter
@ -143,10 +146,6 @@ where
I: Unpin, I: Unpin,
S: Unpin + HasMetadata, S: Unpin + HasMetadata,
{ {
type ModuleAddressFilter = StdAddressFilter;
#[cfg(feature = "systemmode")]
type ModulePageFilter = NopPageFilter;
const HOOKS_DO_SIDE_EFFECTS: bool = false; const HOOKS_DO_SIDE_EFFECTS: bool = false;
fn first_exec<ET>( fn first_exec<ET>(
@ -165,6 +164,12 @@ where
Hook::Raw(trace_cmp8_cmplog), Hook::Raw(trace_cmp8_cmplog),
); );
} }
}
impl HasAddressFilter for CmpLogChildModule {
type ModuleAddressFilter = StdAddressFilter;
#[cfg(feature = "systemmode")]
type ModulePageFilter = NopPageFilter;
fn address_filter(&self) -> &Self::ModuleAddressFilter { fn address_filter(&self) -> &Self::ModuleAddressFilter {
&self.address_filter &self.address_filter
@ -408,10 +413,6 @@ where
I: Unpin, I: Unpin,
S: Unpin, S: Unpin,
{ {
type ModuleAddressFilter = StdAddressFilter;
#[cfg(feature = "systemmode")]
type ModulePageFilter = NopPageFilter;
fn first_exec<ET>( fn first_exec<ET>(
&mut self, &mut self,
_qemu: Qemu, _qemu: Qemu,
@ -426,6 +427,13 @@ where
Hook::Empty, Hook::Empty,
); );
} }
}
#[cfg(feature = "usermode")]
impl HasAddressFilter for CmpLogRoutinesModule {
type ModuleAddressFilter = StdAddressFilter;
#[cfg(feature = "systemmode")]
type ModulePageFilter = NopPageFilter;
fn address_filter(&self) -> &Self::ModuleAddressFilter { fn address_filter(&self) -> &Self::ModuleAddressFilter {
&self.address_filter &self.address_filter

View File

@ -7,6 +7,7 @@ use libafl_targets::drcov::{DrCovBasicBlock, DrCovWriter};
use rangemap::RangeMap; use rangemap::RangeMap;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use super::utils::filters::HasAddressFilter;
#[cfg(feature = "systemmode")] #[cfg(feature = "systemmode")]
use crate::modules::utils::filters::{NopPageFilter, NOP_PAGE_FILTER}; use crate::modules::utils::filters::{NopPageFilter, NOP_PAGE_FILTER};
use crate::{ use crate::{
@ -264,10 +265,6 @@ where
I: Unpin, I: Unpin,
S: Unpin + HasMetadata, S: Unpin + HasMetadata,
{ {
type ModuleAddressFilter = F;
#[cfg(feature = "systemmode")]
type ModulePageFilter = NopPageFilter;
fn post_qemu_init<ET>(&mut self, _qemu: Qemu, emulator_modules: &mut EmulatorModules<ET, I, S>) fn post_qemu_init<ET>(&mut self, _qemu: Qemu, emulator_modules: &mut EmulatorModules<ET, I, S>)
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S>,
@ -349,6 +346,15 @@ where
unsafe fn on_timeout(&mut self) { unsafe fn on_timeout(&mut self) {
self.write(); self.write();
} }
}
impl<F> HasAddressFilter for DrCovModule<F>
where
F: AddressFilter,
{
type ModuleAddressFilter = F;
#[cfg(feature = "systemmode")]
type ModulePageFilter = NopPageFilter;
fn address_filter(&self) -> &Self::ModuleAddressFilter { fn address_filter(&self) -> &Self::ModuleAddressFilter {
&self.filter &self.filter

View File

@ -34,6 +34,8 @@ pub use child::{
}; };
use libafl::observers::ConstLenMapObserver; use libafl::observers::ConstLenMapObserver;
use super::utils::filters::HasAddressFilter;
/// Standard edge coverage module, adapted to most use cases /// Standard edge coverage module, adapted to most use cases
pub type StdEdgeCoverageModule = StdEdgeCoverageFullModule; pub type StdEdgeCoverageModule = StdEdgeCoverageFullModule;
@ -327,10 +329,6 @@ where
S: Unpin + HasMetadata, S: Unpin + HasMetadata,
V: EdgeCoverageVariant<AF, PF, IS_CONST_MAP, MAP_SIZE> + 'static, V: EdgeCoverageVariant<AF, PF, IS_CONST_MAP, MAP_SIZE> + 'static,
{ {
type ModuleAddressFilter = AF;
#[cfg(feature = "systemmode")]
type ModulePageFilter = PF;
const HOOKS_DO_SIDE_EFFECTS: bool = V::DO_SIDE_EFFECTS; const HOOKS_DO_SIDE_EFFECTS: bool = V::DO_SIDE_EFFECTS;
fn first_exec<ET>( fn first_exec<ET>(
@ -353,7 +351,18 @@ where
self.variant.fn_no_hitcount(emulator_modules); self.variant.fn_no_hitcount(emulator_modules);
} }
} }
}
impl<AF, PF, V, const IS_CONST_MAP: bool, const MAP_SIZE: usize> HasAddressFilter
for EdgeCoverageModule<AF, PF, V, IS_CONST_MAP, MAP_SIZE>
where
AF: AddressFilter,
PF: PageFilter,
{
type ModuleAddressFilter = AF;
#[cfg(feature = "systemmode")]
type ModulePageFilter = PF;
fn address_filter(&self) -> &Self::ModuleAddressFilter { fn address_filter(&self) -> &Self::ModuleAddressFilter {
&self.address_filter &self.address_filter
} }

View File

@ -85,11 +85,6 @@ pub mod utils;
/// return values, please refer to the [`EmulatorModules`]. /// return values, please refer to the [`EmulatorModules`].
// TODO remove 'static when specialization will be stable // TODO remove 'static when specialization will be stable
pub trait EmulatorModule<I, S>: 'static + Debug { pub trait EmulatorModule<I, S>: 'static + Debug {
type ModuleAddressFilter: AddressFilter;
#[cfg(feature = "systemmode")]
type ModulePageFilter: PageFilter;
const HOOKS_DO_SIDE_EFFECTS: bool = true; const HOOKS_DO_SIDE_EFFECTS: bool = true;
/// Hook run **before** QEMU is initialized. /// Hook run **before** QEMU is initialized.
@ -167,25 +162,6 @@ pub trait EmulatorModule<I, S>: 'static + Debug {
/// ///
/// This is getting executed in a signal handler. /// This is getting executed in a signal handler.
unsafe fn on_timeout(&mut self) {} unsafe fn on_timeout(&mut self) {}
fn address_filter(&self) -> &Self::ModuleAddressFilter;
fn address_filter_mut(&mut self) -> &mut Self::ModuleAddressFilter;
fn update_address_filter(&mut self, qemu: Qemu, filter: Self::ModuleAddressFilter) {
*self.address_filter_mut() = filter;
// Necessary because some hooks filter during TB generation.
qemu.flush_jit();
}
#[cfg(feature = "systemmode")]
fn page_filter(&self) -> &Self::ModulePageFilter;
#[cfg(feature = "systemmode")]
fn page_filter_mut(&mut self) -> &mut Self::ModulePageFilter;
#[cfg(feature = "systemmode")]
fn update_page_filter(&mut self, qemu: Qemu, filter: Self::ModulePageFilter) {
*self.page_filter_mut() = filter;
// Necessary because some hooks filter during TB generation.
qemu.flush_jit();
}
} }
pub trait EmulatorModuleTuple<I, S>: pub trait EmulatorModuleTuple<I, S>:
@ -245,11 +221,6 @@ pub trait EmulatorModuleTuple<I, S>:
/// ///
/// This is getting executed in a signal handler. /// This is getting executed in a signal handler.
unsafe fn on_timeout_all(&mut self); unsafe fn on_timeout_all(&mut self);
fn allow_address_range_all(&mut self, address_range: Range<GuestAddr>);
#[cfg(feature = "systemmode")]
fn allow_page_id_all(&mut self, page_id: GuestPhysAddr);
} }
impl<I, S> EmulatorModuleTuple<I, S> for () impl<I, S> EmulatorModuleTuple<I, S> for ()
@ -314,11 +285,6 @@ where
unsafe fn on_crash_all(&mut self) {} unsafe fn on_crash_all(&mut self) {}
unsafe fn on_timeout_all(&mut self) {} unsafe fn on_timeout_all(&mut self) {}
fn allow_address_range_all(&mut self, _address_range: Range<GuestAddr>) {}
#[cfg(feature = "systemmode")]
fn allow_page_id_all(&mut self, _page_id: GuestPhysAddr) {}
} }
impl<Head, Tail, I, S> EmulatorModuleTuple<I, S> for (Head, Tail) impl<Head, Tail, I, S> EmulatorModuleTuple<I, S> for (Head, Tail)
@ -403,15 +369,4 @@ where
self.0.on_timeout(); self.0.on_timeout();
self.1.on_timeout_all(); self.1.on_timeout_all();
} }
fn allow_address_range_all(&mut self, address_range: Range<GuestAddr>) {
self.0.address_filter_mut().register(address_range.clone());
self.1.allow_address_range_all(address_range);
}
#[cfg(feature = "systemmode")]
fn allow_page_id_all(&mut self, page_id: GuestPhysAddr) {
self.0.page_filter_mut().register(page_id);
self.1.allow_page_id_all(page_id);
}
} }

View File

@ -13,8 +13,8 @@ use rangemap::RangeMap;
use crate::{ use crate::{
modules::{ modules::{
calls::FullBacktraceCollector, snapshot::SnapshotModule, EmulatorModule, calls::FullBacktraceCollector, snapshot::SnapshotModule, utils::filters::HasAddressFilter,
EmulatorModuleTuple, EmulatorModule, EmulatorModuleTuple,
}, },
qemu::MemAccessInfo, qemu::MemAccessInfo,
sys::TCGTemp, sys::TCGTemp,
@ -815,7 +815,6 @@ where
I: Unpin, I: Unpin,
S: Unpin, S: Unpin,
{ {
type ModuleAddressFilter = StdAddressFilter;
const HOOKS_DO_SIDE_EFFECTS: bool = false; const HOOKS_DO_SIDE_EFFECTS: bool = false;
fn pre_qemu_init<ET>( fn pre_qemu_init<ET>(
@ -956,7 +955,10 @@ where
*exit_kind = ExitKind::Crash; *exit_kind = ExitKind::Crash;
} }
} }
}
impl HasAddressFilter for AsanModule {
type ModuleAddressFilter = StdAddressFilter;
fn address_filter(&self) -> &Self::ModuleAddressFilter { fn address_filter(&self) -> &Self::ModuleAddressFilter {
&self.filter &self.filter
} }

View File

@ -14,7 +14,8 @@ use crate::sys::libafl_tcg_gen_asan;
use crate::{ use crate::{
emu::EmulatorModules, emu::EmulatorModules,
modules::{ modules::{
utils::filters::StdAddressFilter, AddressFilter, EmulatorModule, EmulatorModuleTuple, utils::filters::{HasAddressFilter, StdAddressFilter},
AddressFilter, EmulatorModule, EmulatorModuleTuple,
}, },
qemu::{Hook, MemAccessInfo, Qemu}, qemu::{Hook, MemAccessInfo, Qemu},
sys::TCGTemp, sys::TCGTemp,
@ -190,8 +191,6 @@ where
I: Unpin, I: Unpin,
S: Unpin, S: Unpin,
{ {
type ModuleAddressFilter = F;
fn pre_qemu_init<ET>( fn pre_qemu_init<ET>(
&mut self, &mut self,
_emulator_modules: &mut EmulatorModules<ET, I, S>, _emulator_modules: &mut EmulatorModules<ET, I, S>,
@ -334,6 +333,13 @@ where
Hook::Function(guest_trace_error_n_asan::<ET, I, S>), Hook::Function(guest_trace_error_n_asan::<ET, I, S>),
); );
} }
}
impl<F> HasAddressFilter for AsanGuestModule<F>
where
F: AddressFilter,
{
type ModuleAddressFilter = F;
fn address_filter(&self) -> &Self::ModuleAddressFilter { fn address_filter(&self) -> &Self::ModuleAddressFilter {
&self.filter &self.filter

View File

@ -24,7 +24,7 @@ use crate::{
elf::EasyElf, elf::EasyElf,
emu::EmulatorModules, emu::EmulatorModules,
modules::{ modules::{
utils::filters::{NopAddressFilter, NOP_ADDRESS_FILTER}, utils::filters::{HasAddressFilter, NopAddressFilter, NOP_ADDRESS_FILTER},
EmulatorModule, EmulatorModuleTuple, EmulatorModule, EmulatorModuleTuple,
}, },
qemu::{ArchExtras, Hook, SyscallHookResult}, qemu::{ArchExtras, Hook, SyscallHookResult},
@ -268,8 +268,6 @@ where
I: Unpin, I: Unpin,
S: Unpin, S: Unpin,
{ {
type ModuleAddressFilter = NopAddressFilter;
fn post_qemu_init<ET>(&mut self, _qemu: Qemu, emulator_modules: &mut EmulatorModules<ET, I, S>) fn post_qemu_init<ET>(&mut self, _qemu: Qemu, emulator_modules: &mut EmulatorModules<ET, I, S>)
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S>,
@ -344,6 +342,10 @@ where
} }
} }
} }
}
impl HasAddressFilter for InjectionModule {
type ModuleAddressFilter = NopAddressFilter;
fn address_filter(&self) -> &Self::ModuleAddressFilter { fn address_filter(&self) -> &Self::ModuleAddressFilter {
&NopAddressFilter &NopAddressFilter

View File

@ -24,7 +24,7 @@ use crate::{
emu::EmulatorModules, emu::EmulatorModules,
modules::{ modules::{
asan::AsanModule, asan::AsanModule,
utils::filters::{NopAddressFilter, NOP_ADDRESS_FILTER}, utils::filters::{HasAddressFilter, NopAddressFilter, NOP_ADDRESS_FILTER},
EmulatorModule, EmulatorModuleTuple, Range, EmulatorModule, EmulatorModuleTuple, Range,
}, },
qemu::{Hook, SyscallHookResult}, qemu::{Hook, SyscallHookResult},
@ -698,8 +698,6 @@ where
I: Unpin, I: Unpin,
S: Unpin, S: Unpin,
{ {
type ModuleAddressFilter = NopAddressFilter;
fn post_qemu_init<ET>(&mut self, _qemu: Qemu, emulator_modules: &mut EmulatorModules<ET, I, S>) fn post_qemu_init<ET>(&mut self, _qemu: Qemu, emulator_modules: &mut EmulatorModules<ET, I, S>)
where where
ET: EmulatorModuleTuple<I, S>, ET: EmulatorModuleTuple<I, S>,
@ -737,7 +735,10 @@ where
self.reset(qemu); self.reset(qemu);
} }
} }
}
impl HasAddressFilter for SnapshotModule {
type ModuleAddressFilter = NopAddressFilter;
fn address_filter(&self) -> &Self::ModuleAddressFilter { fn address_filter(&self) -> &Self::ModuleAddressFilter {
&NopAddressFilter &NopAddressFilter
} }

View File

@ -69,6 +69,64 @@ where
} }
} }
/// Offers accessors to modules' address filters.
pub trait HasAddressFilter {
type ModuleAddressFilter: AddressFilter;
#[cfg(feature = "systemmode")]
type ModulePageFilter: PageFilter;
fn address_filter(&self) -> &Self::ModuleAddressFilter;
fn address_filter_mut(&mut self) -> &mut Self::ModuleAddressFilter;
fn update_address_filter(&mut self, qemu: Qemu, filter: Self::ModuleAddressFilter) {
*self.address_filter_mut() = filter;
// Necessary because some hooks filter during TB generation.
qemu.flush_jit();
}
#[cfg(feature = "systemmode")]
fn page_filter(&self) -> &Self::ModulePageFilter;
#[cfg(feature = "systemmode")]
fn page_filter_mut(&mut self) -> &mut Self::ModulePageFilter;
#[cfg(feature = "systemmode")]
fn update_page_filter(&mut self, qemu: Qemu, filter: Self::ModulePageFilter) {
*self.page_filter_mut() = filter;
// Necessary because some hooks filter during TB generation.
qemu.flush_jit();
}
}
pub trait HasAddressFilterTuples {
fn allow_address_range_all(&mut self, address_range: Range<GuestAddr>);
#[cfg(feature = "systemmode")]
fn allow_page_id_all(&mut self, page_id: GuestPhysAddr);
}
impl HasAddressFilterTuples for () {
fn allow_address_range_all(&mut self, _address_range: Range<GuestAddr>) {}
#[cfg(feature = "systemmode")]
fn allow_page_id_all(&mut self, _page_id: GuestPhysAddr) {}
}
impl<Head, Tail> HasAddressFilterTuples for (Head, Tail)
where
Head: HasAddressFilter,
Tail: HasAddressFilterTuples,
{
fn allow_address_range_all(&mut self, address_range: Range<GuestAddr>) {
self.0.address_filter_mut().register(address_range.clone());
self.1.allow_address_range_all(address_range);
}
#[cfg(feature = "systemmode")]
fn allow_page_id_all(&mut self, page_id: GuestPhysAddr) {
self.0.page_filter_mut().register(page_id);
self.1.allow_page_id_all(page_id);
}
}
/// An address filter list. /// An address filter list.
/// ///
/// It will allow anything in the registered ranges, and deny anything else. /// It will allow anything in the registered ranges, and deny anything else.