Virus Bénéfiques
Pratique

Michel Dubois
myshell.dubois@neuf.fr
http://vaccin.sourceforge.net


Nous venons de détailler les critères permettant de différencier un virus bénéfique d'un virus nocif. Nous allons maintenant nous attacher à mettre en oeuvre un virus bénéfique. L'objectif de ce développement est de fournir un outil d'aide à l'administration réseau basé sur les technologies virales.

1  Objectifs et code

Le scénario retenu est le suivant. Le système d'information d'une entreprise X s'appuie sur un réseau d'ordinateurs sous GNU/Linux. L'administrateur du réseau souhaite mettre en place un système flexible de suivi de l'ensemble des ordinateurs. Pour cela, il décide d'utiliser les technologies virales et installe le ver bénéfique Vaccin sur son réseau.

1.1  Diagramme fonctionnel




Figure 1: Diagramme fonctionnel de Vaccin



Le mode de fonctionnement de Vaccin s'articule selon le diagramme de la figure 1.

Tout d'abord, Vaccin contrôle son niveau d'accès au système. S'il est exécuté par un autre utilisateur que root, il s'arrête. Le test suivant permet à Vaccin de déterminer à partir de quel ordinateur il est lancé. Soit le ver est exécuté à partir de l'ordinateur de l'administrateur réseau et dans ce cas il lance ses routines de colonisation, soit il est exécuté sur un autre ordinateur et dans ce cas il lance ses routines de collecte de données.

1.1.1  Colonisation

La routine de colonisation de Vaccin commence par un scan du réseau. Celui-ci consiste, à partir de l'adresse IP du poste de l'administrateur et du masque réseau, à déterminer la plage d'adresses IP des ordinateurs. Ensuite, une requête est envoyée à chacune de ces adresses sur le port SSH, cette routine permet de définir une liste des ordinateurs effectivements connectés au réseau et faisant tourner un serveur SSH.

Une fois la liste des ordinateurs connectés au réseau construite, Vaccin la parcourt et établit une connexion SSH avec chacune des machines dont l'adresse IP y est référencée. Ensuite, le ver se recopie sur les ordinateurs et s'y exécute.

1.1.2  Collecte de données

Lorsque Vaccin est lancé sur un ordinateur du réseau autre que celui de l'administrateur, il commence par vérifier qu'il y est autorisé. Si c'est le cas, il télécharge sur le poste de l'administrateur un fichier de commandes qu'il exécute ensuite et il renvoie le résultat sur l'ordinateur de l'aministrateur sous forme de fichier texte. Si Vaccin n'est pas autorisé à s'exécuter il s'efface automatiquement de l'ordinateur concerné.

1.2  Le code

1.2.1  Remarques préliminaires

Vaccin est un ver écrit en langage C.

Afin de clarifier le code, les routines de gestion des erreurs n'ont pas été implémentées. Par conséquent, en cas d'erreur d'ouverture d'une socket, d'un fichier ou encore d'exécution d'une commande system le programme s'arrête sans afficher de message.

#define SOURCE_HOST_IP "192.168.184.1" #define MASK_NETWORK "255.255.255.0" #define CONTROL_FILE "/root/datav" #define COMMAND_FILE "/root/commandes.sh" #define VER_FILE "/root/vaccin"
Les variables définies par Vaccin

Pour pouvoir fonctionner, Vaccin définit cinq variables (voir Code 1.2.1). SOURCE _HOST _IP et MASK _NETWORK définissent respectivement l'adresse IP de l'ordinateur de l'administrateur et le masque réseau utilisé. Enfin, CONTROL_FILE, COMMAND_FILE et VER_FILE définissent respectivement le nom complet du fichier de contrôle, le nom complet du fichier de commandes et le nom complet du fichier dans lequel Vaccin sera copié lors de sa colonisation.

1.2.2  La fonction main

Comme tout programme écrit en C, Vaccin commence par exécuter la procédure main.

openlog("vaccin", LOG_PID, LOG_USER); ... syslog(LOG_NOTICE, "## Lancement de vaccin par root.\n"); ... closelog();
Initialisation, écriture et fermeture des opérations syslog

Vaccin est un ver il se doit donc d'être le plus possible furtif. C'est pour cette raison qu'il n'affiche aucun message sur la console par le biais de stdout ou de stderr. Cependant, l'administrateur, qui l'utilise, doit pouvoir suivre son fonctionnement, c'est pourquoi les messages d'état de Vaccin sont transmis au système par le biais du démon syslogd. La procédure main débute donc par l'ouverture d'une session syslog (voir Code 1.2.2) avec la commande openlog(). Tout au long de son exécution les messages sont envoyés au démon syslogd par la commande syslog(). Cette dernière prend comme premier argument une constante qui permet de définir l'urgence du message. Les deux niveaux d'urgences utilisés par Vaccin sont présentés dans la figure 2. Enfin, Vaccin se termine par la cloture de la session syslog grâce à la commande closelog().

