Como audito um executável para garantir que ele não seja malicioso?

10

Gostaria de saber se existe uma ferramenta ou técnica para executar um executável em um ambiente isolado, talvez em uma máquina virtual. Enquanto o programa estiver sendo executado, desejo poder auditar o aplicativo, ou seja, ver tudo o que o executável está fazendo (acesso a arquivos e rede).

Ao fazer isso, quero poder verificar se o executável é malicioso, ou seja, executa operações que não deveriam (leitura / gravação em arquivos, escuta / conexão às portas de rede, ...).

Eu não me importaria de algo com uma interface gráfica.

Ouss
fonte
2
@EliahKagan: Se eu entendi bem a pergunta, o OP pede "uma (ferramenta) onde eu possa ver tudo o que o executável está fazendo" - imagine se você pode executar sandbox somebinarye o sandboxprograma imaginário registraria todos os arquivos somebinarylidos ou gravados, todos IPs / portas conectados, dados transferidos etc. Isso seria útil, também gostaria de saber se existe algo assim (e, na verdade, sem essa ferramenta, observar um programa em execução em uma VM não faria sentido. não posso dizer o que faz lá de qualquer maneira). Boa pergunta.
Sergey
2
Pergunta relevante sobre UL.SE Perguntei antes: como monitorar arquivos abertos de um processo em tempo real? (não apenas sobre arquivos, também sobre rede) Lembre-se de que, depois que você vê isso acontecer, o dano já ocorreu.
precisa saber é
2
Fiz uma pergunta no meta sobre o fechamento desta pergunta: meta.askubuntu.com/questions/5871/… - Não acredito que deveria ter sido fechado.
Sergey

Respostas:

10

é uma ferramenta ou talvez uma máquina virtual para executar um executável dentro dela

Sim, isso é chamado de virtualização de aplicativos .

O LXC (Linux Containers) é uma ferramenta comumente usada para configurar isso. Ele permite que você configure uma rede completamente separada para esse aplicativo e o coloca em uma espécie de máquina virtual, como um chroot. Isso é principalmente para fins de segurança (uma "prisão"), não para auditoria.

Acho que está um pouco fora do escopo da pergunta explicar os contêineres completos do LXC e também como auditá-lo exatamente. Abaixo está um pouco sobre como começar, no entanto.

Enquanto o programa estiver em execução, quero poder ver tudo o que o executável está fazendo (acesso a arquivos e rede).

Isso pode ser feito usando stracee eu fiz a mesma pergunta no Unix e Linux:

Como respondido lá, tudo se resume a basicamente

strace -t -e trace=open,close,read,getdents,write,connect,accept command-here

Importante: quando você vê isso acontecendo, o dano já ocorreu.


Contêiner de aplicativo LXC

Deste artigo . Tudo se resume a:

  1. lxc-macvlan.conf arquivo de configuração:

    # example as found on /usr/share/doc/lxc/examples/lxc-macvlan.conf
    # Container with network virtualized using the macvlan device driver
    lxc.utsname = alpha
    lxc.network.type = macvlan
    lxc.network.flags = up
    lxc.network.link = eth0 # or eth2 or any of your NICs
    lxc.network.hwaddr = 4a:49:43:49:79:bd
    lxc.network.ipv4 = 0.0.0.0/24
    
  2. Inicie usando lxc-execute:

    sudo lxc-execute -n bash-test2 -f lxc-macvlan.conf /bin/bash
    

Observe que o LXC oferece o tipo de sistema e aplicativo de contêineres. Você está procurando por contêineres de aplicativos aqui.

gertvdijk
fonte
1
O LXC ainda não está pronto e atualmente não é seguro. Por exemplo, /sysnão é virtualizado e as alterações feitas /sysno contêiner são feitas /sysno host. Fazendo uma pesquisa rápida na Web, existem alguns artigos que documentam como "escapar" de um contêiner. O LXC será uma boa solução para o problema, mas atualmente não é, e não deve ser usado como uma ferramenta de segurança.
Andrea Corbellini
1
A propósito, a configuração de exemplo publicada não utiliza lxc.mountopções. Isso significa que o sistema de arquivos do usuário inteiro é acessível pela execução executável.
Andrea Corbellini
10

