web-dev-qa-db-fra.com

Comment puis-je auditer un exécutable pour m'assurer qu'il n'est pas malveillant?

Je me demandais s'il existait un outil ou une technique pour exécuter un exécutable dans un environnement isolé, peut-être une machine virtuelle. Pendant que le programme est en cours d’exécution, je souhaite pouvoir auditer l’application, c’est-à-dire tout voir ce que l’exécutable est en train de faire (accès aux fichiers et au réseau).

Ce faisant, je veux pouvoir vérifier si le fichier exécutable est malveillant, c’est-à-dire effectuer des opérations qu’il ne devrait pas (lecture/écriture dans des fichiers, écoute/connexion à des ports réseau, ...).

Cela ne me dérangerait pas d'avoir une interface graphique.

10
Ouss

Ce que vous recherchez est un outil qui montre comment un programme interagit avec le système (plus précisément avec le noyau). Les programmes interagissent avec le système à l'aide d'appels système. Des exemples d'appels système sont:

  • open - utilisé pour ouvrir un fichier;
  • read et write - utilisés pour lire/écrire à partir de/dans un descripteur de fichier;
  • connect - utilisé pour connecter un socket à un homologue;
  • beaucoup, beaucoup d'autres (voir man syscalls).

Le fait est que: les appels système peuvent être suivis en utilisant ptrace(2). Donc, fondamentalement, vous recherchez des outils construits autour de ptrace. Un de ces outils est strace(1), qui est une application de terminal qui prend une commande en tant qu'argument et génère:

  • le système appelle le programme appelle;
  • les arguments utilisés pour faire les appels système;
  • le résultat des appels système.

La sortie est en mode C. Voici un exemple:

$ 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
/* ... */

Vous voyez que cat test ouvre un fichier nommé test, lit son contenu (hello) et le place sur la sortie standard.

strace peut produire beaucoup de résultats, assurez-vous donc de lire sa page de manuel (man strace), en particulier la documentation de la sortie -e qui vous permettra de voir uniquement les appels système qui vous intéressent.

Malheureusement, je n'ai pas connaissance d'alternatives graphiques ou faciles à utiliser. Si vous souhaitez les rechercher, ptrace devrait être l'un de vos mots clés.


À propos de l'isolement, il existe de nombreuses technologies. Les chroots, les conteneurs Linux (en cours de développement et incomplets), la virtualisation et la paravirtualisation de logiciels sont les plus utilisés. Cependant, c'est un sujet beaucoup trop vaste pour être discuté. Je suggère d’ouvrir une nouvelle question si vous souhaitez avoir plus de détails.

10
Andrea Corbellini

est un outil ou peut-être une machine virtuelle pour exécuter un exécutable à l'intérieur

Oui, cela s'appelle Application virtualization .

LXC (Conteneurs Linux) est un outil couramment utilisé pour configurer cela. Il vous permet de configurer un réseau complètement séparé pour cette application et de le "mettre en sandbox" dans une sorte de machine virtuelle, un peu comme un chroot. Ceci est principalement pour des raisons de sécurité (une "prison"), pas vraiment pour l'audit.

Je pense que c’est un peu en dehors du cadre de la question d’expliquer les conteneurs LXC complets et de savoir comment les auditer exactement. Vous trouverez ci-dessous un aperçu de la procédure à suivre.

Pendant que le programme est en cours d'exécution, je veux pouvoir voir tout ce que l'exécutable est en train de faire (accès aux fichiers et au réseau).

Ceci peut être accompli en utilisant strace et j'ai posé la même question sous Unix et Linux:

Comme répond là-bas, cela revient essentiellement à

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

Important: une fois que cela se produit, les dégâts sont déjà causés.


LXC conteneur d'application

De cet article . Cela revient à:

  1. lxc-macvlan.conf fichier de configuration:

    # 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. Lancez-le en utilisant lxc-execute:

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

Notez que LXC propose des conteneurs de type système et application. Vous recherchez des conteneurs d'application ici.

10
gertvdijk

Jetez un coup d'œil à AppArmor . Vous pouvez ajouter un profil limité à un exécutable et le mettre en mode "plainte", où les actions seront autorisées mais journalisées, ce qui, à mon avis, répond à vos besoins.

Mais notez que cela ne suffit pas vraiment. Un binaire malveillant malin peut détecter qu'il est sous observation et ne pas effectuer d'actions malveillantes sauf s'il n'est pas observé.

AppArmor va plus loin que cela et permet à une application d'être toujours restreinte aux seules opérations approuvées. Les applications qui se retrouvent dans le Centre du logiciel Ubunt sont livrées avec des profils AppArmor.

5
Robie Basak

Comme vous l'avez indiqué, une machine virtuelle serait préférable pour assurer l'isolation, en particulier si vous avez des raisons de croire qu'un fichier exécutable est malveillant. Mais même ceci n’est pas parfait, car les vulnérabilités de la plate-forme de virtualisation (à la fois matérielle et logicielle) peuvent être exploitées par un code malveillant afin de se faire connaître. Voici un exemple de vulnérabilité de la virtualisation dans le monde réel: http://www.kb.cert.org/vuls/id/649219

5
Robie Basak

Vous pouvez créer un snap .

Les clichés sont "limités au système d'exploitation et à d'autres applications par des mécanismes de sécurité, mais ils peuvent échanger du contenu et des fonctions avec d'autres clichés conformément à des règles précises contrôlées par l'utilisateur et par défaut du système d'exploitation". (de http://snapcraft.io/docs/snaps/intro )

Ceux-ci fournissent une isolation supplémentaire en plus d'AppArmor, par exemple en utilisant également seccomp .

En outre, une capture peut être autonome pour une distribution facile et des mises à jour atomiques sur votre système.

1
Robie Basak

Merci, les réponses ont été très utiles ...

J'ai aussi trouvé ceci: https://downloads.cuckoosandbox.org/docs/

Ce qui est un outil très intéressant pour analyser les logiciels malveillants dans une machine virtuelle

0
Ouss