ESSS هي أداة تحليل ثابت للكشف عن اختلاف الخطأ المفقود وغير الصحيح في C ++ Codebases. تقوم الأداة تلقائيًا بخصوص مواصفات الخطأ للوظائف ، دون الحاجة إلى معرفة مسبقة ، ثم تجد مواقع التعليمات البرمجية حيث تكون فحوصات الأخطاء مفقودة أو غير متسقة مع تلك المواصفات.
يحتوي هذا المستودع على رمز مصدر ESSS ، وكذلك البرامج النصية والبيانات لتشغيل الأداة و EESI على المعايير المستخدمة في الورقة.
يحتوي تقييم Artifact VM بالفعل على أداة ESSS و LLVM Toolchain مسبقًا. إصدار LLVM المستخدم هو 14.0.6. السبب في قيامنا ببناء أنفسنا بدلاً من نسخة مقدمة من التوزيع هو ضمان استنساخ النتائج الدقيقة دون وجود تصحيحات خاصة بتوزيعات محتملة.
يتم دعم الأداة في أي توزيع Linux حديثًا. لقد أكدنا أنه يعمل بالتأكيد على Ubuntu 22.04. لا توجد متطلبات أجهزة خاصة ضرورية لتشغيل ESSS ، على الرغم من أننا نوصي بما لا يقل عن 8 gib من ذاكرة الوصول العشوائي. على الرغم من أن الأداة يمكن أن تعمل بأقل من ذلك ، إلا أنها قد تستغرق ما يصل إلى 2 GIB من ذاكرة الوصول العشوائي لأكبر معيار ، مما يترك ذاكرة أقل للعمليات الأخرى.
إذا كنت ترغب في إنشاء أداة 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 .
عند تطبيق الأداة على المعايير الخاصة بك ، ستحتاج إلى إنشاء ملفات 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) سيكون أبطأ في معالجة الملفات المنفصلة.
يمكن تنفيذ الأداة مباشرة عن /home/evaluation/ESSS/analyzer/build/lib تنفيذ ./kanalyzer الوسائط هي المسارات إلى ملفات 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 . هناك بعض رمز الألعاب البسيط في 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: https://www.usenix.org/conference/usenixsecurity24/presentation/dossche
رابط للنشر النهائي pdf: https://www.usenix.org/system/files/usenixsecurity24-dossche.pdf
رابط إلى التذييل Artifact النهائي (شارات متاحة ، وظيفية ، مستنسخة): 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
}