Featured image of post DAFL Reproduce

DAFL Reproduce

DAFL实验复现

论文官网:DAFL: Directed Grey-box Fuzzing guided by Data Dependency | USENIX

实验代码:https://github.com/prosyslab/DAFL-artifact.git

2025.7.5-7.11

项目环境部署

仓库不大,拉取下来之后,试着配置环境,

  • Ubuntu 20.04
  • Docker
  • python 3.8+
  • pip3

在项目文件夹下,用docker命令拉取镜像

1
$ docker pull prosyslab/dafl-artifact

多次拉取失败,拉取请求超时,dockerhub ping不通,试着寻求解决办法。

尝试配置国内镜像加速器

1.编辑配置

1
sudo nano /etc/docker/daemon.json

把配置文件改成如下内容,添加了些国内镜像站

1
2
3
4
5
6
7
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

然后按 Ctrl + O保存文件,按 Enter确认文件名(默认就是 /etc/docker/daemon.json),再按 Ctrl + X退出编辑器。

2.重启Docker服务

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

验证配置是否生效

1
docker info | grep "Registry Mirrors" -A 2

3.再尝试拉取

1
2
3
choser@Demian:/mnt/d/DAFL_lab$ docker pull hello-world
Using default tag: latest
Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)

4.依旧失败,查看一下错误日志信息

1
2
3
$ journalctl -u docker --no-pager -n 20 | grep -i "mirror\|pull"
#结果如下
warning msg="Error getting v2 registry: Get \"https://docker.mirrors.ustc.edu.cn/v2/\": dial tcp: lookup docker.mirrors.ustc.edu.cn on 10.255.255.254:53: no such host"

报错说明,问题出在 DNS解析失败,Docker无法解析镜像站域名 docker.mirrors.ustc.edu.cn,导致回退到默认的 registry-1.docker.io也超时。

修复DNS解析问题

尝试修改Docker的DNS配置

编辑Docker配置文件,指定公共DNS(如Google的8.8.8.8或阿里云的223.5.5.5):

1
sudo nano /etc/docker/daemon.json

修改为以下内容(保留镜像站并添加DNS设置):

1
2
3
4
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"],
  "dns": ["8.8.8.8", "223.5.5.5"]
}

保存后重启Docker:

1
sudo systemctl restart docker

尝试拉取,依旧失败

