SnapChange模糊测试工具

联合创作 · 2023-10-01 16:25

SnapChange 是 AWS 名为 Find & Fix 内部团队开发的一种模糊测试工具,网络安全研究人员可以使用它通过在 KVM 虚拟机中重放物理内存快照来发现漏洞。模糊测试通过监视系统在处理随机数据时的行为方式来发现软件安全问题。

Snapchange 提供了将原始内存转储和注册状态加载到 KVM 虚拟机 (VM) 中以供执行的能力。在执行过程中,可以通过重置 KVM 发现的脏页或模糊器手动弄脏的页面,将此 VM 重置为初始状态。

旨在:

  • 使用 KVM 重放物理内存和注册状态快照
  • 跨多核并行执行
  • 为 guest VM 提供一组内省功能
  • 通过断点覆盖实时覆盖状态
  • 模糊器组件的实时性能指标
  • 提供模糊测试实用程序,例如单步调试跟踪、测试用例最小化和测试用例覆盖
  • 输入抽象以允许自定义变异和生成策略

示例

从模糊器模板创建目标模糊器

$ cp -r -L fuzzer_template your_new_fuzzer

修改your_new_fuzzer/create_snapshot.sh以获取目标的快照

更新src/fuzzer.rs以将变异数据注入 guest VM

#[derive(Default)]
pub struct TemplateFuzzer;

impl Fuzzer for TemplateFuzzer {
    // The type of Input being fuzzed. Used to know how to generate and mutate useful inputs.
    type Input = Vec<u8>;
    // The starting address of the snapshot
    const START_ADDRESS: u64 = 0x402363;
    // The maximum length of mutated input to generate
    const MAX_INPUT_LENGTH: usize = 100;

    fn set_input(&mut self, input: &Self::Input, fuzzvm: &mut FuzzVm<Self>) -> Result<()> {
        // Write the mutated input into the data buffer in the guest VM
        fuzzvm.write_bytes_dirty(VirtAddr(0x402004), CR3, &input)?;
        Ok(())
    }

    fn reset_breakpoints(&self) -> Option<&[BreakpointLookup]> {
        Some(&[
            // Reset when the VM hits example1!main+0x123
            BreakpointLookup::SymbolOffset("example1!main", 0x123)
        ])
    }
}

开始使用 16 个内核进行模糊测试

$ cargo run -r -- fuzz -c 16
浏览 6
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报