
lava v3.3.0
LAVA: Groß angelegte automatisierte Hinzufügung von Schwachstellen
LAVA: Automatisierte Schwachstelleneinfügung im großen Maßstab
Die Bewertung und Verbesserung von Werkzeugen zur Fehlersuche ist derzeit schwierig, da es an Ground-Truth-Korpora mangelt (d. h. Software mit bekannten Fehlern und auslösenden Eingaben). LAVA versucht, dieses Problem zu lösen, indem es automatisch Fehler in Software einfügt. Zu jedem LAVA-Fehler gehört eine Eingabe, die ihn auslöst, während normale Eingaben dies mit äußerst geringer Wahrscheinlichkeit tun. Diese Schwachstellen sind synthetisch, aber – so argumentieren wir – dennoch realistisch, in dem Sinne, dass sie tief in Programmen eingebettet sind und durch echte Eingaben ausgelöst werden. Unsere Arbeit bildet die Grundlage für einen Ansatz zur bedarfsgerechten Erzeugung großer Ground-Truth-Schwachstellenkorpora, der eine rigorose Bewertung von Werkzeugen ermöglicht und Werkzeugentwicklern ein hochwertiges Ziel bietet.
LAVA ist das Ergebnis einer Zusammenarbeit zwischen dem MIT Lincoln Laboratory, der NYU und der Northeastern University.
Schnellstart
Docker
Die neueste Version von LAVAs master-Branch wird automatisch als Docker-Image auf Basis von Ubuntu 22.04 gebaut und auf Docker Hub veröffentlicht. Die meisten Benutzer werden das lava-Container-Image verwenden wollen, in dem PANDA und LAVA zusammen mit ihren Laufzeitabhängigkeiten installiert sind, jedoch ohne Build-Artefakte oder Quellcode, um die Größe des Containers zu reduzieren.
Um das lava-Container-Image zu verwenden, können Sie es von Docker Hub pullen:
$ docker pull pandare/lava
Oder aus diesem Repository erstellen:
$ DOCKER_BUILDKIT=1 docker build -t pandare/lava:local .
Wenn Docker Engine direkt in WSL läuft und Build-Schritte nicht auf das
Netzwerk zugreifen können (zum Beispiel meldet APT Temporary failure resolving), versuchen Sie, das Host-Netzwerk von WSL für den Build zu verwenden:
DOCKER_BUILDKIT=1 docker build --network=host -t pandare/lava:local .
Dies gilt nur für Build-Schritte; später gestartete Container verwenden ihre eigenen Netzwerkeinstellungen.
Container-Arbeitsbereich
Verwenden Sie aus einem Arbeitsbereich, der target_bins/ und target_configs/ enthält, den
Launcher, um eine Shell zu öffnen oder einen Befehl auszuführen. Er bindet den Arbeitsbereich unter demselben
absoluten Pfad ein, sodass in host.json geschriebene Pfade zwischen den Läufen gültig bleiben.
Ersetzen Sie /path/to/lava durch den Checkout, der den Launcher enthält:
/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 läuft unter Ihrer UID/GID und speichert sein beschreibbares Home in
.lava-container-home/ innerhalb des Workspace. Wenn Ihr Host-~/.panda/ existiert,
bindet der Launcher es als PANDA-Cache des Containers ein, sodass vorhandene QCOWs und
Kernel-Dateien wiederverwendet werden. Downloads und Cache-Änderungen bleiben in diesem Host-
Verzeichnis erhalten. Verwenden Sie --panda-cache /path/to/cache, um einen anderen vorhandenen Cache auszuwählen.
Ohne einen Host-Cache speichert PANDA Downloads in .lava-container-home/.panda/.
Der Launcher verwendet
standardmäßig pandare/lava:latest; verwenden Sie --image pandare/lava:v3.3.4, um ein
Release auszuwählen, oder --image pandare/lava:local für den lokalen Build oben.
PostgreSQL muss bereits laufen. Exportieren Sie POSTGRES_USER und
POSTGRES_PASSWORD an den Datenbank-Endpunkt, der aus dem Container heraus erreichbar ist. Für eine Datenbank in einem Docker-Netzwerk übergeben Sie --network NETWORK und verwenden dessen Containernamen als host.
localhost innerhalb von Docker bezieht sich auf den LAVA-Container selbst. Nach der Konfiguration:
/path/to/lava/scripts/docker-shell.sh --network NETWORK -- lava -ak toy
-k löscht vorhandene Projektdaten ohne Bestätigung. Der Launcher ersetzt
die alte Oberfläche, bei der der Projektname an erster Stelle stand; Befehle folgen nun --.
HPC mit Apptainer / Singularity
Verwenden Sie auf einem zugewiesenen Compute-Node die vom Cluster bereitgestellte Laufzeitumgebung. Ziehen Sie ein versioniertes Image einmalig in den persistenten Speicher und verwenden Sie es anschließend für Jobs erneut:
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
Verwenden Sie --runtime singularity, wenn dies der installierte Befehl ist. Diese Runtimes
verwenden die Identität und das Netzwerk des Host-Benutzers; konfigurieren Sie host.json für einen erreichbaren
PostgreSQL-Dienst und exportieren Sie dieselben Anmeldedaten. Der Launcher startet weder
die Datenbank noch fordert er eine Scheduler-Zuweisung an. Führen Sie ihn innerhalb der
interaktiven Zuweisung Ihres Clusters oder in einem Batch-Skript aus. Dies belegt nicht, dass ein Release-
Image die vollständige Pipeline unterstützt; überprüfen Sie die Image-Installation und führen Sie ein
Testprojekt aus, bevor Sie einen großen Mining-Job einreichen.
Ubuntu, Debian
Lokale Installation
Auf einem System mit Ubuntu 22.04 sollten Sie einfach bash install.sh ausführen können.
Beachten Sie, dass dieses Installationsskript Pakete installiert und Änderungen an Ihrem System vornimmt.
Sie können die Binärdateien mit sudo apt-get remove lava entfernen.
Sobald Sie die Installation der Binärdatei abgeschlossen haben, können Sie lokal mit pip install . installieren.
HINWEIS: Das Python-Paket benötigt eine SQL-Datei, die durch Kompilieren der Binärdateien erzeugt und in python/src/pyroclastic/data/lava.sql abgelegt wird.
Ohne diese Datei funktioniert das Python-Paket nicht korrekt.
Reguläre Installation
Alternativ können Sie die Abhängigkeiten von LAVA manuell installieren und dann aus dem Quellcode bauen.
Laden Sie die Debian-Pakete aus den Releases herunter. Installieren Sie dann das Python-Paket mit pip install pyroclastic.
Abschließende Schritte
Verwendung von host.json
Führen Sie als Nächstes init-host aus, um eine host.json in Ihrem aktuellen Arbeitsverzeichnis zu erzeugen.
Diese Datei wird von LAVA verwendet, um Einstellungen zu speichern, die für
Ihre Maschine spezifisch sind. Sie können diese Einstellungen nach Bedarf bearbeiten, aber die Standard-
werte sollten funktionieren, siehe vars.py.
Einige Werte, die Sie beachten sollten, sind die folgenden:
- host ist der Name der Postgres-SQL-Datenbank mit allen LAVA-Bugs. Derzeit ist er standardmäßig auf
databasegesetzt, obwohl Sie ihn wahrscheinlich auflocalhoständern sollten, wenn Sie LAVA lokal installiert haben.
HINWEIS: Sie benötigen außerdem zwei Umgebungsvariablen für die Postgres-SQL-Datenbank:
POSTGRES_PASSDies ist das Passwort für den Postgres-SQL-Benutzer`POSTGRES_USERDies ist der Hostname für die Postgres-SQL-Datenbank
Projektkonfigurationen
Projektkonfigurationen befinden sich im Verzeichnis target_configs, wobei
jede Konfiguration unter target_configs/projectname/projectname.json liegt.
Pfade, die in diesen Konfigurationsdateien angegeben werden, sind relativ zu den Werten,
die in Ihrer host.json-Datei festgelegt sind.