
lava v3.3.0
LAVA: Adición Automatizada de Vulnerabilidades a Gran Escala
LAVA: Adición Automatizada de Vulnerabilidades a Gran Escala
Evaluar y mejorar las herramientas de búsqueda de errores es actualmente difícil debido a la escasez de corpus de referencia (es decir, software que tiene errores conocidos con entradas que los desencadenan). LAVA intenta resolver este problema inyectando errores automáticamente en el software. Cada error de LAVA está acompañado de una entrada que lo desencadena, mientras que es extremadamente improbable que las entradas normales lo hagan. Estas vulnerabilidades son sintéticas pero, sostenemos, aun así realistas, en el sentido de que están incrustadas profundamente dentro de los programas y son desencadenadas por entradas reales. Nuestro trabajo constituye la base de un enfoque para generar grandes corpus de referencia de vulnerabilidades bajo demanda, lo que permite una evaluación rigurosa de herramientas y proporciona un objetivo de alta calidad para los desarrolladores de herramientas.
LAVA es el producto de una colaboración entre MIT Lincoln Laboratory, NYU y Northeastern University.
Inicio Rápido
Docker
La última versión de la rama master de LAVA se compila automáticamente como imágenes de docker basadas en Ubuntu 22.04 y se publica en Docker Hub. La mayoría de los usuarios querrán usar el contenedor lava, que tiene PANDA y LAVA instalados junto con sus dependencias de tiempo de ejecución, pero sin artefactos de compilación ni código fuente para reducir el tamaño del contenedor.
Para usar el contenedor lava puedes extraerlo de Docker Hub:
$ docker pull pandare/lava
O compilar desde este repositorio:
$ DOCKER_BUILDKIT=1 docker build -t pandare/lava:local .
Si Docker Engine se ejecuta directamente dentro de WSL y los pasos de compilación no pueden acceder a la red (por ejemplo, APT informa Temporary failure resolving), intenta usar la red del host de WSL para la compilación:
DOCKER_BUILDKIT=1 docker build --network=host -t pandare/lava:local .
Esto se aplica únicamente a los pasos de compilación; los contenedores lanzados posteriormente utilizan su propia configuración de red.
Espacio de trabajo del contenedor
Desde un espacio de trabajo que contenga target_bins/ y target_configs/, utilice el lanzador para abrir un shell o ejecutar un comando. Monta el espacio de trabajo en la misma ruta absoluta para que las rutas escritas en host.json sigan siendo válidas entre ejecuciones. Reemplace /path/to/lava con el checkout que contiene el lanzador:
/path/to/lava/scripts/docker-shell.sh
/path/to/lava/scripts/docker-shell.sh -- lava-init
/path/to/lava/scripts/docker-shell.sh -- lava --help
Docker se ejecuta con tu UID/GID y almacena su home escribible en
.lava-container-home/ dentro del workspace. Si tu ~/.panda/ del host existe,
el lanzador lo monta como la caché de PANDA del contenedor para que los QCOW y
archivos de kernel existentes se reutilicen. Las descargas y los cambios en la caché persisten en ese
directorio del host. Usa --panda-cache /path/to/cache para seleccionar otra caché existente.
Sin una caché del host, PANDA almacena las descargas en .lava-container-home/.panda/.
El lanzador usa
pandare/lava:latest por defecto; usa --image pandare/lava:v3.3.4 para seleccionar una
versión, o --image pandare/lava:local para la compilación local anterior.
PostgreSQL ya debe estar en ejecución. Exporta POSTGRES_USER y
POSTGRES_PASSWORD, al endpoint de la base de datos accesible desde dentro del contenedor. Para una base de datos en una red Docker, pasa --network NETWORK y usa su nombre de contenedor como host.
localhost dentro de Docker se refiere al propio contenedor LAVA. Una vez configurado:
/path/to/lava/scripts/docker-shell.sh --network NETWORK -- lava -ak toy
-k elimina los datos existentes del proyecto sin confirmación. El lanzador reemplaza
la antigua interfaz que priorizaba el nombre del proyecto; ahora los comandos van después de --.
HPC con Apptainer / Singularity
En un nodo de cómputo asignado, utilice el runtime proporcionado por el clúster. Descargue una imagen versionada una vez en almacenamiento persistente y luego reutilícela para los trabajos:
apptainer pull /path/to/scratch/lava-v3.3.4.sif docker://pandare/lava:v3.3.4
/path/to/lava/scripts/docker-shell.sh --runtime apptainer \
--image /path/to/scratch/lava-v3.3.4.sif -- lava-init
/path/to/lava/scripts/docker-shell.sh --runtime apptainer \
--image /path/to/scratch/lava-v3.3.4.sif -- lava -tc toy
Use --runtime singularity si ese es el comando instalado. Estos runtimes
utilizan la identidad y la red del usuario del host; configure host.json para un servicio
PostgreSQL accesible y exporte las mismas credenciales. El lanzador ni inicia
la base de datos ni solicita una asignación del planificador. Ejecútelo dentro de la
asignación interactiva o el script por lotes de su clúster. Esto no establece que una imagen
de lanzamiento soporte el pipeline completo; verifique la instalación de la imagen y ejecute un
proyecto de prueba antes de enviar un trabajo de minería grande.
Ubuntu, Debian
Instalación local
En un sistema que ejecute Ubuntu 22.04, debería poder simplemente ejecutar bash install.sh.
Tenga en cuenta que este script de instalación instalará paquetes y realizará cambios en su sistema.
Puede eliminar los binarios usando sudo apt-get remove lava.
Una vez que termine de instalar el binario, puede instalarlo localmente ejecutando pip install ..
NOTA que el paquete de Python requiere un archivo SQL generado a partir de la compilación de los binarios que se coloca en python/src/pyroclastic/data/lava.sql.
Sin este archivo, el paquete de Python no funcionará correctamente.
Instalación normal
Alternativamente, puede instalar manualmente las dependencias de LAVA y luego compilar desde el código fuente.
Descargue los paquetes Debian ubicados en las releases. Luego instale el paquete de python pip install pyroclastic.
Pasos finales
Utilizar host.json
A continuación, ejecute init-host para generar un host.json en su directorio de trabajo actual.
LAVA utiliza este archivo para almacenar configuraciones específicas
de su máquina. Puede editar estas configuraciones según sea necesario, pero los valores
predeterminados deberían funcionar, consulte vars.py.
Algunos valores a tener en cuenta son los siguientes:
- host es el nombre de la base de datos Postgres SQL con todos los bugs de LAVA. Actualmente, su valor predeterminado es
database, aunque si instaló LAVA localmente, probablemente debería cambiarlo alocalhost
NOTA: También necesita dos variables de entorno para la base de datos Postgres SQL:
POSTGRES_PASSEsta es la contraseña para el usuario de Postgres SQL`POSTGRES_USEREste es el nombre de host para la base de datos Postgres SQL
Configuraciones de proyecto
Las configuraciones de proyecto se encuentran en el directorio target_configs, donde
cada configuración se encuentra en target_configs/projectname/projectname.json.
Las rutas especificadas dentro de estos archivos de configuración son relativas a los valores establecidos
en su archivo host.json.