Nom Signification
LOG_NOTICE Information importante, mais fonctionnement normal.
LOG_CRIT Des conditions critiques se présentent, pouvant nécessiter une intervention.


Figure 2: Les deux niveaux d'alertes de Vaccin



Une fois la session syslog initialisée, Vaccin appel la fonction isRoot(). Celle-ci permet de déterminer que c'est bien l'utilisateur root qui a lancé le programme. En cas de réponse négative, Vaccin s'arrête et envoi un message de niveau critique au démon syslogd. Dans le cas contraire, Vaccin appel la fonction isSourceHost(). Cette dernière détermine l'adresse IP de l'ordinateur sur lequel le ver s'exécute. S'il s'agit de l'ordinateur de l'administrateur, Vaccin crée la liste des machines connectées au réseau grâce à la fonction scanNetwork() et les colonise en appellant la fonction colonise(). Si, au contraire l'adresse IP correspond a une machine du réseau, Vaccin lance la fonction isAutorise() pour déterminer s'il est, oui ou non autorisé à s'exécuter sur son hôte. En cas de réponse positive, le ver exécute la fonction recupInfos() et en cas de réponse négative Vaccin s'efface du système en exécutant la fonction effaceVaccin().

1.2.3  La fonction isRoot

int isRoot() { int result; if( ( getuid() != 0 ) || ( geteuid() != 0 ) ) result = 0; else result = 1; return(result); }
La fonction isRoot

La fonction isRoot() utilise les fonctions système uid_t getuid (void) et uid_t geteuid (void) pour identifier l'utilisateur qui exécute le ver. Si l'UID réel ou effectif de l'utilisateur est différent de zéro, isRoot() retourne O sinon elle retourne 1.

1.2.4  La fonction isSourceHost

À partir des IOCTLs, la fonction isSourceHost construit la liste des interfaces réseaux disponibles sur l'ordinateur hôte. Cette liste est ensuite parcourut et l'adresse IP de chaque interface est comparée à celle de l'ordinateur de l'administrateur définit dans SOURCE_HOST_IP. S'il y a correspondance, le ver tourne sur l'ordinateur de l'administrateur et isSourceHost renvoie 1. Dans le cas contraire, le ver tourne sur l'une des machines du réseau et isSourceHost renvoie 0.

1.2.5  La fonction scanNetwork

inet_aton(MASK_NETWORK, &mask); inet_aton("255.255.255.255", &broadcast); nbrComputer = ntohl(broadcast.s_addr ^ mask.s_addr);
La routine de calcul du nombre d'ordinateurs adressables

La fonction scanNetwork exécute deux opérations. Tout d'abord (voir Code 1.2.5) elle détermine, à partir du masque réseau définit dans MASK_NETWORK, la plage d'adresse des ordinateurs du réseau. De cette information scanNetwork déduit le nombre de machines adressables et initialise la variable nbrComputer.

for (i = 1; i < nbrComputer ; i++) { hostIP.s_addr = htonl(ntohl( hostMask ) + i); if( strcmp( inet_ntoa( hostIP ), SOURCE_HOST_IP ) == 0) continue; /* l'ordinateur de l'administrateur n'entre pas dans la liste */ bzero(&sockHostIP, sizeof(sockHostIP)); sock = socket(AF_INET, SOCK_STREAM, 0); sockHostIP.sin_family = AF_INET; sockHostIP.sin_port = htons (22); sockHostIP.sin_addr=hostIP; if ( connect (sock, (struct sockaddr *)&sockHostIP, sizeof(sockHostIP)) == 0) { resultIP = (struct in_addr *) realloc( resultIP, (compteur+1) * sizeof(struct in_addr)); resultIP[compteur] = hostIP; compteur++; } syslog(LOG_NOTICE, "## %s\n", inet_ntoa(hostIP)); }
La routine de scan du réseau

La deuxième opération réalisée par scanNetwork (voir Code 1.2.5) consiste à effectuer une tentative de connexion sur l'ensemble de la plage d'adresses IP précédemment déterminée, en utilisant le port SSH (port numéro 22). Cette routine permet de construire une liste des ordinateurs connectés au réseau et ayant un serveur SSH fonctionnel.

