ESSS es una herramienta de análisis estático para detectar las verificaciones de error faltantes e incorrectas en las bases de código C y C ++. La herramienta deduce automáticamente las especificaciones de error para las funciones, sin necesidad de conocimiento a priori, y luego encuentra ubicaciones de código donde las verificaciones de errores faltan o son inconsistentes con esas especificaciones.
Este repositorio contiene el código fuente ESS, así como los scripts y datos para ejecutar la herramienta y EESI en los puntos de referencia utilizados en el documento.
La VM de evaluación de artefactos ya contiene la herramienta ESSS y la cadena de herramientas LLVM pre-construida. La versión LLVM utilizada es 14.0.6. La razón por la que realizamos la construcción nosotros mismos en lugar de una versión proporcionada por la distribución es garantizar la reproducibilidad de los resultados exactos sin tener parches de distribución potencialmente específicos.
La herramienta es compatible con cualquier distribución reciente de Linux. Confirmamos que funciona seguro en Ubuntu 22.04. No se necesitan requisitos especiales de hardware para ejecutar ESS, aunque recomendamos al menos 8 GIB de RAM. A pesar de que la herramienta puede ejecutarse con menos, puede tomar hasta 2 GIB de RAM para el punto de referencia más grande, dejando menos memoria para otros procesos.
Si desea construir manualmente la herramienta ESS y/o la cadena de herramientas LLVM, siga estas instrucciones.
Se requieren las siguientes dependencias para construir la herramienta ESS:
$ 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 Esto construirá la herramienta Analyzer y colocará el binario en el directorio /home/evaluation/ESSS/analyzer/build/lib .
Al aplicar la herramienta a sus propios puntos de referencia, primero deberá generar los archivos de código de bits. Para hacerlo, debe usar WLLVM. Siga las instrucciones de instalación en la página WLLVM ReadMe.
Además, también confiamos en Musl para inferir especificaciones de LIBC. Si bien no es estrictamente necesario para que la herramienta funcione, esto aumentará la precisión de las especificaciones inferidas. La versión utilizada en el papel fue Musl 1.2.3, pero cualquier versión debería funcionar. Estos son los pasos para incorporar a Musl en un archivo de código de bits:
cd musl
mkdir prefix
export CC=wllvm
./configure --prefix= " $( realpath prefix ) "
make -j4
make install
extract-bc prefix/lib/libc.soPara compilar un programa para su uso con nuestra herramienta, debe seguir las instrucciones de compilación de dicho programa, pero use el envoltorio WLLVM como compilador. Esto dará como resultado archivos de código de bits que pueden ser analizados por nuestra herramienta. Idealmente, pasa todos los archivos de código de bits por separado a nuestra herramienta, ya que dar el programa completo a la vez (que es lo que sucede por defecto por Extract-BC) será más lento de procesar que los archivos separados.
La herramienta se puede ejecutar directamente ejecutando ./kanalyzer Inside /home/evaluation/ESSS/analyzer/build/lib . Los argumentos son las rutas a los archivos de BitCode. La salida se escribe en stdout. La herramienta también contiene algunos argumentos opcionales que se pueden enumerar utilizando la opción --help .
Para ejecutar la herramienta para inferir especificaciones y detectar errores en un programa, puede usar el siguiente comando:
./kanalyzer /path/to/mysl/libc.so.bc /path/to/bitcode1.bc /path/to/bitcode2.bc ...La salida se escribirá en Stdout, esto incluye las especificaciones inferidas y los errores.
La herramienta admite opciones de configuración que se pueden configurar utilizando argumentos de línea de comandos.
Las opciones de configuración más importantes son:
--missing-ct : el umbral para los cheques faltantes. Solo se informarán informes con un puntaje que es al menos este valor. El valor predeterminado es 0.725.--incorrect-ct : el umbral para especificaciones incorrectas. Solo se informarán informes con un puntaje que es al menos este valor. El valor predeterminado es 0.725.Otras opciones útiles incluyen:
--refine-vsa : Esto permite tomar la intersección entre el conjunto de valor de error y los posibles valores de retorno constantes de la función para aumentar la precisión de las especificaciones de error. El valor predeterminado es verdadero.--st : Análisis de asociación Confianza entre [0, 1]. Cuanto mayor, más segura debe ser la asociación. El valor predeterminado es 0.925.--interval-ct : umbral de confianza entre [0, 1]. Cuanto más altos, más similares deben ser los intervalos de error.-c <number> : establece el número de subprocesos en <number> . No probado a fondo para valores distintos a 1.También hay algunas opciones de depuración:
--print-random-non-void-function-samples <number> : cuántos nombres de funciones no Void aleatorios imprimir, útiles para las funciones de muestreo para calcular un recuerdo. El valor predeterminado es 0.--ssc : Imprime el error detectado verifica por separado. El valor predeterminado es falso. Proporcionamos un ejemplo mínimo en el directorio example . Hay un código de juguete simple en example/example.c que puede ejecutar a través del analizador usando el script example/build_and_run.sh . Al ejecutar, debe obtener la siguiente salida:
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]
El repositorio está estructurado de la siguiente manera. Los archivos adaptados de Crix están marcados como tales.
? 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]
En particular, la inferencia de especificaciones se implementa en ehblockdetector.cc y la detección de errores en ErrorCheckViolationFinder.cc.
Las instrucciones para ejecutar cada punto de referencia se proporcionan en el Directorio evaluation/benchmark-instructions . Para ejecutar uno de los puntos de referencia, ejecute el script correspondiente en el directorio evaluation (como se describe en la descripción general de la estructura del repositorio anterior).
compute_my_stats.py : este script calcula la puntuación de precisión, recuperación y F1 de la herramienta ESS para un punto de referencia dado.compute_eesi_stats.py : este script calcula la precisión, el recuerdo y la puntuación F1 de la herramienta EESI para un punto de referencia dado.run-eesi-<program>.sh : este script ejecuta la herramienta EESI en el punto de referencia dado.run-my-<program>.sh : este script ejecuta la herramienta ESSS en el punto de referencia dado. Para aliviar la evaluación, proporcionamos para cada punto de referencia un script de ejecución para ejecutar la herramienta. Estos se pueden encontrar en /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 El artefacto de evaluación se proporciona como una imagen VirtualBox VM en Zenodo. Para construir la imagen VM, comenzamos desde una instalación Ubuntu 22.04 LTS (x86-64). Luego podemos usar el script proporcionado en vm/build-vm.sh para instalar y configurar todo lo necesario para la evaluación.
Esta herramienta se basa en la herramienta Crix de la Universidad de Minnesota. En particular, reutilizamos el componente MLTA de Crix. ESSS se distribuye bajo la misma licencia.
Enlace a la página de publicación en papel de Usenix: https://www.usenix.org/conference/usenixsecurity24/presentation/dossche
Enlace a la publicación final PDF: https://www.usenix.org/system/files/usenixsecurity24-dossche.pdf
Enlace al artefacto final Apéndice PDF (disponible, funcional, insignias reproducidas): https://www.usenix.org/system/files/usenixsecurity24-appendix-dosche.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
}