Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
175 commits
Select commit Hold shift + click to select a range
979d14e
Decode with callback
Marcondiro Nov 13, 2024
4b59641
WIP restore intelpt module
Marcondiro Nov 13, 2024
fc100a9
Merge remote-tracking branch 'upstream/main'
Marcondiro Nov 14, 2024
731a7f5
Fix build_target if target_dir doesn't exist
Marcondiro Nov 14, 2024
5386013
WIP itelpt qemu/kvm example: bootloader
Marcondiro Nov 14, 2024
87612d7
Merge remote-tracking branch 'upstream/main'
Marcondiro Nov 18, 2024
73eb9db
Merge branch 'AFLplusplus:main' into main
Marcondiro Nov 19, 2024
f6f42c0
Merge branch 'AFLplusplus:main' into main
Marcondiro Nov 19, 2024
af20343
qemu config refactoring
rmalmain Nov 19, 2024
643c240
Merge remote-tracking branch 'upstream/main'
Marcondiro Nov 20, 2024
3eb1f45
Merge remote-tracking branch 'upstream/qemu_builder_update'
Marcondiro Nov 20, 2024
f4addef
Merge remote-tracking branch 'upstream/main'
Marcondiro Nov 21, 2024
cddc3df
Fix intel_pt_command_executor target dir
Marcondiro Nov 21, 2024
1dfc590
Merge remote-tracking branch 'upstream/main'
Marcondiro Nov 21, 2024
5fa831a
Merge branch 'main' into qemu_builder_update
rmalmain Nov 22, 2024
4867e08
Merge remote-tracking branch 'upstream/main'
Nov 22, 2024
4cef8f6
Merge remote-tracking branch 'upstream/main'
Marcondiro Nov 25, 2024
28655d8
* QEMU error refactoring*
rmalmain Nov 25, 2024
b85ab06
update test
rmalmain Nov 25, 2024
a7f6464
Merge remote-tracking branch 'upstream/qemu_builder_update'
Marcondiro Nov 25, 2024
8afc5fc
Bump libipt
Marcondiro Nov 25, 2024
01fe205
waitpid_filtered to ignore SIGWINCH
Marcondiro Nov 25, 2024
eb3c63e
Fix warnings unused manifest key: *.version
Marcondiro Nov 26, 2024
c8b28ba
Add export_raw feature to libafl_intelpt
Marcondiro Nov 26, 2024
42b8cfe
derive Debug for IntelPTHook
Marcondiro Nov 26, 2024
a029fd1
Clippy
Marcondiro Nov 26, 2024
47d2741
Light refactor of EmulatorModules
rmalmain Nov 26, 2024
bd14dae
Update target program ELF offsets
Marcondiro Nov 26, 2024
0d37b78
Merge branch 'main' into qemu_builder_update
rmalmain Nov 26, 2024
1c61b38
fmt
rmalmain Nov 26, 2024
68e7c75
Merge remote-tracking branch 'upstream/main' into better-command-exec
Marcondiro Nov 26, 2024
525fd11
* asan fixed size accesses working with generics
rmalmain Nov 26, 2024
5346f83
fmt
rmalmain Nov 26, 2024
02a2f1f
Add comment to KVM pt_mode check
Marcondiro Nov 27, 2024
5230945
Merge remote-tracking branch 'upstream/main' into better-command-exec
Marcondiro Nov 27, 2024
9a84af4
refactor
Marcondiro Nov 27, 2024
eff0733
Merge remote-tracking branch 'upstream/main'
Marcondiro Nov 27, 2024
761964e
Add intel_pt_export_raw feature in libafl
Marcondiro Nov 27, 2024
17059d7
fix fuzzers
rmalmain Nov 27, 2024
c50ba05
* refactor asan and asanguest modules to avoid custom init of QEMU an…
rmalmain Nov 27, 2024
8d8631e
fmt
rmalmain Nov 27, 2024
f2491c1
clippy
rmalmain Nov 27, 2024
a12dc91
Merge branch 'main' into qemu_builder_update
rmalmain Nov 27, 2024
76480c1
fix qemu_coverage
rmalmain Nov 27, 2024
46f0da7
fmt
rmalmain Nov 27, 2024
1f1d9af
Merge remote-tracking branch 'upstream/main'
Marcondiro Nov 28, 2024
d2affe5
Merge remote-tracking branch 'upstream/main' into better-command-exec
Marcondiro Nov 28, 2024
3464e44
forgot qemu args in launcher
rmalmain Nov 28, 2024
d7bfbe7
map_error instead of unwrap
Marcondiro Nov 28, 2024
005475b
use correct args
rmalmain Nov 28, 2024
7f6c516
Merge remote-tracking branch 'upstream/qemu_builder_update'
Marcondiro Nov 28, 2024
6bb2867
Update to new libafl_qemu
Marcondiro Nov 28, 2024
970aecc
Merge branch 'better-command-exec'
Marcondiro Nov 28, 2024
ea840cf
adapt api
rmalmain Nov 28, 2024
51d5061
borrow checker friendly join_split_trace
Marcondiro Nov 28, 2024
5785061
Merge branch 'better-command-exec'
Marcondiro Nov 28, 2024
2998445
testing stuff
rmalmain Nov 28, 2024
aadc025
Merge remote-tracking branch 'upstream/qemu_builder_update'
Marcondiro Nov 29, 2024
b28d473
Set ip_filters (also) with builder
Marcondiro Nov 29, 2024
121d5d2
Merge branch 'better-command-exec'
Marcondiro Nov 29, 2024
9222eab
Move trace to file
Marcondiro Nov 29, 2024
6979bd2
Merge branch 'better-command-exec'
Marcondiro Nov 29, 2024
53a241f
Store a pt_builder in module
Marcondiro Nov 29, 2024
7c8ded9
baby_bootloader target
Marcondiro Dec 3, 2024
570030f
Best bootloader ever
Marcondiro Dec 4, 2024
c5b3e19
Merge branch 'main' into qemu_builder_update
rmalmain Dec 5, 2024
0fe2977
new builder?
rmalmain Dec 5, 2024
b7f5240
use closure for qemu config from emulator builder.
rmalmain Dec 5, 2024
413767f
better format
rmalmain Dec 5, 2024
8b04e3f
clippy + fmt
rmalmain Dec 5, 2024
7b2c0a9
Merge remote-tracking branch 'upstream/qemu_builder_update'
Marcondiro Dec 6, 2024
576a419
Fix build target
Marcondiro Dec 6, 2024
395b643
Remove filter on speculatively exec blocks
Marcondiro Dec 6, 2024
fb036ce
Add current ip_filters getter
Marcondiro Dec 6, 2024
89a6bf8
Fix possibile infinite loop in trace decode
Marcondiro Dec 6, 2024
9102449
Merge branch 'better-command-exec'
Marcondiro Dec 13, 2024
34ecd12
HW breakpoint + snapshot
Marcondiro Dec 13, 2024
378da3f
add snapshot and exit at first objective
Marcondiro Dec 17, 2024
76b13d0
Merge remote-tracking branch 'upstream/main'
Marcondiro Dec 17, 2024
53c0299
Merge remote-tracking branch 'upstream/main'
Marcondiro Dec 18, 2024
1af867f
Merge remote-tracking branch 'upstream/main'
Marcondiro Dec 19, 2024
2bde279
prefer raw pointers to slice_from_raw_parts_mut
Marcondiro Dec 20, 2024
1e7c1a8
Add cpu option to QEMU config
Marcondiro Dec 20, 2024
7f80bc5
Add cpu option and minor improvements
Marcondiro Dec 20, 2024
6f6a2ad
fix cargo run causing recompile
Marcondiro Dec 20, 2024
1a9b4a1
Merge remote-tracking branch 'upstream/main'
Marcondiro Dec 20, 2024
4a696c0
no default devices
Marcondiro Jan 2, 2025
85b7339
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 7, 2025
4ff8c7f
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 8, 2025
1fcf6ba
windows clippy fix
Marcondiro Jan 8, 2025
22e03e0
Exclude intel_pt feature from CI as all systemmode feats
Marcondiro Jan 8, 2025
59f8341
Add qemu_intel_pt_bootloader to CI
Marcondiro Jan 8, 2025
68aad52
Fix NopPageFilter
Marcondiro Jan 8, 2025
648094c
Fix qemu_config
Marcondiro Jan 8, 2025
0b43a8b
Restore HW breakpoints
Marcondiro Jan 8, 2025
5a6891b
Lints
Marcondiro Jan 8, 2025
7584bb6
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 9, 2025
b4f052c
return Result for hw bp set/remove
Marcondiro Jan 9, 2025
2624249
mark join_split_trace as unsafe
Marcondiro Jan 9, 2025
0c4ab15
Put the qcow2 in a tmpfs ramdisk
Marcondiro Jan 10, 2025
3d4201b
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 10, 2025
aa17fc7
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 13, 2025
66f0aef
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 13, 2025
e88452a
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 14, 2025
6cfb6d5
Post merge fixes
Marcondiro Jan 14, 2025
634eb82
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 15, 2025
4f27051
Try out libipt 0.3 alpha
Marcondiro Jan 15, 2025
4a7b9ba
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 16, 2025
181d8ac
Try out libipt 0.3 alpha also in hook
Marcondiro Jan 16, 2025
f85eba7
Clippy
Marcondiro Jan 16, 2025
bd6dfed
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 16, 2025
33c17e6
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 17, 2025
ed8a981
New libipt
Marcondiro Jan 17, 2025
7975dc6
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 17, 2025
fad75cc
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 20, 2025
0422d33
Post merge fixes
Marcondiro Jan 20, 2025
a428d0e
Bump libipt
Marcondiro Jan 20, 2025
09bfffd
Drive cache None
Marcondiro Jan 21, 2025
7815f9d
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 21, 2025
06f8d74
Post merge fixes
Marcondiro Jan 21, 2025
dd0912d
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 21, 2025
cace23b
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 22, 2025
ee7172d
Use SectionInfo from libipt
Marcondiro Jan 22, 2025
a85bedc
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 22, 2025
bcfa020
No slice::from_raw_parts_mut, just use raw pointer
Marcondiro Jan 23, 2025
a9d5471
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 23, 2025
b1febfc
Cache the decoder builder
Marcondiro Jan 23, 2025
915fb17
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 27, 2025
02382cf
Update qemu-bridge
Marcondiro Jan 27, 2025
3cf19e4
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 28, 2025
83ee003
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 29, 2025
9498c77
Add qemu -append param
Marcondiro Jan 29, 2025
64eb7b9
Move linux specific code to a mod, less #[cfg]s
Marcondiro Jan 29, 2025
fef60cc
Merge remote-tracking branch 'upstream/main'
Marcondiro Jan 29, 2025
23579be
Add qemu initrd config
Marcondiro Jan 29, 2025
45708a8
Add qemu monitor tcp
Marcondiro Jan 31, 2025
b2c199e
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 3, 2025
3283233
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 4, 2025
4c5855d
Add not enough ip filters message
Marcondiro Feb 4, 2025
5910305
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 4, 2025
2e21039
Fix wrong must_use
Marcondiro Feb 5, 2025
a9149f4
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 5, 2025
d7b87de
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 10, 2025
4be2aee
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 11, 2025
c20183e
Prevent possible infinite loop in block decoding in debug mode
Marcondiro Feb 12, 2025
c281db2
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 12, 2025
4f3e18d
Clippy
Marcondiro Feb 12, 2025
094b7a7
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 12, 2025
064755e
fix CI?
Marcondiro Feb 12, 2025
93cdad2
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 13, 2025
443d91f
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 14, 2025
8b99358
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 17, 2025
93a872b
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 17, 2025
ac8b365
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 18, 2025
f23cf93
Bump qemu-libafl-bridge
Marcondiro Feb 19, 2025
08b0d4d
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 19, 2025
58c112f
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 19, 2025
83ab63b
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 21, 2025
1008cfe
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 24, 2025
a55e422
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 25, 2025
1cad4d2
Remove ram disk after run
Marcondiro Feb 25, 2025
f8abfd5
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 25, 2025
dd37ee4
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 26, 2025
c2b2a14
Merge remote-tracking branch 'upstream/main'
Marcondiro Feb 26, 2025
d24ed87
Merge remote-tracking branch 'upstream/main'
Marcondiro Mar 5, 2025
f9ebb47
Post merge fix
Marcondiro Mar 5, 2025
f34ca42
Cleanup
Marcondiro Mar 5, 2025
6a19d87
Reduce the PR's scope
Marcondiro Mar 5, 2025
6e5d340
Merge remote-tracking branch 'upstream/main'
Marcondiro Mar 6, 2025
40bd080
Merge remote-tracking branch 'upstream/main'
Marcondiro Mar 6, 2025
8cd3767
Merge branch 'main' into main
rmalmain Mar 31, 2025
270b94e
Do not install cmake from apt
Marcondiro Apr 1, 2025
f37dc74
Merge remote-tracking branch 'upstream/main'
Marcondiro Apr 2, 2025
19ea324
Merge branch 'main' into main
Marcondiro Apr 4, 2025
f8f7d1c
Merge branch 'main' into main
rmalmain Apr 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ubuntu-prepare/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ runs:
steps:
- name: Install and cache deps
shell: bash
run: sudo apt-get update && sudo apt-get install -y curl lsb-release wget software-properties-common gnupg ninja-build shellcheck pax-utils nasm libsqlite3-dev libc6-dev libgtk-3-dev gcc g++ gcc-arm-none-eabi gcc-arm-linux-gnueabi g++-arm-linux-gnueabi libslirp-dev libz3-dev build-essential cmake
run: sudo apt-get update && sudo apt-get install -y curl lsb-release wget software-properties-common gnupg ninja-build shellcheck pax-utils nasm libsqlite3-dev libc6-dev libgtk-3-dev gcc g++ gcc-arm-none-eabi gcc-arm-linux-gnueabi g++-arm-linux-gnueabi libslirp-dev libz3-dev build-essential
- uses: dtolnay/rust-toolchain@stable
- name: install just
uses: extractions/setup-just@v2
Expand Down
4 changes: 4 additions & 0 deletions libafl_qemu/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@ slirp = [
"libafl_qemu_sys/slirp",
] # build qemu with host libslirp (for user networking)