O que você está procurando é uma ferramenta que mostre como um programa interage com o sistema (mais especificamente, com o kernel). Os programas interagem com o sistema usando syscalls. Exemplos de syscalls são:

  • open - usado para abrir um arquivo;
  • reade write- usado para ler / gravar de / para um descritor de arquivo;
  • connect - usado para conectar um soquete a um par;
  • muitos, muitos outros (veja man syscalls).

O ponto é: syscalls podem ser rastreados usando ptrace(2). Então, basicamente, você está procurando ferramentas construídas ptrace. Uma dessas ferramentas é strace(1), que é um aplicativo de terminal que assume um comando como argumento e gera:

  • o sistema chama o programa está chamando;
  • os argumentos usados ​​para fazer os syscalls;
  • o resultado dos syscalls.

A saída é do tipo C. Aqui está um exemplo:

$ strace cat test
execve("/bin/cat", ["cat", "test"], [/* 55 vars */]) = 0
/* ... */
open("test", O_RDONLY)                 = 3
/* ... */
read(3, "hello\n", 32768)               = 6
write(1, "hello\n", 6)                  = 6
read(3, "", 32768)                      = 0
/* ... */

Lá você vê que cat testestá abrindo um arquivo chamado test, lendo seu conteúdo ( hello) e colocando-o na saída padrão.

stracepode produzir muita saída, portanto, leia sua página de manual ( man strace), especialmente a documentação da -esaída que permitirá ver apenas os syscalls nos quais você está interessado.

Infelizmente, não conheço alternativas gráficas ou fáceis de usar. Se você deseja procurá-los, ptracedeve ser uma das suas palavras-chave de pesquisa.


Sobre o isolamento, existem muitas tecnologias por aí. Chroots, contêineres Linux (atualmente em desenvolvimento e incompletos), virtualização de software e paravirtualização são os mais utilizados. No entanto, este é um tópico muito grande para discutir. Sugiro que você abra uma nova pergunta se desejar obter mais detalhes.

Andrea Corbellini
fonte
5

Dê uma olhada no AppArmor . Você pode adicionar um perfil limitado para um executável e colocá-lo no modo "reclamar", onde as ações serão permitidas, mas registradas, o que acho que atende aos seus requisitos.

Mas observe que isso não é realmente suficiente. Um binário malicioso inteligente pode ser capaz de detectar que está sob observação e não executar ações maliciosas, exceto quando não está sendo observado.

O AppArmor vai além disso e permite que um aplicativo seja restringido para sempre apenas às operações aprovadas. Os aplicativos que terminam no Centro de Software Ubuntu são fornecidos com perfis do AppArmor.

Robie Basak
fonte
5

Como você identificou, uma máquina virtual seria melhor para fornecer isolamento, principalmente se você tiver motivos para acreditar que um executável é malicioso em primeiro lugar. Mas mesmo isso não é perfeito, já que as vulnerabilidades na plataforma de virtualização (hardware e software) podem ser exploradas por códigos maliciosos para ocorrer. Aqui está um exemplo de uma vulnerabilidade de virtualização do mundo real: http://www.kb.cert.org/vuls/id/649219

Robie Basak
fonte
1

Você pode criar um snap .

Os snaps são "confinados ao sistema operacional e outros aplicativos por meio de mecanismos de segurança, mas podem trocar conteúdo e funções com outros snaps de acordo com políticas refinadas controladas pelo usuário e pelos padrões do sistema operacional". (em http://snapcraft.io/docs/snaps/intro )

Eles fornecem um isolamento adicional além do AppArmor, por exemplo, usando o seccomp também.

Além disso, um snap pode ser independente para facilitar a distribuição e atualizações atômicas em seu sistema.

Robie Basak
fonte
0

Obrigado, as respostas foram muito úteis ...

Também encontrei o seguinte: https://downloads.cuckoosandbox.org/docs/

O que é uma ferramenta muito interessante para analisar malware enquanto ele fica em uma VM

Ouss
fonte