ESSS เป็นเครื่องมือการวิเคราะห์แบบคงที่เพื่อตรวจสอบข้อผิดพลาดที่ขาดหายไปและไม่ถูกต้องในการตรวจสอบในรหัส C และ C ++ เครื่องมือจะหักข้อมูลจำเพาะข้อผิดพลาดโดยอัตโนมัติสำหรับฟังก์ชั่นโดยไม่จำเป็นต้องมีความรู้เบื้องต้นและจากนั้นจะพบตำแหน่งรหัสที่การตรวจสอบข้อผิดพลาดหายไปหรือไม่สอดคล้องกับข้อกำหนดเหล่านั้น
ที่เก็บนี้มีซอร์สโค้ด ESSS รวมถึงสคริปต์และข้อมูลเพื่อเรียกใช้เครื่องมือและ EESI บนมาตรฐานที่ใช้ในกระดาษ
การประเมินผลงาน VM มีเครื่องมือ ESSS แล้วและ LLVM Toolchain ที่สร้างไว้ล่วงหน้า รุ่น LLVM ที่ใช้คือ 14.0.6 เหตุผลที่เราดำเนินการสร้างตัวเองแทนที่จะเป็นเวอร์ชั่นที่จัดสรรไว้คือเพื่อให้แน่ใจว่าการทำซ้ำของผลลัพธ์ที่แน่นอนโดยไม่ต้องใช้แพตช์เฉพาะ distro-specific
เครื่องมือได้รับการสนับสนุนในการแจกแจง Linux ล่าสุด เรายืนยันว่ามันใช้งานได้อย่างแน่นอนบน Ubuntu 22.04 ไม่จำเป็นต้องใช้ข้อกำหนดฮาร์ดแวร์พิเศษในการเรียกใช้ ESSS แม้ว่าเราจะแนะนำ RAM อย่างน้อย 8 Gib แม้ว่าเครื่องมือจะทำงานได้น้อยลง แต่อาจใช้เวลามากถึง 2 GIB ของ RAM สำหรับเกณฑ์มาตรฐานที่ใหญ่ที่สุดโดยทิ้งหน่วยความจำไว้น้อยลงสำหรับกระบวนการอื่น ๆ
หากคุณต้องการสร้างเครื่องมือ ESSS ด้วยตนเองและ/หรือ LLVM Toolchain ให้ทำตามคำแนะนำเหล่านี้
การพึ่งพาต่อไปนี้จำเป็นต้องสร้างเครื่องมือ 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
เมื่อใช้เครื่องมือกับเกณฑ์มาตรฐานของคุณเองคุณจะต้องสร้างไฟล์ BitCode ก่อน ในการทำเช่นนั้นคุณควรใช้ WLLVM ทำตามคำแนะนำการติดตั้งในหน้า WLLVM README
นอกจากนี้เรายังพึ่งพา MUSL เพื่ออนุมานข้อกำหนดจาก LIBC แม้ว่าจะไม่จำเป็นอย่างยิ่งสำหรับเครื่องมือในการทำงาน แต่สิ่งนี้จะเพิ่มความแม่นยำของข้อกำหนดที่อนุมานได้ เวอร์ชันที่ใช้ในกระดาษคือ Musl 1.2.3 แต่รุ่นใด ๆ ควรใช้งานได้ นี่คือขั้นตอนในการสร้าง musl เป็นไฟล์ bitcode:
cd musl
mkdir prefix
export CC=wllvm
./configure --prefix= " $( realpath prefix ) "
make -j4
make install
extract-bc prefix/lib/libc.soในการรวบรวมโปรแกรมสำหรับใช้กับเครื่องมือของเราคุณควรทำตามคำแนะนำการสร้างของโปรแกรมดังกล่าว แต่ใช้ wllvm wrapper เป็นคอมไพเลอร์ ซึ่งจะส่งผลให้ไฟล์ BitCode ที่สามารถวิเคราะห์ได้ด้วยเครื่องมือของเรา เป็นการดีที่คุณผ่านไฟล์ bitcode ทั้งหมดแยกไปยังเครื่องมือของเราเนื่องจากการให้โปรแกรมทั้งหมดในครั้งเดียว (ซึ่งเป็นสิ่งที่เกิดขึ้นโดยค่าเริ่มต้นโดย Extract-BC) จะช้ากว่าการประมวลผลมากกว่าไฟล์แยกต่างหาก
เครื่องมือสามารถดำเนินการโดยตรงโดยดำเนินการ ./kanalyzer ภายใน /home/evaluation/ESSS/analyzer/build/lib อาร์กิวเมนต์เป็นพา ธ ไปยังไฟล์ BitCode เอาต์พุตถูกเขียนไปยัง 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 มีรหัสของ Toy ง่าย ๆ ใน 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 : สคริปต์นี้คำนวณความแม่นยำการเรียกคืนและคะแนน F1 ของเครื่องมือ ESSS สำหรับเกณฑ์มาตรฐานที่กำหนดcompute_eesi_stats.py : สคริปต์นี้คำนวณความแม่นยำการเรียกคืนและคะแนน F1 ของเครื่องมือ EESI สำหรับเกณฑ์มาตรฐานที่กำหนด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 สิ่งประดิษฐ์การประเมินนั้นมีให้เป็นภาพ VirtualBox VM บน Zenodo ในการสร้างภาพ VM เราเริ่มต้นจากการติดตั้ง Ubuntu 22.04 LTS (x86-64) จากนั้นเราสามารถใช้สคริปต์ที่ให้ไว้ใน vm/build-vm.sh เพื่อติดตั้งและตั้งค่าทุกอย่างที่จำเป็นสำหรับการประเมินผล
เครื่องมือนี้ใช้เครื่องมือ Crix จากมหาวิทยาลัยมินนิโซตา โดยเฉพาะอย่างยิ่งเรานำส่วนประกอบ MLTA ของ Crix กลับมาใช้ซ้ำ ESSS มีการแจกจ่ายภายใต้ใบอนุญาตเดียวกัน
ลิงก์ไปยังหน้าสิ่งพิมพ์ USENIX Paper: 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
}