ESSS - это статический инструмент анализа для обнаружения пропущенных и неправильных проверок ошибок в кодовых базах C и C ++. Инструмент автоматически вычитает спецификации ошибок для функций, не требуя априорных знаний, а затем находит местоположения кода, где проверки ошибок либо отсутствуют, либо несовместимы с этими спецификациями.
Этот репозиторий содержит исходный код ESSS, а также сценарии и данные для запуска инструмента и EESI на критериях, используемых в статье.
Виртуальная машина Artifact Excaluation уже содержит инструмент ESSS и предварительно построенный LLVM Toolchain. Используемая версия LLVM составляет 14.0.6. Причина, по которой мы выполняем сборку сами, а не экологически чистые версии, заключается в обеспечении воспроизводимости точных результатов, не имея потенциально введенных дистрибольных пятен.
Инструмент поддерживается на любом недавнем распределении Linux. Мы подтвердили, что это работает наверняка на Ubuntu 22.04. Для запуска ESS не требуется специальных требований к аппаратному обеспечению, хотя мы рекомендуем как минимум 8 Gib of RAM. Несмотря на то, что инструмент может работать с меньшим количеством, он может занять до 2 Gib of 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 Directory.
Применив инструмент к собственным критериям, вам нужно сначала сгенерировать файлы биткодов. Для этого вы должны использовать WLLVM. Следуйте инструкциям по установке на странице wllvm readme.
Кроме того, мы также полагаемся на мусульман, чтобы вывести спецификации из LIBC. Хотя это не необходимо для работы инструмента, это повысит точность предполагаемых спецификаций. Версия, используемая в газете, была Musl 1.2.3, но любая версия должна работать. Это шаги по превращению MUSL в файл биткодов:
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 Inside /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 : Этот скрипт вычисляет точность, отзыв и оценку 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 на Zenodo. Чтобы построить изображение виртуальной машины, мы начали с установки Ubuntu 22.04 LTS (x86-64). Затем мы можем использовать сценарий, предоставленный в vm/build-vm.sh для установки и настройки всего, что необходимо для оценки.
Этот инструмент основан на инструменте CRIX из Университета Миннесоты. В частности, мы повторно используем компонент MLTA CRIX. ESSS распространяется по одной и той же лицензии.
Ссылка на страницу публикации Paper Usenix: https://www.usenix.org/conference/usenixsecurity24/presentation/dossche
Ссылка на окончательную публикацию PDF: https://www.usenix.org/system/files/usenixsecurity24-dossche.pdf
Ссылка на финальный приложение Artifact 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
}