
lava v3.3.0
LAVA: 大规模自动化漏洞添加
LAVA:大规模自动化漏洞注入
由于缺乏真实基准语料库(即带有已知缺陷及触发输入的软件),目前评估和改进缺陷查找工具十分困难。LAVA 试图通过自动向软件中注入缺陷来解决这一问题。每个 LAVA 缺陷都附带一个能够触发它的输入,而普通输入极不可能触发该缺陷。这些漏洞是合成的,但我们认为它们仍然是真实的,因为它们被深嵌于程序之中,并由真实输入触发。我们的工作构成了一种按需生成大规模真实基准漏洞语料库的方法的基础,从而能够进行严格的工具评估,并为工具开发者提供高质量的目标。
LAVA 是 MIT Lincoln Laboratory、NYU 和 Northeastern University 合作的成果。
快速开始
Docker
LAVA master 分支的最新版本会自动构建为基于 Ubuntu 22.04 的 Docker 镜像,并发布到 Docker Hub。大多数用户会希望使用 lava 容器,该容器安装了 PANDA 和 LAVA 及其运行时依赖,但不包含构建产物或源代码,以减小容器体积。
要使用 lava 容器,你可以从 Docker Hub 拉取它:
$ docker pull pandare/lava
或从此仓库构建:
$ DOCKER_BUILDKIT=1 docker build -t pandare/lava:local .
如果 Docker Engine 直接运行在 WSL 内部,且构建步骤无法访问网络(例如 APT 报告 Temporary failure resolving),请尝试为构建使用 WSL 的主机网络:
DOCKER_BUILDKIT=1 docker build --network=host -t pandare/lava:local .
这仅适用于构建步骤;之后启动的容器使用它们自己的网络设置。
容器工作区
在包含 target_bins/ 和 target_configs/ 的工作区中,使用启动器打开 shell 或运行命令。它会将工作区挂载到相同的绝对路径,因此写入 host.json 的路径在多次运行之间保持有效。将 /path/to/lava 替换为包含启动器的检出目录:
/path/to/lava/scripts/docker-shell.sh
/path/to/lava/scripts/docker-shell.sh -- lava-init
/path/to/lava/scripts/docker-shell.sh -- lava --help
Docker 以你的 UID/GID 运行,并将其可写主目录存储在
工作区内的 .lava-container-home/ 中。如果宿主机上的 ~/.panda/ 存在,
启动器会将其挂载为容器的 PANDA 缓存,从而复用现有的 QCOW 和
内核文件。下载内容和缓存变更会持久保存在该宿主机
目录中。使用 --panda-cache /path/to/cache 可选择另一个现有缓存。
如果没有宿主机缓存,PANDA 会将下载内容存储在 .lava-container-home/.panda/ 中。
启动器默认使用
pandare/lava:latest;使用 --image pandare/lava:v3.3.4 可选择
某个发布版本,或使用 --image pandare/lava:local 选择上述本地构建。
PostgreSQL 必须已在运行。导出 POSTGRES_USER 和
POSTGRES_PASSWORD,指向可从容器内部访问的数据库端点。对于位于 Docker 网络上的数据库,传入 --network NETWORK 并将其容器名称用作 host。
Docker 内的 localhost 指的是 LAVA 容器本身。配置完成后:
/path/to/lava/scripts/docker-shell.sh --network NETWORK -- lava -ak toy
-k 会不经确认删除现有项目数据。该启动器取代了旧的以项目名优先的界面;现在命令跟在 -- 之后。
使用 Apptainer / Singularity 的 HPC
在已分配的計算节点上,使用集群提供的运行时。将带版本号的镜像一次性拉取到持久存储中,然后为作业复用:
apptainer pull /path/to/scratch/lava-v3.3.4.sif docker://pandare/lava:v3.3.4
/path/to/lava/scripts/docker-shell.sh --runtime apptainer \
--image /path/to/scratch/lava-v3.3.4.sif -- lava-init
/path/to/lava/scripts/docker-shell.sh --runtime apptainer \
--image /path/to/scratch/lava-v3.3.4.sif -- lava -tc toy
如果已安装的命令是 --runtime singularity,请使用它。这些运行时使用宿主机用户的身份和网络;请为可访问的 PostgreSQL 服务配置 host.json,并导出相同的凭据。启动器既不会启动数据库,也不会请求调度器分配资源。请在你的集群交互式分配或批处理脚本中运行它。这并不能证明某个发布镜像支持完整的流水线;在提交大型挖掘任务之前,请先验证镜像安装并运行一个玩具项目。
Ubuntu、Debian
本地安装
在运行 Ubuntu 22.04 的系统上,你应该可以直接运行 bash install.sh。
请注意,这个安装脚本会安装软件包并对你的系统进行更改。
你可以使用 sudo apt-get remove lava 来移除这些二进制文件。
完成二进制文件安装后,你就可以通过运行 pip install . 进行本地安装。
注意,该 Python 包需要一个由编译二进制文件生成的 SQL 文件,该文件会被放置到 python/src/pyroclastic/data/lava.sql。
如果没有这个文件,Python 包将无法正常工作。
常规安装
或者,你可以手动安装 LAVA 的依赖项,然后从源码构建。
下载位于 releases 中的 Debian 软件包。然后安装 Python 包 pip install pyroclastic。
最后步骤
使用 host.json
接下来,运行 init-host 以在你当前工作目录中生成一个 host.json。
LAVA 使用此文件来存储特定于你机器的设置。你可以根据需要编辑这些设置,但默认值应该可以正常工作,参见 vars.py。
需要留意的几个值如下:
- host 是包含所有 LAVA bug 的 Postgres SQL 数据库的名称。目前,它默认为
database,不过如果你是在本地安装 LAVA,则很可能应将其改为localhost
注意:你还需要为 Postgres SQL 数据库设置两个环境变量:
POSTGRES_PASS这是 Postgres SQL 用户的密码`POSTGRES_USER这是 Postgres SQL 数据库的主机名
项目配置
项目配置位于 target_configs 目录中,每个配置位于 target_configs/projectname/projectname.json。
这些配置文件中指定的路径相对于你在 host.json 文件中设置的值。
设置 postgres SQL 数据库
如前所述,你应该创建一个 Postgres SQL 用户。你可以使用脚本利用环境变量来完成以下操作:
- 使用环境变量中提供的用户名和密码创建用户。
- 更新宿主机上的 Postgres SQL 数据库,以接受来自外部来源的流量(例如 LAVA Docker 容器)
用法
最后,你可以运行 lava 来实际向程序中注入 bug。
只需提供 target_configs 目录中的项目名称,例如:
lava -ak toy
你现在应该已经拥有了一份带有缺陷的 toy 副本!
如果你想向新的目标注入缺陷,你可能需要进行一些修改。请参阅 How-to-Lava 获取指导。
文档
请查看 docs 文件夹以开始使用。
作者
LAVA 是许多人多年开发的成果;以下是部分(按字母顺序排列的)贡献者名单:
- Andy Davis
- Brendan Dolan-Gavitt
- Andrew Fasano
- Zhenghao Hu
- Patrick Hulin
- Amy Jiang
- Engin Kirda
- Tim Leek
- Andrea Mambretti
- Andrew Quijano
- Wil Robertson
- Aaron Sedlacek
- Rahul Sridhar
- Frederick Ulrich
- Ryan Whelan