intel_pt = ["systemmode", "x86_64", "dep:libafl_intelpt"]
intel_pt_export_raw = ["intel_pt", "libafl_intelpt/export_raw"]

# Requires the binary's build.rs to call `build_libafl_qemu`
shared = ["libafl_qemu_sys/shared"]

Expand All @@ -101,6 +104,7 @@ libafl_bolts = { workspace = true, features = ["std", "derive"] }
libafl_targets = { workspace = true, default-features = true }
libafl_qemu_sys = { workspace = true }
libafl_derive = { workspace = true, default-features = true }
libafl_intelpt = { workspace = true, default-features = true, optional = true }

serde = { workspace = true, default-features = false, features = [
"alloc",
Expand Down
2 changes: 1 addition & 1 deletion libafl_qemu/libafl_qemu_build/src/build.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use core::str::FromStr;
use std::{
env, fs,
path::{Path, PathBuf},
process::Command,
str::FromStr,
};

use which::which;
Expand Down
3 changes: 1 addition & 2 deletions libafl_qemu/src/modules/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@ pub use usermode::*;

#[cfg(feature = "systemmode")]
pub mod systemmode;
#[cfg(feature = "systemmode")]
#[expect(unused_imports)]
#[cfg(all(feature = "systemmode", feature = "intel_pt"))]
pub use systemmode::*;

pub mod edges;
Expand Down
155 changes: 155 additions & 0 deletions libafl_qemu/src/modules/systemmode/intel_pt.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
use std::{
fmt::Debug,
ops::{Range, RangeInclusive},
};

use libafl::{HasMetadata, observers::ObserversTuple};
pub use libafl_intelpt::SectionInfo;
use libafl_intelpt::{Image, IntelPT, IntelPTBuilder};
use libafl_qemu_sys::{CPUArchStatePtr, GuestAddr};
use num_traits::SaturatingAdd;
use typed_builder::TypedBuilder;

use crate::{
EmulatorModules, NewThreadHook, Qemu, QemuParams,
modules::{AddressFilter, EmulatorModule, EmulatorModuleTuple, ExitKind},
};

#[derive(Debug, TypedBuilder)]
pub struct IntelPTModule<T = u8> {
#[builder(setter(skip), default)]
pt: Option<IntelPT>,
#[builder(default = IntelPTModule::default_pt_builder())]
intel_pt_builder: IntelPTBuilder,
#[builder(setter(transform = |sections: &[SectionInfo]| {
let mut i = Image::new(None).unwrap();
i.add_files_cached(sections, None).unwrap();
i
}))]
image: Image,
map_ptr: *mut T,
map_len: usize,
}