1.2.6  La fonction colonise

/* Copie du ver sur l'ordinateur distant */ syslog(LOG_NOTICE, "## copie du ver sur %s.\n", inet_ntoa(adresse)); sprintf(commande, "/usr/bin/scp %s %s:%s", nom, destinataire, VER_FILE ); system( commande ); /* Rajout d'une ligne dans la crontab */ syslog(LOG_NOTICE, "## configuration du lancement automatique pour %s.\n", inet_ntoa(adresse)); sprintf(commande, "/usr/bin/ssh %s \"echo 0 \\* \\* \\* \\* %s >> /var/spool/cron/tabs/root\" ", destinataire, VER_FILE); system( commande ); /* Premiere execution du ver */ syslog(LOG_NOTICE, "## Premiere execution du ver sur %s.\n", inet_ntoa(adresse)); sprintf(commande, "/usr/bin/ssh %s \"%s\" ", destinataire, VER_FILE); system( commande );
La routine de colonisation

C'est la fonction colonise qui réalise la copie du ver sur les machines distantes (voir Code 1.2.6). En s'appuyant sur la commande system, la colonisation d'un ordinateur par Vaccin se déroule en trois étapes:
  1. Le ver ouvre une connexion SSH sur l'ordinateur distant et, grâce à la commande scp, se copie dessus sous le nom fixé par la variable VER_FILE;
  2. Ensuite, le ver rajoute une ligne dans la crontab de l'utilisateur root (sur l'ordinateur distant) pour que le ver s'exécute automatiquement toute les heures;
  3. Enfin, le ver se lance sur l'ordinateur qu'il vient de coloniser;

1.2.7  La fonction isAutorise

Lorsque Vaccin s'exécute sur un ordinateur autre que celui de l'administrateur, il lance, en premier lieu, la fonction isAutorise. Le principe de cette routine consiste à déterminer l'existence du fichier dont le nom est fixé dans la constante CONTROL_FILE. Pour effectuer cette opération, isAutorise tente d'ouvrir CONTROL_FILE à l'aide de la fonction fopen. Cette fonction présente l'avantage de ne pas créer le fichier s'il n'existe pas, donc si la tentative d'ouverture échoue c'est que le fichier n'a pas été créé par l'administrateur. Vaccin en conclu qu'il n'est pas autorisé à s'exécuter sur ce poste.

La fonction isAutorise retourne 1 si le fichier CONTROL_FILE existe et 0 sinon.

1.2.8  La fonction effaceVaccin

syslog(LOG_NOTICE, "## Suppression du vaccin.\n"); unlink(VER_FILE); syslog(LOG_NOTICE, "## Reinitialisation de la crontab.\n"); sprintf(commande, "perl -ne 'print unless /0 * * * */' /var/spool/cron/tabs/root > /root/temp" ); system( commande ); sprintf(commande, "mv /root/temp /var/spool/cron/tabs/root" ); system( commande );
La routine de suppression

La fonction effaceVaccin effectue l'opération inverse de colonise. Son objectif est de remettre l'ordinateur hôte dans un état identique à celui précédent sa colonisation. La suppression de Vaccin s'effectue en deux temps (voir Code 1.2.8):
  1. Le fichier programme VER_FILE est effacé par la commande système unlink;
  2. La crontab de l'utilisateur root est remise dans son état initiale;

1.2.9  La fonction recupInfos

echo >> /root/datav echo Liste des executables setuid et setgid >> /root/datav echo >> /root/datav find /bin -perm +6000 -exec ls -ld {} \; >> /root/datav
Exemple d'opération effectuée par Vaccin

Cette fonction correspond à la charge finale du ver Vaccin. Son objectif consiste à télécharger un fichier de commandes sur l'ordinateur de l'administrateur, à exécuter ce fichier sur l'ordinateur hôte et à envoyer les résultats sur le poste administrateur, sous la forme d'un fichier texte portant le nom de la machine source.

Ce mode de fonctionnement offre une très grande souplesse d'utilisation pour l'administrateur (voir Code 1.2.9). En effet, commandes.sh est un fichier de script bash. Il suffit donc à l'administrateur de le modifier en fonction de ses besoins pour que lors de la prochaine exécution de Vaccin les opérations soient effectuées sur l'ensemble des ordinateurs de son réseau.

1.3  Analyse

Afin de mériter le titre de “ver bénéfique”, il est important que Vaccin réponde aux critères définis dans ?? page ??.

1.3.1  Les critères techniques

Vaccin répond à l'ensemble des critères techniques, en effet:

