ESSS는 C 및 C ++ 코드베이스에서 누락 및 잘못된 오류 검사를 감지하는 정적 분석 도구입니다. 이 도구는 선험적 지식이 필요하지 않고 함수의 오류 사양을 자동으로 추론 한 다음 오류 검사가 해당 사양과 일치하지 않는 코드 위치를 찾습니다.
이 저장소에는 ESS 소스 코드와 용지에 사용 된 벤치 마크에서 도구 및 EESI를 실행하는 스크립트 및 데이터가 포함되어 있습니다.
Artifact Evaluation VM에는 이미 ESSS 도구와 LLVM 도구 체인이 사전 제작 된 LLVM 도구 체인이 포함되어 있습니다. 사용 된 LLVM 버전은 14.0.6입니다. 배포판으로 제공되는 버전이 아닌 우리가 빌드를 수행하는 이유는 잠재적으로 상호화하는 배포판-특이 적 패치를 사용하지 않고 정확한 결과의 재현성을 보장하기 때문입니다.
이 도구는 최근의 Linux 배포에서 지원됩니다. 우리는 그것이 우분투 22.04에서 확실히 작동한다는 것을 확인했습니다. ESS를 실행하려면 특별한 하드웨어 요구 사항이 필요하지 않지만 적어도 8 개의 gib의 RAM을 권장합니다. 도구는 적은 상태로 실행될 수 있지만 가장 큰 벤치 마크에는 최대 2 개의 RAM이 필요할 수있어 다른 프로세스에 대한 메모리가 줄어 듭니다.
ESSS 도구 및/또는 LLVM 도구 체인을 수동으로 구축하려면 다음 지침을 따르십시오.
ESSS 도구를 구축하려면 다음의 종속성이 필요합니다.
$ cd /home/evaluation/ESSS/llvm
$ mkdir llvm-project
$ cd llvm-project
$ wget https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/clang-14.0.6.src.tar.xz
$ wget https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/llvm-14.0.6.src.tar.xz
$ tar xf llvm-14.0.6.src.tar.xz
$ tar xf clang-14.0.6.src.tar.xz
$ mv clang-14.0.6.src clang
$ mv llvm-14.0.6.src llvm
$ cd ..
$ ./build-llvm.sh$ cd /home/evaluation/ESSS/analyzer
$ make 이렇게하면 분석기 도구를 구축하고 바이너리를 /home/evaluation/ESSS/analyzer/build/lib 디렉토리에 배치합니다.
도구를 자신의 벤치 마크에 적용 할 때는 먼저 비트 코드 파일을 생성해야합니다. 그렇게하려면 WLLVM을 사용해야합니다. WLLVM README 페이지의 설치 지침을 따르십시오.
또한, 우리는 LIBC의 사양을 추론하기 위해 무슬림에 의존합니다. 도구가 작동하기 위해서는 엄격하게 필요하지는 않지만 유추 된 사양의 정밀도가 높아집니다. 이 논문에 사용 된 버전은 무슬림 1.2.3이지만 모든 버전은 작동해야합니다. 이것들은 비트 코드 파일로 무슬림을 만드는 단계입니다.
cd musl
mkdir prefix
export CC=wllvm
./configure --prefix= " $( realpath prefix ) "
make -j4
make install
extract-bc prefix/lib/libc.so도구와 함께 사용할 프로그램을 컴파일하려면 상기 프로그램의 빌드 지침을 따라야하지만 WLLVM 래퍼를 컴파일러로 사용해야합니다. 이로 인해 도구에서 분석 할 수있는 비트 코드 파일이 발생합니다. 이상적으로는 전체 비트 코드 파일을 도구에 별도로 전달합니다. 전체 프로그램을 한 번에 한 번에 제공 (Extract-BC로 기본적으로 발생하는)는 별도의 파일보다 처리가 느리게 진행되므로.
이 도구는 ./kanalyzer 내부 /home/evaluation/ESSS/analyzer/build/lib 실행하여 직접 실행할 수 있습니다. 인수는 비트 코드 파일의 경로입니다. 출력은 stdout에 기록됩니다. 이 도구에는 --help 옵션을 사용하여 나열 할 수있는 몇 가지 옵션 인수가 포함되어 있습니다.
프로그램에서 사양을 추론하고 버그를 감지하기위한 도구를 실행하려면 다음 명령을 사용할 수 있습니다.
./kanalyzer /path/to/mysl/libc.so.bc /path/to/bitcode1.bc /path/to/bitcode2.bc ...출력은 STDOUT에 기록되며 여기에는 추론 된 사양과 버그가 포함됩니다.
이 도구는 명령 줄 인수를 사용하여 설정할 수있는 구성 옵션을 지원합니다.
가장 중요한 구성 옵션은 다음과 같습니다.
--missing-ct : 누락 된 점검의 임계 값. 최소한이 값 인 점수가있는 보고서 만보고됩니다. 기본값은 0.725입니다.--incorrect-ct : 잘못된 사양의 임계 값. 최소한이 값 인 점수가있는 보고서 만보고됩니다. 기본값은 0.725입니다.다른 유용한 옵션은 다음과 같습니다.
--refine-vsa : 오류 값 세트와 함수의 가능한 상수 리턴 값 사이의 교차점을 사용하여 오류 사양의 정밀도를 높일 수 있습니다. 기본값은 참으로.--st : [0, 1] 사이의 연관 분석 신뢰도. 더 높을수록 협회가 더 확신해야합니다. 기본값은 0.925입니다.--interval-ct : [0, 1] 사이의 신뢰 임계 값. 오류 간격이 더 높아야합니다.-c <number> : 스레드 수를 <number> 로 설정합니다. 1 이외의 값에 대해 철저히 테스트되지 않았습니다.몇 가지 디버깅 옵션도 있습니다.
--print-random-non-void-function-samples <number> : 인쇄 할 임의의 비 전반 기능 이름 수는 샘플링 함수에 유용합니다. 기본값은 0까지.--ssc : 감지 된 오류가 별도로 체크 아웃을 인쇄합니다. 기본값으로 거짓. example 디렉토리에 최소한의 예제를 제공합니다. example/example.c 에는 example/build_and_run.sh 스크립트를 사용하여 분석기를 실행할 수있는 간단한 장난감 코드가 있습니다. 달리면 다음과 같은 출력을 가져와야합니다.
Function error return intervals (3, pre-libc-pruning 3):
Function: func {return index 0}
[0, 0]
Function: generate_error {return index 0}
[-2147483648, -1] U [1, 2147483647]
Function: malloc {return index 0}
[0, 0]
저장소는 다음과 같이 구성됩니다. CRIX에서 조정 된 파일은 그대로 표시됩니다.
? ESSS
│ ├── ? analyzer [the ESSS tool source code]
│ │ │ ├── ? Makefile [adapted from Crix]
│ │ │ └── ? src
│ │ │ │ ├── ? ...
│ │ │ │ └── ? src
│ │ │ │ │ ├── ? Analyzer.{cc, h} [Entry point of the application, adapted from Crix]
│ │ │ │ │ ├── ? CallGraph.{cc, h} [MLTA component from Crix]
│ │ │ │ │ ├── ? ClOptForward.h [Forward declarations of command line options]
│ │ │ │ │ ├── ? Common.{cc, h} [Common utility functions, adapted from Crix]
│ │ │ │ │ ├── ? DataFlowAnalysis.{cc, h} [Dataflow analysis helpers]
│ │ │ │ │ ├── ? DebugHelpers.{cc, h} [Debugging helpers]
│ │ │ │ │ ├── ? EHBlockDetector.{cc, h} [Specification inference component]
│ │ │ │ │ ├── ? ErrorCheckViolationFinder.{cc, h} [Bug detection component]
│ │ │ │ │ ├── ? FunctionErrorReturnIntervals.{cc, h} [Data structure file]
│ │ │ │ │ ├── ? FunctionVSA.{cc, h} [Value set analysis of return values component]
│ │ │ │ │ ├── ? Helpers.{cc, h} [Common utility functions]
│ │ │ │ │ ├── ? Interval.{cc, h} [Interval data structure]
│ │ │ │ │ ├── ? Lazy.h [Lazy execution utility class]
│ │ │ │ │ ├── ? MLTA.{cc, h} [MLTA component from Crix]
│ │ │ │ │ └── ? PathSpan.h [Data structure to store (parts of) paths]
│ └── ? evaluation [Scripts and data to run the tool on the benchmarks]
│ │ ├── ? benchmark-instructions [Instructions to compile each benchmark into bitcode files]
│ │ ├── ? ...
│ │ ├── ? eesi-<program>-output [Our EESI output for <program>]
│ │ ├── ? eesi-<program>-precision [Random sample from EESI's output for <program> for precision calculation]
│ │ ├── ? run-eesi-<program>.sh [Runs EESI for <program> (e.g. openssl)]
│ │ ├── ? my-<program>-output [Our ESSS output for <program>]
│ │ ├── ? run-my-<program>.sh [Runs ESSS for <program> (e.g. openssl)]
│ │ ├── ? <program>-bugs [Bug categorisations for <program> (e.g. openssl)]
│ │ ├── ? <program>-recall-sample [Random sample from error-returning functions in <program> for recall calculation]
│ │ ├── ? <program>-precision-ground-truth [Ground truth for precision evaluation for ESSS]
│ │ ├── ? <program>-random-functions-for-precision-my-tool [Random sample from ESSS's output for <program> for precision calculation]
│ │ ├── ? compute_my_stats.py [Computes stats for ESSS for a program]
│ │ └── ? compute_eesi_stats.py [Computes stats for EESI for a program]
특히, 사양 추론은 ehblockdetector.cc에서 구현되고 ErrorCheckViolationFinder.cc에서 버그 감지.
각 벤치 마크를 실행하기위한 지침은 evaluation/benchmark-instructions 디렉토리에 제공됩니다. 벤치 마크 중 하나를 실행하려면 evaluation 디렉토리에서 해당 스크립트를 실행하십시오 (위의 저장소 구조 개요에 설명 된 바와 같이).
compute_my_stats.py :이 스크립트는 주어진 벤치 마크에 대한 ESSS 도구의 정밀, 리콜 및 F1 점수를 계산합니다.compute_eesi_stats.py :이 스크립트는 주어진 벤치 마크에 대해 EESI 도구의 정밀, 리콜 및 F1 점수를 계산합니다.run-eesi-<program>.sh :이 스크립트는 주어진 벤치 마크에서 EESI 도구를 실행합니다.run-my-<program>.sh :이 스크립트는 주어진 벤치 마크에서 ESSS 도구를 실행합니다. 평가를 용이하게하기 위해 각 벤치 마크에 도구를 실행하기 위해 실행 스크립트를 제공했습니다. 이들은 /home/evaluation/ESSS/evaluation 에서 찾을 수 있습니다.
run-my-openssl.shrun-my-openssh.shrun-my-php.shrun-my-zlib.shrun-my-libpng.shrun-my-freetype.shrun-my-libwebp.sh 평가 아티팩트는 Zenodo의 VirtualBox VM 이미지로 제공됩니다. VM 이미지를 만들기 위해 Ubuntu 22.04 LTS (x86-64) 설치에서 시작했습니다. 그런 다음 vm/build-vm.sh 에서 제공된 스크립트를 사용하여 평가에 필요한 모든 것을 설치하고 설정할 수 있습니다.
이 도구는 미네소타 대학교의 CRIX 도구를 기반으로합니다. 특히, 우리는 CRIX의 MLTA 구성 요소를 재사용합니다. ESS는 동일한 라이센스로 배포됩니다.
Usenix 논문 출판 페이지 링크 : https://www.usenix.org/conference/usenixsecurity24/presentation/dossche
최종 간행물 PDF : https://www.usenix.org/system/files/usenixsecurity24-dossche.pdf 링크
최종 아티팩트 부록 PDF (사용 가능, 기능적, 재현 된 배지)에 대한 링크 : https://www.usenix.org/system/files/usenixsecurity24-appendix-dossche.pdf
@inproceedings {dossche2024inferenceoferrorspecifications,
author = {Niels Dossche and Bart Coppens},
title = {Inference of Error Specifications and Bug Detection Using Structural Similarities},
booktitle = {33rd USENIX Security Symposium (USENIX Security 24)},
year = {2024},
isbn = {978-1-939133-44-1},
address = {Philadelphia, PA},
pages = {1885--1902},
url = {https://www.usenix.org/conference/usenixsecurity24/presentation/dossche},
publisher = {USENIX Association},
month = aug
}