impl IntelPTModule {
pub fn default_pt_builder() -> IntelPTBuilder {
IntelPT::builder().exclude_kernel(false)
}
}

impl<I, S, T> EmulatorModule<I, S> for IntelPTModule<T>
where
I: Unpin,
S: Unpin + HasMetadata,
T: SaturatingAdd + From<u8> + Debug + 'static,
{
fn pre_qemu_init<ET>(
&mut self,
emulator_modules: &mut EmulatorModules<ET, I, S>,
_qemu_params: &mut QemuParams,
) where
ET: EmulatorModuleTuple<I, S>,
{
emulator_modules
.thread_creation(NewThreadHook::Function(intel_pt_new_thread::<ET, I, S, T>))
.unwrap();
// fixme: consider implementing a clean emulator_modules.thread_teradown
}

fn pre_exec<ET>(
&mut self,
_qemu: Qemu,
_emulator_modules: &mut EmulatorModules<ET, I, S>,
_state: &mut S,
_input: &I,
) where
ET: EmulatorModuleTuple<I, S>,
{
let pt = self.pt.as_mut().expect("Intel PT module not initialized.");
pt.enable_tracing().unwrap();
}

fn post_exec<OT, ET>(
&mut self,
_qemu: Qemu,
_emulator_modules: &mut EmulatorModules<ET, I, S>,
_state: &mut S,
_input: &I,
_observers: &mut OT,
_exit_kind: &mut ExitKind,
) where
OT: ObserversTuple<I, S>,
ET: EmulatorModuleTuple<I, S>,
{
let pt = self.pt.as_mut().expect("Intel PT module not initialized.");
pt.disable_tracing().unwrap();

let _ = pt
.decode_traces_into_map(&mut self.image, self.map_ptr, self.map_len)
.inspect_err(|e| log::warn!("Intel PT trace decode failed: {e}"));

#[cfg(feature = "intel_pt_export_raw")]
{
let _ = pt
.dump_last_trace_to_file()
.inspect_err(|e| log::warn!("Intel PT trace save to file failed: {e}"));
}
}
}

