
lava v3.3.0
LAVA: 大規模自動脆弱性追加
LAVA: 大規模自動脆弱性注入
バグ発見ツールの評価と改善は、現状では困難です。その理由は、正解データとなるコーパス(すなわち、既知のバグとそれを誘発する入力を持つソフトウェア)が不足していることにあります。LAVA は、ソフトウェアにバグを自動的に注入することでこの問題の解決を試みます。LAVA のすべてのバグには、それを誘発する入力が付随しており、通常の入力ではそれを誘発することは極めて稀です。これらの脆弱性は合成されたものですが、プログラムの深部に埋め込まれ、実際の入力によって誘発されるという意味で、依然として現実的であると私たちは主張します。私たちの研究は、大規模な正解データ脆弱性コーパスをオンデマンドで生成するアプローチの基盤を成し、厳密なツール評価を可能にし、ツール開発者に高品質なターゲットを提供します。
LAVA は、MIT Lincoln Laboratory、NYU、Northeastern University の協力による成果です。
クイックスタート
Docker
LAVA の master ブランチの最新バージョンは、Ubuntu 22.04 をベースとした Docker イメージとして自動的にビルドされ、Docker Hub に公開されます。ほとんどのユーザーは、PANDA と LAVA がランタイム依存関係とともにインストールされた lava コンテナを使用したいと考えるでしょう。ただし、コンテナのサイズを削減するため、ビルド成果物やソースコードは含まれていません。
lava コンテナを使用するには、Docker Hub からプルできます:
$ docker pull pandare/lava
このリポジトリからビルドする場合:
$ DOCKER_BUILDKIT=1 docker build -t pandare/lava:local .
Docker Engine が WSL 内で直接実行されており、ビルド手順がネットワークにアクセスできない場合(たとえば APT が Temporary failure resolving を報告する場合)、ビルドに WSL のホストネットワークを使用してみてください:
DOCKER_BUILDKIT=1 docker build --network=host -t pandare/lava:local .
これはビルドステップにのみ適用されます。後から起動されるコンテナは独自のネットワーク設定を使用します。
コンテナワークスペース
target_bins/ と target_configs/ を含むワークスペースから、ランチャーを使用してシェルを開くかコマンドを実行します。ワークスペースは同じ絶対パスにマウントされるため、host.json に書き込まれたパスは実行間で有効なままです。/path/to/lava をランチャーを含むチェックアウトに置き換えてください:
/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 はあなたの UID/GID で実行され、書き込み可能なホームをワークスペース内の
.lava-container-home/ に保存します。ホストの ~/.panda/ が存在する場合、
ランチャーはそれをコンテナの PANDA キャッシュとしてマウントするため、既存の QCOW と
カーネルファイルが再利用されます。ダウンロードとキャッシュの変更はそのホスト
ディレクトリに永続化されます。別の既存キャッシュを選択するには --panda-cache /path/to/cache を使用してください。
ホストキャッシュがない場合、PANDA はダウンロードを .lava-container-home/.panda/ に保存します。
ランチャーはデフォルトで
pandare/lava:latest を使用します。リリースを選択するには --image pandare/lava:v3.3.4 を、上記のローカルビルドには --image pandare/lava:local を使用してください。
PostgreSQL はすでに実行されている必要があります。コンテナ内から到達可能なデータベースエンドポイントに対して POSTGRES_USER と
POSTGRES_PASSWORD をエクスポートしてください。Docker ネットワーク上のデータベースの場合、--network NETWORK を渡し、そのコンテナ名を host として使用します。
Docker 内の localhost は LAVA コンテナ自体を指します。設定が完了したら:
/path/to/lava/scripts/docker-shell.sh --network NETWORK -- lava -ak toy
-k は既存のプロジェクトデータを確認なしで削除します。このランチャーは
従来のプロジェクト名優先のインターフェースを置き換えるもので、コマンドは -- に続く形になりました。
Apptainer / Singularity による HPC
割り当てられた計算ノード上で、クラスタが提供するランタイムを使用します。バージョン付きの イメージを一度永続ストレージにプルし、その後ジョブで再利用します:
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
インストールされているコマンドがそれである場合は、--runtime singularity を使用してください。これらのランタイムはホストユーザーの ID とネットワークを使用します。到達可能な PostgreSQL サービス用に host.json を設定し、同じ認証情報をエクスポートしてください。ランチャーはデータベースを起動せず、スケジューラの割り当ても要求しません。クラスタのインタラクティブ割り当てまたはバッチスクリプト内で実行してください。これはリリースイメージが完全なパイプラインをサポートすることを証明するものではありません。大規模なマイニングジョブを投入する前に、イメージのインストールを検証し、トイプロジェクトを実行してください。
Ubuntu、Debian
ローカルインストール
Ubuntu 22.04 が動作しているシステムでは、bash install.sh を実行するだけで済むはずです。
このインストールスクリプトはパッケージをインストールし、システムに変更を加えることに注意してください。
バイナリは sudo apt-get remove lava で削除できます。
バイナリのインストールが完了したら、pip install . を実行してローカルにインストールできます。
注意: Python パッケージは、バイナリをコンパイルして生成された SQL ファイルが python/src/pyroclastic/data/lava.sql に配置されていることを必要とします。
このファイルがないと、Python パッケージは正しく動作しません。
通常のインストール
あるいは、LAVA の依存関係を手動でインストールしてから、ソースからビルドすることもできます。
releases にある Debian パッケージをダウンロードしてください。その後、Python パッケージを pip install pyroclastic でインストールします。
最終ステップ
host.json の利用
次に、init-host を実行して、現在の作業ディレクトリに host.json を生成します。
このファイルは LAVA がマシン固有の設定を保存するために使用されます。必要に応じてこれらの設定を編集できますが、デフォルト値で動作するはずです。vars.py を参照してください。
覚えておくべき値は以下のとおりです:
- host は、すべての LAVA バグを含む Postgres SQL データベースの名前です。現在は
databaseがデフォルトですが、LAVA をローカルにインストールした場合は、これをlocalhostに変更する必要があるでしょう
注意: Postgres SQL データベース用に 2 つの環境変数も必要です:
POSTGRES_PASSこれは Postgres SQL ユーザーのパスワードですPOSTGRES_USERこれは Postgres SQL データベースのホスト名です
プロジェクト設定
プロジェクト設定は target_configs ディレクトリにあり、各設定は target_configs/projectname/projectname.json に配置されています。
これらの設定ファイル内で指定されるパスは、host.json ファイルで設定された値に対して相対的です。
postgres SQL データベースのセットアップ
前述のとおり、Postgres SQL ユーザーを作成する必要があります。スクリプトを使用して環境変数を利用し、以下を実行できます:
- 環境変数から提供されたユーザー名とパスワードでユーザーを作成する。
- ホスト上の Postgres SQL データベースを更新して、外部ソース (例: LAVA Docker コンテナ) からのトラフィックを受け入れる。
使用方法
最後に、lava を実行して実際にプログラムにバグを注入できます。
target_configs ディレクトリにあるプロジェクトの名前を指定するだけです。例えば:
lava -ak toy
これで、バグ入りの toy のコピーが手元にあるはずです!
新しいターゲットにバグを注入したい場合は、いくつか変更を加える必要があるでしょう。手順については How-to-Lava を参照してください。
ドキュメント
まずは docs フォルダを確認してください。
作者
LAVA は長年にわたり多くの人々によって開発されてきた成果です。貢献者の一部(アルファベット順)を以下に示します:
- Andy Davis
- Brendan Dolan-Gavitt
- Andrew Fasano
- Zhenghao Hu
- Patrick Hulin
- Amy Jiang
- Engin Kirda
- Tim Leek
- Andrea Mambretti
- Andrew Quijano
- Wil Robertson
- Aaron Sedlacek
- Rahul Sridhar
- Frederick Ulrich
- Ryan Whelan