后续使用网易镜像站(https://hub-mirror.c.163.com)依旧无法解析域名

尝试彻底修改 DNS

1
sudo nano /etc/systemd/resolved.conf

修改了以下内容:

1
2
3
4
[Resolve]
DNS=8.8.8.8 223.5.5.5
FallbackDNS=1.1.1.1
Domains=~.

保存后重启:

1
2
sudo systemctl restart systemd-resolved
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

依旧无法解析域名,拉取失败。

尝试完全绕过域名

既然域名解析有问题,就试着完全绕过域名(使用官方仓库 IP)。

在windows下查找 registry-1.docker.io的 IP:

1
2
nslookup registry-1.docker.io 8.8.8.8
得到198.44.185.131

linux下直接拉取:

1
docker pull 198.44.185.131/library/hello-world

依旧失败,因为直接使用 IP 会被 Docker 视为不安全仓库,需修改配置:

1
sudo nano /etc/docker/daemon.json

添加以下内容:

1
2
3
{
  "insecure-registries": ["198.44.185.131"]
}

保存后重启 Docker:

1
sudo systemctl restart docker

再次尝试拉取

1
2
docker pull 198.44.185.131/library/hello-world
docker run 198.44.185.131/library/hello-world  # 验证是否运行成功

依旧失败,无奈了。

尝试社区分享镜像站

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
docker pull docker.1ms.run/prosyslab/dafl-artifact #不行
docker pull docker.domys.cc/prosyslab/dafl-artifact #不行
docker pull docker.imgdb.de/prosyslab/dafl-artifact #不行
docker pull docker-0.unsee.tech/prosyslab/dafl-artifact  #可以
docker pull docker.hlmirror.com/prosyslab/dafl-artifact
docker pull cjie.eu.org/prosyslab/dafl-artifact
docker pull docker.m.daocloud.io/prosyslab/dafl-artifact
docker pull hub.rat.dev/prosyslab/dafl-artifact
docker pull docker.1panel.live/prosyslab/dafl-artifact
docker pull docker.rainbond.cc/prosyslab/dafl-artifact

在尝试了好几个镜像站后,终于拉取成功了,但是每次拉取了一个小时左右ubuntu会崩溃,反复很多次,报错信息只显示ubuntu异常关闭。

问题排查

内存问题?

wsl2和windows共享内存,内存显然足够。

查看错误日志

日志中未见 OOM Killer 记录:排除内存耗尽导致崩溃的可能性。

但是注意到

1
2
Jul 12 01:18:32 dockerd[229]: level=error "received unexpected HTTP status: 503 Service Unavailable"
Jul 12 01:18:49 dockerd[229]: level=error "tls: failed to verify certificate: x509: certificate is not valid"
  • 503 错误:镜像站服务不可用(可能是镜像站宕机或网络拦截)。
  • TLS 证书错误:尝试拉取镜像时因证书无效被拒绝(docker.domys.cc域名证书配置错误)。

7.13

尝试Windows下拉取再迁移

试着在Windows下拉取docker镜像再迁移到虚拟机上。

下载了docker desktop,自定义安装目录,避免塞爆系统盘。

然后发现docker desktop下载的镜像是包含在一个磁盘映像文件里的,没法直接迁移过来,失败。

拉取成功

再试了下直接拉取官网,这次居然成功了。

但是发现容器内并没有所有依赖,需要手动补充一些常见依赖。

在容器内修改后提交为新镜像

操作步骤(在宿主机执行)

  1. 启动临时容器并安装依赖

    这里挂载了宿主机的一些文件目录到容器中。

    1
    2
    3
    4
    5
    6
    
    docker run -it \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -v /usr/bin/docker:/usr/bin/docker \
      -v /mnt/d/DAFL_lab:/DAFL_lab \
      --name temp-dafl \
      prosyslab/dafl-artifact /bin/bash
    
    • 在容器内运行:

      1
      2
      3
      
      apt-get update && apt-get install -y python3-pip
      pip3 install pandas numpy matplotlib
      exit  # 退出容器
      
  2. 提交修改为新镜像

    1
    2
    
    docker commit temp-dafl dafl-with-deps
    docker rm temp-dafl  # 删除临时容器
    
  3. 后续使用新镜像运行实验

    1
    2
    3
    4
    5
    
    docker run -it \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -v /mnt/d/DAFL_lab:/DAFL_lab \
      dafl-with-deps \
      python3 /DAFL_lab/DAFL-artifact-main/scripts/reproduce.py run tbl2-minimal 86400 10
    

    需要注意的是,运行前要查看一下硬件配置,适当的调整一下参数

    1
    2
    
    MAX_INSTANCE_NUM = 4  # 建议值 ≤ CPU 核心数(宿主机有 20 核,可适当调高)
    MEM_PER_INSTANCE = 4  # 每个实例的内存(GB)
    

运行成功

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
root@Demian:/mnt/d/DAFL_lab# docker run -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /usr/bin/docker:/usr/bin/docker \
  -v /mnt/d/DAFL_lab:/DAFL_lab \
  dafl-with-deps \
  python3 /DAFL_lab/DAFL-artifact-main/scripts/reproduce.py run tbl2-minimal 86400 10
[*] Executing: nproc
[*] Executing: docker run --tmpfs /box:exec --rm -m=4g --cpuset-cpus=0 -it -d --name swftophp-4.8-2018-11225-iter-0 prosyslab/dafl-artifact
[*] Executing: docker run --tmpfs /box:exec --rm -m=4g --cpuset-cpus=1 -it -d --name swftophp-4.8-2018-11225-iter-1 prosyslab/dafl-artifact
[*] Executing: docker run --tmpfs /box:exec --rm -m=4g --cpuset-cpus=2 -it -d --name swftophp-4.8-2018-11225-iter-2 prosyslab/dafl-artifact
[*] Executing: docker run --tmpfs /box:exec --rm -m=4g --cpuset-cpus=3 -it -d --name swftophp-4.8-2018-11225-iter-3 prosyslab/dafl-artifact
[*] Executing '/tool-script/run_AFL.sh swftophp-4.8-2018-11225 "@@" file 86400' in container swftophp-4.8-2018-11225-iter-0
[*] Executing '/tool-script/run_AFL.sh swftophp-4.8-2018-11225 "@@" file 86400' in container swftophp-4.8-2018-11225-iter-1
[*] Executing '/tool-script/run_AFL.sh swftophp-4.8-2018-11225 "@@" file 86400' in container swftophp-4.8-2018-11225-iter-2
[*] Executing '/tool-script/run_AFL.sh swftophp-4.8-2018-11225 "@@" file 86400' in container swftophp-4.8-2018-11225-iter-3

运行状态解析

  1. 并行启动容器

    • 脚本已启动 4 个 Docker 容器(swftophp-4.8-2018-11225-iter-0iter-3),每个容器绑定到不同的 CPU 核心(--cpuset-cpus=0~3)。
  2. 执行 fuzzing 任务

    每个容器正在运行 AFL 模糊测试:

    1
    
    /tool-script/run_AFL.sh swftophp-4.8-2018-11225 "@@" file 86400
    
    • 目标程序: swftophp-4.8-2018-11225
    • 超时时间: 86400 秒(24 小时)
    • 并行度: 4 个实例(由 MAX_INSTANCE_NUM控制)
    • 时间预估
      • tbl2-minimal约需 4 天完成(10 次迭代 × 24 小时)。

如需中断实验

1
2
3
4
# 停止所有容器
docker stop $(docker ps -aq)
# 清理残留
docker rm $(docker ps -aq)
Licensed under CC BY-NC-SA 4.0
© 2023-2025 Ch0ser. All Rights Reserved.
使用 Hugo 构建
主题 StackJimmy 设计