impl<T> AddressFilter for IntelPTModule<T>
where
T: Debug + 'static,
{
fn register(&mut self, address_range: &Range<GuestAddr>) {
let pt = self.pt.as_mut().unwrap();
let mut filters = pt.ip_filters();
let range_inclusive =
RangeInclusive::new(address_range.start as usize, address_range.end as usize - 1);
filters.push(range_inclusive);
pt.set_ip_filters(&filters).unwrap()
}

fn allowed(&self, address: &GuestAddr) -> bool {
let pt = self.pt.as_ref().unwrap();
for f in pt.ip_filters() {
if f.contains(&(*address as usize)) {
return true;
}
}
false
}
}

pub fn intel_pt_new_thread<ET, I, S, T>(
emulator_modules: &mut EmulatorModules<ET, I, S>,
_state: Option<&mut S>,
_env: CPUArchStatePtr,
tid: u32,
) -> bool
where
I: Unpin,
S: HasMetadata + Unpin,
ET: EmulatorModuleTuple<I, S>,
T: Debug + 'static,
{
let intel_pt_module = emulator_modules
.modules_mut()
.match_first_type_mut::<IntelPTModule<T>>()
.unwrap();

if intel_pt_module.pt.is_some() {
panic!("Intel PT module already initialized, only single core VMs are supported ATM.");
}

let pt = intel_pt_module
.intel_pt_builder
.clone()
.pid(Some(tid as i32))
.build()
.unwrap();

intel_pt_module.pt = Some(pt);

true
}
3 changes: 2 additions & 1 deletion libafl_qemu/src/modules/systemmode/mod.rs
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@

#[cfg(feature = "intel_pt")]
pub mod intel_pt;
2 changes: 1 addition & 1 deletion scripts/parallellize_cargo_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"--exclude-features=prelude,python,sancov_pcguard_edges,arm,aarch64,i386,be,systemmode,whole_archive "
"--no-dev-deps --exclude libafl_libfuzzer --exclude libafl_qemu --exclude libafl_qemu_sys --print-command-list;"
"DOCS_RS=1 cargo hack check -p libafl_qemu -p libafl_qemu_sys --each-feature --clean-per-run "
"--exclude-features=prelude,python,sancov_pcguard_edges,arm,aarch64,i386,be,systemmode,whole_archive,slirp "
"--exclude-features=prelude,python,sancov_pcguard_edges,arm,aarch64,i386,be,systemmode,whole_archive,slirp,intel_pt,intel_pt_export_raw "
"--no-dev-deps --features usermode --print-command-list"
)

Expand Down
Loading