
lava v3.3.0
LAVA: Adição Automatizada de Vulnerabilidades em Grande Escala
LAVA: Adição Automatizada de Vulnerabilidades em Larga Escala
Avaliar e melhorar ferramentas de descoberta de bugs é atualmente difícil devido à escassez de corpora de verdade fundamental (ou seja, software que possui bugs conhecidos com entradas que os acionam). O LAVA tenta resolver esse problema injetando bugs automaticamente no software. Todo bug do LAVA é acompanhado por uma entrada que o aciona, enquanto entradas normais são extremamente improváveis de fazê-lo. Essas vulnerabilidades são sintéticas, mas, argumentamos, ainda realistas, no sentido de que estão embutidas profundamente nos programas e são acionadas por entradas reais. Nosso trabalho forma a base de uma abordagem para gerar grandes corpora de verdade fundamental de vulnerabilidades sob demanda, permitindo avaliação rigorosa de ferramentas e fornecendo um alvo de alta qualidade para desenvolvedores de ferramentas.
O LAVA é o produto de uma colaboração entre o MIT Lincoln Laboratory, a NYU e a Northeastern University.
Início Rápido
Docker
A versão mais recente do branch master do LAVA é automaticamente compilada como imagens docker baseadas no Ubuntu 22.04 e publicada no Docker Hub. A maioria dos usuários vai querer usar o contêiner lava, que tem o PANDA e o LAVA instalados junto com suas dependências de execução, mas sem artefatos de compilação ou código-fonte para reduzir o tamanho do contêiner.
Para usar o contêiner lava, você pode baixá-lo do Docker Hub:
$ docker pull pandare/lava
Ou compile a partir deste repositório:
$ DOCKER_BUILDKIT=1 docker build -t pandare/lava:local .
Se o Docker Engine for executado diretamente dentro do WSL e as etapas de build não conseguirem acessar a rede (por exemplo, o APT reportar Temporary failure resolving), tente usar a rede do host do WSL para o build:
DOCKER_BUILDKIT=1 docker build --network=host -t pandare/lava:local .
Isso se aplica apenas às etapas de build; contêineres iniciados posteriormente usam suas próprias configurações de rede.
Workspace do contêiner
A partir de um workspace contendo target_bins/ e target_configs/, use o
launcher para abrir um shell ou executar um comando. Ele monta o workspace no mesmo
caminho absoluto para que os caminhos gravados em host.json permaneçam válidos entre execuções.
Substitua /path/to/lava pelo checkout que contém o launcher:
/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
O Docker é executado com o seu UID/GID e armazena o seu home gravável em
.lava-container-home/ dentro do workspace. Se o seu ~/.panda/ do host existir,
o launcher o monta como o cache do PANDA do contêiner, para que QCOWs e
arquivos de kernel existentes sejam reutilizados. Downloads e alterações de cache persistem nesse diretório do host. Use --panda-cache /path/to/cache para selecionar outro cache existente.
Sem um cache no host, o PANDA armazena os downloads em .lava-container-home/.panda/.
O launcher usa
pandare/lava:latest por padrão; use --image pandare/lava:v3.3.4 para selecionar uma
release, ou --image pandare/lava:local para a build local acima.
O PostgreSQL já deve estar em execução. Exporte POSTGRES_USER e
POSTGRES_PASSWORD, para o endpoint do banco de dados acessível de dentro do contêiner. Para um banco de dados em uma rede Docker, passe --network NETWORK e use o nome do contêiner como host.
localhost dentro do Docker refere-se ao próprio contêiner LAVA. Uma vez configurado:
/path/to/lava/scripts/docker-shell.sh --network NETWORK -- lava -ak toy
-k exclui os dados existentes do projeto sem confirmação. O launcher substitui
a antiga interface que priorizava o nome do projeto; os comandos agora seguem --.
HPC com Apptainer / Singularity
Em um nó de computação alocado, use o runtime fornecido pelo cluster. Baixe uma imagem versionada uma vez para o armazenamento persistente e depois reutilize-a para os jobs:
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 se esse for o comando instalado. Esses runtimes
usam a identidade e a rede do usuário host; configure host.json para um serviço
PostgreSQL acessível e exporte as mesmas credenciais. O launcher não inicia
o banco de dados nem solicita uma alocação de scheduler. Execute-o dentro da
alocação interativa do seu cluster ou script de lote. Isso não estabelece que uma imagem
de release suporte o pipeline completo; verifique a instalação da imagem e execute um
projeto de teste antes de submeter um grande job de mineração.
Ubuntu, Debian
Instalação local
Em um sistema executando Ubuntu 22.04, você deve conseguir simplesmente executar bash install.sh.
Observe que este script de instalação instalará pacotes e fará alterações no seu sistema.
Você pode remover os binários usando sudo apt-get remove lava.
Depois de concluir a instalação do binário, você pode instalar localmente executando pip install ..
NOTA que o pacote Python requer um arquivo SQL gerado a partir da compilação dos binários que é colocado em python/src/pyroclastic/data/lava.sql.
Sem esse arquivo, o pacote Python não funcionará corretamente.
Instalação regular
Alternativamente, você pode instalar manualmente as dependências do LAVA e então compilar a partir do código-fonte.
Baixe os pacotes Debian localizados nas releases. Em seguida, instale o pacote python pip install pyroclastic.
Etapas finais
Utilizando host.json
Em seguida, execute init-host para gerar um host.json no seu diretório de trabalho atual.
Este arquivo é usado pelo LAVA para armazenar configurações específicas
da sua máquina. Você pode editar essas configurações conforme necessário, mas os valores
padrão devem funcionar, veja vars.py.
Alguns valores a ter em mente são os seguintes:
- host é o nome do banco de dados Postgres SQL com todos os bugs do LAVA. Atualmente, ele tem como padrão
database, embora, se você instalou o LAVA localmente, provavelmente deve alterá-lo paralocalhost
NOTA: Você também precisa de duas variáveis de ambiente para o banco de dados Postgres SQL:
POSTGRES_PASSEsta é a senha para o usuário do Postgres SQL`POSTGRES_USEREste é o hostname para o banco de dados Postgres SQL
Configurações de projeto
As configurações de projeto estão localizadas no diretório target_configs, onde
cada configuração está localizada em target_configs/projectname/projectname.json.
Os caminhos especificados dentro desses arquivos de configuração são relativos aos valores definidos
no seu arquivo host.json.
Configurando o banco de dados postgres SQL
Como mencionado, você deve criar um usuário Postgres SQL. Você pode usar um script para usar as variáveis de ambiente para o seguinte:
- Criar o usuário com o nome de usuário e senha fornecidos a partir das variáveis de ambiente.
- Atualizar o banco de dados Postgres SQL no host para aceitar tráfego de fontes externas (por exemplo, contêiner Docker do LAVA)