• Proj THUDBFuzz Paper Reading: NyxNet: Network Fuzzing with Incremental Snapshots


    PDF

    https://arxiv.org/pdf/2111.03013.pdf

    Abstract

    1-2:背景:fuzz有用,但是测试网络服务还难
    3 本文: NYX-NET:基于snapshot的fuzzing方法
    特点:可fuzz的对象非常多,包括服务端、游戏、客户端、IPC服务
    效果:

    1. 在Mario上,提升10-30x速度
    2. 能在Lighttpd、MySQL、Firefox IPC上找到bug
    3. Mozilla上20000$的bug

    1. Intro

    P1: 介绍新进展;能够测试新的targets类型要比新的算法更加引人注目
    P2: 测新的targets一般有两种方法

    1. generating function-style + persistent mode
    2. snapshot
      挑战,尤其是信息传递非常频繁的:
    3. 状态多
    4. 复杂
    5. 运行速度慢
    6. 消息格式更加复杂
      P3: 以AFLNet为例
    7. 真的用网络连接是非常慢的
    8. 不知道何时服务能够接受testcase,因此需要等待相当长的时间
    9. 重用会带来一定噪声,比如background threads可能接收到testcase,这些进程可能随机影响到coverage和状态
      为此,需要用户来写脚本确认文件系统之类的变化,让其在每个testcase之后回滚

    P4: 本文:NYX-Net
    方法:

    1. hypervisor-based snapshot fuzzing 基于管理程序的快照模糊测试,用于确保并加速noise free fuzzing(无噪音的模糊测试)
    2. selective emulation of network 网络选择性仿真,以避免实际网络流量的沉重成本。

    P5:
    Nyx-Net基于Nyx,拓展为:

    1. 能够定位网络连接,添加对网络对战的处理只吃(handle the network stack)
    2. 引入增量、完整的虚拟机快照,该快照与操作系统无关,兼容任何POSIX系统(虽然只测了busybox和ubuntu,并且只是在docker container里面跑的)。这些快照允许模拟很多API,并且几乎没有速度损耗。当hook检测到目标程序准备接受fuzzer提供的输入的第一个字节时,就会触发whole system snapshot。

    P6:
    认为Nyx Net实际上可以模糊任何负责、有状态、基于信息的目标程序,例如IPC接口。比如Firefox就已经使用了NyxNet。

    P7:
    效果:

    1. 与AFLnet比,在ProfuzzBench上,吞吐量提高了300%,覆盖率提高了70%
    2. 与Agamotto比,快照重新加载和创建速度为10倍。
    3. 在ProfuzzBench上能够找到AFLnet、Agamotto没发现的新bug
    4. 与AFL+LJON比,能够解决大多数超级马里奥关卡,而且比IJON小果果更好。
    5. 能找到Lighttpd、MySQL、Firefox IPC上的bug

    P8:
    贡献:

    1. Nyx-Net
    2. 增量快照
    3. 实验、发现了多个现实错误

    2. Background

    2.1 Network Service Fuzzing

    P1: 网络服务的内存不安全问题;
    This puts such software at significant risk: Most of the complexity is part of some very public (often Internet-wide) attack surface.
    在不强制内存安全的语言中确保内存安全很困难
    例子: AFLNet: 允许AFL发送包
    改进:将socket-based I/O 操作改为 file-based I/O,这样就能直接将AFL++等软件应用在网络服务fuzz上。
    P2:
    挑战:

    1. AFL等假设目标程序快速,而且只spawn一个进程,这个进程会一直运行到处理完输入
      (但实际上程序执行可能很慢、可能spawn多个进程、主进程可能在初始化之后就退出了)
    2. AFL等假设两个执行基本独立(但对大多数网络服务来说,两个包并不独立)
    3. 对网络协议而言,很少考虑startup time, 链接持久化、重要状态
      P3: AFLnet强制用户编写需要重置环境的清理脚本,大大降低了测试速度。
      P4: custom mutator, 用户来写,非常有效,能够符合大多数结构化信息。
      例如AFL: mutator based on multiple rudimentary packet boundary parsers用于支持格式

    Nyx的仿射类型字节码

    P1:

    1. 用户指定一组opcodes,这些opcodes可以被Nyx be chained
    2. 作者当时仅仅用该工具对Hypervisor进行测试,但这个方法具有用来测试许多交互式目标程序的潜力
    3. 用户仅仅需要实现一组opcodes

    E.g:

    1. 通过给定的端口和网址来hook第一个建立的连接
    2. 通过agent将packet传给function calls,例如recv和read
    3. 当类似epoll或者select之类的函数希望获取更多数据时,agent提示准备完毕

    人工需要做的事情只有找到建立连接和发送包的这类c代码
    fuzzer会自动生成bytecode格式和自定义的VM,这个VM会调用对应handlers和自定义的mutator

  • 相关阅读:
    K8s学习笔记
    NETCore在Centos下的内存泄漏排查
    搭建Linux下GO的开发环境
    Docker 运行mysql8.0挂载数据卷
    一张图解释Docker
    NetCore基于Consul+Ocelot+Docker+Jenkin搭建微服务架构
    Jenkins+Docker+Git实现自动化部署
    使用阿里云容器镜像服务示例
    Go重新学习记录
    软谋在线教育诚招php,java,.net,设计师讲师(可兼职)
  • 原文地址:https://www.cnblogs.com/xuesu/p/15541406.html
Copyright © 2020-2023  润新知