
lava v3.3.0
LAVA: 대규모 자동 취약점 추가
LAVA: 대규모 자동 취약점 주입
버그 탐지 도구를 평가하고 개선하는 일은 현재 정답(ground truth) 코퍼스, 즉 트리거 입력이 알려진 버그를 가진 소프트웨어가 부족하기 때문에 어렵습니다. LAVA는 소프트웨어에 버그를 자동으로 주입하여 이 문제를 해결하고자 합니다. 모든 LAVA 버그에는 이를 트리거하는 입력이 함께 제공되며, 일반적인 입력이 이를 트리거할 가능성은 극히 낮습니다. 이러한 취약점은 합성된 것이지만, 프로그램 깊숙이 내장되어 있고 실제 입력에 의해 트리거된다는 점에서 여전히 현실적이라고 주장합니다. 우리의 연구는 대규모 정답 취약점 코퍼스를 필요에 따라 생성하는 접근법의 기초를 이루며, 엄격한 도구 평가를 가능하게 하고 도구 개발자에게 고품질의 목표를 제공합니다.
LAVA는 MIT Lincoln Laboratory, NYU, Northeastern University 간의 협력의 산물입니다.
빠른 시작
Docker
LAVA의 master 브랜치 최신 버전은 Ubuntu 22.04를 기반으로 하는 도커 이미지로 자동 빌드되어 Docker Hub에 게시됩니다. 대부분의 사용자는 PANDA와 LAVA가 런타임 종속성과 함께 설치되어 있지만 컨테이너 크기를 줄이기 위해 빌드 산출물이나 소스 코드는 포함하지 않은 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/가 포함된 작업 공간에서 런처를 사용하여 셸을 열거나 명령을 실행합니다. 런처는 작업 공간을 동일한 절대 경로에 마운트하므로 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 패키지는 바이너리 컴파일로 생성되어 python/src/pyroclastic/data/lava.sql에 배치되는 SQL 파일을 필요로 합니다.
이 파일이 없으면 Python 패키지가 올바르게 작동하지 않습니다.
일반 설치
또는 LAVA의 종속성을 수동으로 설치한 다음 소스에서 빌드할 수 있습니다.
releases에 있는 Debian 패키지를 다운로드하십시오. 그런 다음 Python 패키지 pip install pyroclastic을 설치하십시오.
최종 단계
host.json 활용
다음으로, 현재 작업 디렉터리에 host.json을 생성하기 위해 init-host를 실행하십시오.
이 파일은 LAVA가 머신에 특정한 설정을 저장하는 데 사용됩니다.
필요에 따라 이러한 설정을 편집할 수 있지만, 기본값이
작동해야 합니다. vars.py를 참조하십시오.
기억해야 할 몇 가지 값은 다음과 같습니다:
- host는 모든 LAVA 버그가 있는 Postgres SQL 데이터베이스의 이름입니다. 현재 기본값은
database이지만, LAVA를 로컬에 설치한 경우에는 이를localhost로 변경해야 할 가능성이 높습니다.
참고: Postgres SQL 데이터베이스를 위해 두 개의 환경 변수도 필요합니다:
POSTGRES_PASSPostgres SQL 사용자의 비밀번호입니다`POSTGRES_USERPostgres SQL 데이터베이스의 호스트 이름입니다
프로젝트 구성
프로젝트 구성은 target_configs 디렉터리에 있으며,
모든 구성은 target_configs/projectname/projectname.json에 위치합니다.
이 구성 파일 내에 지정된 경로는 host.json 파일에 설정된 값을 기준으로 한 상대 경로입니다.
postgres SQL 데이터베이스 설정
앞서 언급했듯이, Postgres SQL 사용자를 생성해야 합니다. 다음 작업을 위해 환경 변수를 사용하는 스크립트를 사용할 수 있습니다:
- 환경 변수에서 제공된 사용자 이름과 비밀번호로 사용자를 생성합니다.
- 호스트의 Postgres SQL 데이터베이스가 외부 소스(예: LAVA Docker 컨테이너)로부터의 트래픽을 수락하도록 업데이트합니다.
사용법
마지막으로, lava를 실행하여 실제로 프로그램에 버그를 주입할 수 있습니다.
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