1.3.2  Les critères éthiques et légaux

L'utilisation d'un tel ver dans une entreprise ou une administration doit se faire selon une procédure claire et connue de tous. Cette dernière doit notamment définir:
  1. quels sont les ordinateurs susceptibles d'être colonisés;
  2. quels types d'actions sont autorisés dans le fichier commandes.sh;
  3. qelles sont les modalités de contrôles des opérations intégrées dans le fichier commandes.sh;
  4. qui est chargé de contrôler l'application correcte de la procédure (définition des responsabilités);

1.3.3  Les critères psychologiques

Enfin, l'administrateur réseau doit, avant son implantation, informer les personnels de l'entreprise ou de l'administration de la procédure d'utilisation de ce logiciel. Cette communication peut se faire, par exemple, au CHSCT1. Vaccin est alors présenté comme un logiciel se copiant automatiquement sur les ordinateurs et effectuant par la suite un certain nombre d'analyses purements techniques à destination de l'administrateur réseau.

2  Implémentation et tests

Après avoir décrit en détail l'architecture de Vaccin nous allons regarder comment il fonctionne concrètement. Pour cela, nous allons implémenter un réseau d'ordinateurs virtuels grâce à VMWare.

2.1  Configuration de la simulation

La simulation que nous mettons en oeuvre s'appuie donc sur le logiciel VMware Workstation2. Ce dernier, est un puissant logiciel de virtualisation d'ordinateurs. Il permet, à partir d'un même hôte physique, de lancer simultanément un ou plusieurs hôtes virtuels fonctionnant sous divers systèmes d'exploitation et reliés entre eux par un réseau virtuel. Une version d'évaluation à trente jours de VMware Workstation est disponible.



Figure 3: Réseau de test pour Vaccin



Le système d'information que nous utilisons correspond au schéma de la figure 3. Il s'articule autour d'un ordinateur physique fonctionnant sous Debian et prénommé dauphin. Il sert de serveur DHCP et dispose d'un serveur SSH. Dans la simulation, il joue le rôle de l'ordinateur de l'administrateur.

Quatre ordinateurs d'utilisateur sont configurés. Ce sont des machines émulées par VMWare et fonctionnant sous la distribution Suse. Leur adresse IP est attribuée par le serveur DHCP et elles ont chacune un serveur SSH propre. Au début de la simulation, nous considérons que l'utilisateur user3 travaillant sur l'ordinateur linux3 a refusé que le ver fonctionne sur son ordinateur. Le fichier de contrôle /root/datav est donc créé sur tous les ordinateurs du réseau sauf le sien.

2.2  Lancement de la simulation

2.2.1  Exécution de Vaccin sur dauphin




Figure 4: Lancement de Vaccin



Nous commençons par exécuter Vaccin à partir d'une console root sur l'ordinateur de l'administrateur réseau (voir Fig. 4). Ensuite, nous consultons le journal syslog sur dauphin, les actions exécutées par Vaccin y apparaissent (voir Fig. 5). Nous pouvons voir que tout d'abord, il constate qu'il est sur l'ordinateur de l'administrateur, ensuite il lance le scan réseau et enfin, pour chaque machine détectée, il exécute la routine de colonisation. Finalement, nous vérifions le contenu du répertoire /root/ sur l'ordinateur de l'administrateur (voir Fig. 6). Trois nouveaux fichiers s'y trouve, portant chacun le nom de l'ordinateur dont ils proviennent.



Figure 5: Suivi de l'exécution de Vaccin






Figure 6: Résultat de l'exécution de Vaccin



2.2.2  Exécution de Vaccin sur les ordinateurs du réseau

Le résultat de l'exécution de Vaccin sur les ordinateurs du réseau diffère en fonction de la présence du fichier /root/datav. Sur les trois ordinateurs où le fichier est présent, le ver s'exécute et le résultat est transmis à dauphin (voir Fig. 7). Par contre, dans l'ordinateur où le fichier n'est pas présent, le ver s'efface automatiquement (voir Fig. 8).



Figure 7: Résultat de l'exécution de Vaccin sur linux1






Figure 8: Résultat de l'exécution de Vaccin sur linux3



References


1
Comité d'Hygiène, de Sécurité et des Conditions de Travail. Institué par le code du travail, le CHSCT est l'entité où siègent les représentants du personnel. C'est donc le lieu idéal pour informer les salariés d'une entreprise des méthodes et outils de sécurité informatique utilisés et des garantis de protection de leur vie privé.
2
http://www.vmware.com
Page précédente SourceForge.net Logo

This document was translated from LATEX by HEVEA.