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
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 # 退出容器
|
-
提交修改为新镜像:
1
2
|
docker commit temp-dafl dafl-with-deps
docker rm temp-dafl # 删除临时容器
|
-
后续使用新镜像运行实验:
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
|
运行状态解析
-
并行启动容器
- 脚本已启动 4 个 Docker 容器(
swftophp-4.8-2018-11225-iter-0到 iter-3),每个容器绑定到不同的 CPU 核心(--cpuset-cpus=0~3)。
-
执行 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)
|