Table des matières 1 Formalisation des virus informatiques 2 1.1 Les machines de Turing........................ 2 1.2 Formalisation de Fred Cohen..................... 2 1.2.1 Définition d un virus informatique.............. 3 1.3 Les Quines............................... 3 2 Etudes de propriétés de l ensemble viral 3 2.1 Quelques propriétés élémentaires................... 4 2.2 Problème d arrêt d une machine de Turing.............. 4 2.3 Théorèmes de la non décidabilité de la détection viral....... 5 2.3.1 Réflexion sur la possibilité de détection virale........ 6 3 Illustrations et ouvertures 7 3.1 L évolution virale............................ 7 3.1.1 Exemple d ensemble V de cardinal infini........... 7 3.1.2 Virus montrant une des difficultés de la détection par émulation 8 3.1.3 Les problèmes liés aux signatures............... 8 3.2 Analyse spectrale............................ 8 3.3 Analyse critique d un virus élémentaire................ 9 3.4 Remarque sur le comportement humain............... 10 3.5 La Désinfection............................. 10 3.6 Les virus «utiles»........................... 10 3.7 Ouverture sur la notion de virus................... 11 Introduction Le terme de virus informatique est aujourd hui très présent dans le grand public et les medias. Il est souvent improprement employé pour désigner un programme informatique malicieux conçu pour nuire. Cette définition correspond plutôt à ce que l on nomme communément les logiciels malveillants (ou malware). La notion de virus désigne de façon assez générale un fragment de programme capable de se répliquer (en mutant ou non). Le terme de virus a été introduit par Fred Cohen en 1985, dans sa thèse [1] sur laquelle nous nous sommes basés pour la partie théorique de cette étude. Nous allons ainsi formaliser la notion de virus grâce aux machines de Turing, puis nous énoncerons quelques résultats sur l ensemble viral, et en particulier un théorème de non décidabilité de la détection virale. Enfin nous présenterons des illustrations des résultats théoriques, des stratégies mises en place par les virus ou par les antivirus pour la détection et quelques réflexions générales sur la virologie. 1
1 Formalisation des virus informatiques 1.1 Les machines de Turing Le but de ce travail n étant pas l étude des machines de Turing, nous ne développerons que très peu cet aspect et nous admettrons de façon générale, qu elles nous fournissent une description universelle et abstraite des ordinateurs grâce aux machines de Turing universelles (le lecteur intéressé par cette question pourra se référer au livre de Eric Filiol [3] pour de plus amples informations ou à un cours plus complet sur les machines de Turing). Nous en donnons cependant une description succincte, et intuitive, en annexe. 1.2 Formalisation de Fred Cohen Le but de cette partie est de poser des notations relative aux machines de Turing et de présenter une définition formelle de la notion d ensemble viral et donc de virus. Définition 1.2.1. Une machine de Turing M est définie par la donnée d un ensemble de n + 1 états S M = {s 0, s 1,..., s n }, d un ensemble de m + 1 symboles I M = {i 0, i 1,..., i m }, d un ensemble d = { 1, 0, 1} décrivant les mouvements possibles pour la tête de lecture et d écriture, d une fonction de sortie O M : S M I M I M, d une fonction de transition N M : S M I M S M d une fonction de déplacement D M : S M I M d La machine est alors désignée par le quintuplet (S M, I M, O M, N M, D M ), et l ensemble des machines de Turing sera noté M. L on peut alors définir les trois fonctions «temporelles» de suivi de la machine : la fonction temporelle d état $ M : N S M qui pour chaque indice de pas, donne l état correspondant à l issue ; la fonction temporelle de bande M : N N I M qui fournit le contenu d une cellule en fonction de son numéro et de son indice de pas ; la fonction temporelle de cellule P M : N N donnant le numéro de la cellule après le déplacement de la tête de lecture en fonction de l indice de pas. et l historique à l instant t donné est défini par H M = ($ M (t), M (t, i), P M (t)) pour un i fixé. Définissons alors la notion d arrêt d une machine de Turing : Définition 1.2.2. On dit que le calcul de la machine M s arrête à l instant t si t > t on a $ M (t) = $ M (t ) et i N on a M (t, i) = M (t, i) et P M (t) = P M (t ). Et l on dit que le calcul de la machine M s arrête s il existe un instant t pour lequel M s arrête. Définition 1.2.3. L on note T S M un sous ensemble non vide de I M 2
1.2.1 Définition d un virus informatique On peut alors donner la définition formelle de l ensemble viral V, notons qu un élément de cet ensemble est un couple constitué d une machine de Turing et d un ensemble de mots, ainsi cet ensemble est viral relativement à la machine de Turing : Définition 1.2.4. On dit que (M, V ) V si [ M M et V T S M et si pour tout v V, on a [ quelque soit H M, t et j, tels que P M (t) = j et $ M (t) = $ M (0) et ( M (t, j),..., M (t, j + v 1)) = v ] [ v V et pour un instant t > t il existe un j tel que (j + v ) j ou (j+ v ) j et ( M (t, j ),..., M (t, j + v 1)) = v et les cellules d indices compris entre j et (j + v 1) sont effectivement remplis par M entre les instants t et t ] ] On comprend, alors, qu un virus est un «mot» qui est capable de se reproduire, ou éventuellement de se reproduire en ayant évolué, il génère en tous cas un autre programme qui a la même propriété que lui. On dira alors qu un virus v est une forme évoluée de v relativement à M si en faisant exécuter M sur v l on obtient (de façon éventuellement indirecte, c est-àdire en faisant s exécuter M sur le virus issu directement de v et ainsi de suite) le virus v On remarque alors que la notion de virus est bien différente de la notion de programme malveillant, et on remarque même que la présence d une charge finale est absente de la définition, et donc les virus ne sont même pas un sous ensemble des logiciels malveillants. 1.3 Les Quines Ainsi, des exemples très simples de virus sont des programmes qui recopient leur propre code.les programmes de ce type s appelle les quines. Une quine en français pourrait être : Recopier puis recopier entre guillemets, sans oublier le point final, la phrase «Recopier puis recopier entre guillemets, sans oublier le point final, la phrase». Ce qui pourrait s écrire en Caml : print string s ; print char (char of int 34) ; print string s ; print char (char of int 34) ; print char ; ; print char ; ; where s="print string s ; print char (char of int 34) ; print string s ; print char (char of int 34) ; print char ; ; print char ; ; where s=" ; ; 1. Il est interdit pour une quine de faire appel à une source extérieure ; par exemple, cela ne correspondrait pas à une quine de faire # let fausse quine= print string "fausse quine () ; ;" ; ; puis # fausse quine () ; ;. 2 Etudes de propriétés de l ensemble viral Maintenant que la notion de virus est précisée nous allons présenter quelques résultats sur ces ensemble, et en particulier la non décidabilité de la détection 1 Nous avons utilisé le code ASCII, car ici les séquences d échappement ne peuvent convenir, en effet, il faut que la phrase entre guillemets soit identique à celle d avant, ce qui ne serait pas le cas avec les séquences d échappement. 3
viral. 2.1 Quelques propriétés élémentaires Proposition 2.1. Il existe des machines de Turing pour lesquelles il n existe pas d ensemble qui soit viral relativement à cette machine de Turing Cette propriété est relativement trivialement démontrée, en prenant la machine de Turing qui s arrête immédiatement par exemple. Mais elle nous rappelle qu il est possible de faire des systèmes plus ou moins sécurisés face aux virus. Mais les systèmes proposés actuellement et qui garantissent une totale sécurité, sont tellement contraignant qu ils annulent presque les avantages de l informatique. Proposition 2.2. Il existe une machine de Turing M et V T S M tels que (M, V ) V et V = N On peut démontrer cette propriété en créant une telle machine et un tel ensemble. Il est a noter que pour presque tous les langages de programmation moderne l on peut créer un tel ensemble, nous en verrons un exemple dans 3.1.1. Cela nous montre donc que la détection de virus par simple scanning (comparaison avec de codes déjà répertorié) a ses limites. 2.2 Problème d arrêt d une machine de Turing Avec la définition que l on a donné des machines de Turing, il est légitime de se demander si elles s arrêtent ou non, l on peut en effet créer des machines de Turing qui ne s arrêtent jamais. Nous allons montrer que le problème d arrêt est indécidable, en d autres termes, que l on ne peut pas avoir de machine Turing qui réponde à la question «es ce qu un machine Turing va s arrêter ou non?» Définition 2.2.1. notons alors ϕ p (x) si le résultat du calcul de p sur x n est pas défini et ϕ p (x) si il est défini. Enonçons alors le théorème de non décidabilité du problème d arrêt : Théorème 2.3. Il n existe pas de programme (de machine de Turing) qui s arrête toujours et qui donne le résultat «vrai» si ϕ p (x) et «faux» si ϕ p (x) Démonstration. Raisonnons par l absurde : si un tel programme P existe. Nous allons alors le modifier pour obtenir un programme Π qui est tel que sa représentation fonctionnelle ψ vérifiée : { si ϕp (< p, x >) ψ(p, x) = sinon Mais, par construction ψ(.) représente le programme Π. Mais alors, comment se comporte ce programme quand un codage de lui-même lui est présenté? autrement dit que vaut ψ(π, Π)? Par définition on a : 4
{ si ϕp (< Π, Π >) ψ(π, Π) = sinon donc si ψ(π, Π) alors par définition, nous avons ψ(π, Π) et si ψ(π, Π) on a alors ψ(π, Π). D où la contradiction. Ce théorème vas nous servir à démontrer les théorème de non décidabilité de la détection viral. 2.3 Théorèmes de la non décidabilité de la détection viral Maintenant que la notion de virus est précisée, nous allons pouvoir démontrer que le problème de la détection virale est un problème indécidable. Théorème 2.4. Il n existe pas de programme (de machine de Turing), qui pour toute machine de Turing et tout ensemble V, s arrête toujours et qui donne le résultat «vrai» si (M, V ) V, et «faux» sinon Démonstration. L idée de la preuve est de se ramener au problème d arrêt d une machine de Turing. Pour une machine M et une donnée v arbitraires, on va alors créer une machine M et un mot v tels que (M, {v}) V si et seulement si ϕ p (x). Ainsi, déterminer si (M, {v}) V sera équivalent à déterminer si la machine de Turing M avec la donnée d entré v s arrête ou non, or comme M et v sont arbitraires alors si on pouvait déterminer si (M, {v}) V l on résoudrait le problème d arrêt des machines de Turing, qui est indécidable, donc une telle machine n existe pas. Montrons alors comment on peut créer un tel couple (M, {v}), pour ce faire, nous allons décrire simplement en substance ce que fait cette machine (la mise en place des notations serait lourde et peu utile). Tout d abord nous admettrons que l on dispose des machines de Turing élémentaires que l on pourra intégrée à des machines de Turing plus complexes : G(z) qui fait parcourir la bande de calcul vers la gauche à la tête jusqu à rencontrer la lettre z D(z) qui fait parcourir la bande de calcul vers la droite à la tête jusqu à rencontrer la lettre z CP I(x, y, z) qui pour les trois lettres x, y et z (classées dans cette ordre sur la bande de calcul) copie les caractères se trouvant entre x et y après le premier caractère z rencontré en allant vers la droite après y. Ensuite il nous faut remarquer que l on peut supposer que pour la machine M on a : G, D, g, d I M (quitte à changer de caractère) et l on peut aussi supposer que la bande de calcul n est utilisé que vers la droite (quitte à ajouter des états à la machine et utiliser les cases vides paires comme les case de gauche et les cases vides impaires comme les case de droite, cela est possible puisque la donnée v de départ sera délimité par g et d, donc on peu aller et venir facilement d un bout à l autre du mot, et le caractère d peu servir de marqueur à d entré de la zone où les cellules sont alternés). 5
Ensuite l on considère la machine M qui s arrête immédiatement si le premier caractère n est pas un G, puis applique CP I( g, d, D ) puis se place au début de cette copie puis simule l action de M sur cette copie (ce qui est possible en ajoutant les états de cette machine à ceux de M), ce qui ne pause aucun problème puisque l on a supposé que la bande n est utilisée que vers la droite. Enfin, si le calcul de M ne se termine pas, la machine tourne indéfiniment, sinon une foi le clacul de M terminé l on fait recopier à M la séquence originale (grâce à CP I( G, D, D )). Comme G I M alors la simulation de M ne peut pas produire un virus pour M, car tout programme qui ne s arrête pas immédiatement dans M doit commencer par G. Ainsi pour v = Ggv dd on a bien que (M, {v}) V si et seulement si ϕ p (x). Et avec le raisonnement vu ci-dessus et le théorème de non décidabilité de l arrêt d une machine de Turing l on a le résultat. Ainsi l on montre qu une détection virale parfaite (qui détecte touts les virus et qui ne produit jamais de fausse alerte) est impossible et nous invite à une vigilance constante en matière de sécurité informatique. 2.3.1 Réflexion sur la possibilité de détection virale Par un raisonnement similaire l on peut également démontrer que déterminer si un virus v est une évolution d un autre virus v est un problème indécidable. Ainsi cela nous montre que la détection qui serait basée sur une analyse de l évolution a aussi ses limites. A un tout autre niveau que celui des machines de Turing, l on pourrait faire un raisonnement par l absurde pour montrer le théorème 2.4. S il existait un programme D qui permettait de déterminer si un programme est viral ou non, alors on pourrait écrire le programme, avec un langage de haut niveau : CV()= {... {si non D(CV()) alors infection() ;} fin si aller au programme suivant} Ainsi si D(CV())= vrai alors l infection n aura pas lieu et donc le programme ne sera pas viral, et si D(CV())=faux alors l infection aura lieu et donc le programme D n aura pas détecté un programme viral. Ainsi un tel programme D ne peut pas exister, et donc là encore, cela prouve que la détection virale parfaite est impossible dés qu il est possible d écrire un code de ce type. Face à ce constat d impossibilité d obtenir une détection parfaite, il s agit de développer les outils les plus performants possibles. Ce qui sera l objet de la partie suivante. 6
3 Illustrations et ouvertures Dans cette partie nous présenterons quelques illustrations de propriétés montrées dans les travaux théoriques de Fred Cohen, mais aussi des illustrations des méthodes utilisées par les concepteurs de virus ou d antivirus 2. Ces illustrations seront présentées en langage Caml. Dans la mesure ou Caml-light ne se prête pas excessivement bien à l écriture de virus qui nécessite de faire des recherches de fichiers, mais aussi des fonction performantes d accès en écriture aux fichiers, afin de les infecter, nous ne présenterons donc qu une quine 3, ou une partie seulement du code. Mais ces exemples ont pour but de compléter de façon personnelle l exposé théorique et la formalisation présentée précédemment. Nous nous limiterons donc aux virus en code source, qui ne représentent qu une infime partie des virus informatiques, mais nous suffisent pour les exemples que nous avons choisi de présenter. Nous finirons enfin avec des réflexions plus générales sur les virus et notre cohabitation avec eux. 3.1 L évolution virale 3.1.1 Exemple d ensemble V de cardinal infini. Comme nous l avons vu précédemment, on peut démontrer qu il existe une machine de Turing M, et un ensemble V tels que (M, V ) V et V = N. Nous allons illustrer cette propriété en proposant une quine en Caml qui recopie son propre code, mais ajoute un caractère aléatoire de commentaire à chaque exécution. Ainsi on comprend bien comment on peut créer un tel ensemble 4 (nous supposerons que le module random est déjà ouvert ; bien qu il soit possible de le faire ouvrir par le programme) : print string s ; print string r ; print char (char of int 34) ; print string s ; print char ( ; print char * ;print char (char of int (random int 42)) ;print char * ; print char ) ; print char (char of int 34) ;print char a ;print char n ;print char d ;print char ;print char r ;print char = ;print char (char of int 34) ; print string r ; print char (char of int 34) ; print char ; ; print char ; ; where s="print string s ; print string r ; print char (char of int 34) ; print string s ; print char ( ; print char * ;print char (char of int (random int 128)) ;print char * ; print char ) ; print char (char of int 34) ;print char a ;print char n ;print char d ;print char ;print char r ;print char = ;print char (char of int 34) ; print string r ; print char (char of int 34) ; print char ; ; print char ; "and r=" ; where s=" ; ; 2 Bien qu une détection viral soit parfaite les antivirus atteignes aujourd hui des taux de détection de prés de 99% sur les virus connus et de 80% sur des virus inconnues. 3 Il suffirait alors simplement d ajouter un module de recherche de fichiers et de copier le virus vers ce canal, plutôt que vers l écran, pour rendre le programme viral. 4 Si l on trouve que l ajout d un caractère en note ne change pas réellement le programme, l on pourrait pas exemple ajouter la commande d impression d un espace. 7
Cette quine se recopie et intègre un commentaire dans un des deux les texte entre guillemets qu il lui permet de se recopier, ainsi à l étape suivante ce commentaire s ajoutera au code, et ainsi de suite. Ce type de virus permet de montrer la limite de la détection par recherche de code (le scanning). En effet, ici, une simple recherche de code ne permet pas de garantir ou non la présence du virus. L on pourrait alors développer des moyens plus subtils que la simple recherche de code ; mais alors, il serait possible de développer des moyens plus habiles de parade contre ces méthodes. Par exemple, il pourrait être possible de rajouter aléatoirement des espaces. 3.1.2 Virus montrant une des difficultés de la détection par émulation Afin d illustrer la propriété de non décidabilité de la détection virale, l on pourrait créer un virus résident produisant un descendant dont le temps de «reproduction» serait doublée à chaque génération, ainsi l on aurait un exemple de virus qui montrerait bien le lien entre la non décidabilité de la détection virale et le problème de l arrêt du calcul d une machine de Turing. En effet, la difficulté du problème d arrêt repose sur le fait que l on ne connait pas à priori le temps de calculs (s il se finit), et ce virus lui aussi aurait un temps avant infection qui pourrait devenir aussi long que l on veut. Ainsi ce virus illustrerait la difficulté de la détection viral. Ce virus ne représenterait pas un danger majeur car son activité deviendrait vite insignifiante. 3.1.3 Les problèmes liés aux signatures Afin d éviter la sur-infection les virus marquent (en entête par exemple) les programmes infectés, cela permet de limiter au maximum les opérations (et l espace mémoire occupé), qui pourraient alerter l utilisateur si elles sont en trop grand nombre. Mais cette signature est bien souvent utilisée par des antivirus pour détecter leur présence. Des virus plus aboutis ont un système de signature mouvante qui lui permet de repérer sa présence mais rend beaucoup plus difficile la détection. 3.2 Analyse spectrale Comme cela est pratiqué en cryptanalyse (qui est d ailleurs utile pour certains virus cryptés) on peut procéder par analyse spectrale pour rechercher des programmes potentiellement infectés. Pour nous, il s agit de rechercher des commandes «exotiques» qui sont couramment utilisées en programmation virale, mais beaucoup plus rarement en programmation traditionnelle. Ainsi par exemple la commande char of int 34 est relativement rare en programmation traditionnelle, mais est très utile pour les exemples présentés précédemment. Nous supposerons définie la fonction recherche occurrence qui pour recherche occurrence fichier n recherche le nombre d occurrences de la chaîne n dans le fichier. On peut ainsi mesurer la probabilité moyenne d apparition dans des programmes Caml 8
de tel ou tel chaîne, et si la valeur mesurée sur le fichier est supérieure et significativement supérieure à la moyenne 5. Ainsi un tel algorithme pourrait être : analyse spectrale canal n seuil moy pr n= let a =recherche occurrence canal n and b=in channel length canal in if (float of in a /. float of int b)/.moy pr n > seuil then print string "risque" ; ; De tels algorithmes peuvent servir dans des antivirus (avec un seuil relativement haut) et peuvent aussi être utilisés par les laboratoires cherchant à localiser des virus encore inconnus pour les ananlyser, et fournir une description utilisable par les antivirus, pour permettre la détection et la désinfection. 3.3 Analyse critique d un virus élémentaire Afin de présenter concrètement les caractéristiques essentielles que doivent présenter les virus modernes, nous allons réaliser une critique d un virus rudimentaire écrit en bash : for i in.sh ; do # pour tout fichier avec l extension sh if test "./$i"!="$0" ; then # si cible du fichier infectant tail -n 5 $ 0 cat >>$i ; # ajouter le code du virus fi done Ce programme recherche tous les autres fichiers comportant l extension.sh et ajoute son propre code à la fin de ces fichiers. Nous allons présenter en deux parties les arguments en faveur et en défaveur de ce virus élémentaire : Ce programme ne fait que 91 octets ce qui le rend très discret. D autre part, il vient s ajouter à la fin d un script, ce qui réduit le nombre d opérations à réaliser pour l infection. Le fait que le virus soit situé à la fin du programme fait qu il est exécuté en toute fin et don,c qu il n est pas systématiquement exécuté lorsque le programme qu il parasite l est. Le code comme présenté ici est très lisible, ce qui le rend facilement détectable par un lecteur. Ce virus a une action limitée au répertoire courant. De plus les fichier d extension.sh sont relativement peu courants, ce qui limite l action de ce virus. D autre part le virus ne vérifie pas si le fichier qu il va infecter est déjà infecté, ce qui peut produire une surinfection qui sera rapidement démasquée par l utilisateur qui remarquera la présence de ces lignes de code en nombre à la fin de son fichier, ou alors, l augmentation de la taille alertera l utilisateur. De plus la petite taille de ce code peut constituer une signature qui sera recherchée par un antivirus (car ce virus n est pas polymorphe). Enfin, bien que cela ne soit en aucun cas une caractéristique d un virus, ce virus ne comporte pas de charge finale, cela produit donc un virus qui est relativement peu «utile», 5 Là encore il n est bien sûr pas question de détecter tous les codes viraux et seulement ceux là, et donc, le seuil peut être fixé en fonction du niveau de sécurité que l on souhaite obtenir, au risque de déclencher de fausses alertes. 9
ce virus peut constituer une charge finale en lui-même en alourdissant les fichiers si l utilisateur ne l élimine pas. Ainsi ce virus est un relativement mauvais virus. Mais certains points évoqués précédemment pourraient bien sûr être améliorés. 3.4 Remarque sur le comportement humain Comme nous l avons déjà évoqué, créer un système empêchant les virus de se propager, reviendrait à se priver de bien des utilités de l informatique. C est alors à l utilisateur de comprendre cela et d adopter une position de prudence en la matière. Car dans les infections informatiques le facteur humain est souvent très important. On se rappelle par exemple 6 du ver I love you qui a causé de très importants dégâts, et qui utilisait l argument d une lettre d amour pour inciter l utilisateur à ouvrir le message. Le paroxysme de ce phénomène est atteint avec les chaînes envoyées par e-mail, et qui demandent à être recopiées intégralement et envoyées à de nouveaux correspondants, ainsi on est face à un «virus» qui n a comme moyen de propagation que la persuasion du lecteur. Ainsi l on prend la mesure de l importance de l ingénierie sociale dans la conception d un virus. 3.5 La Désinfection Le problème de la désinfection est conditionné par la détection mais aussi par la connaissance du virus. Ainsi il faut pouvoir le supprimer dans les fichiers sans endommager le fichier. Mais là encore, les virus ont des moyens de défenses, certains procèdent par remplacement de code, cela a donc pour effet de détruire le programme original, et donc ce type de virus est presque impossible à désinfecter sans supprimer les fichiers. D autres virus, à l image des rétrovirus, s attaquent spécifiquement aux systèmes antivirus, cela peut alerter l utilisateur mais empêche la désinfection. Enfin pour certains virus à infection très rapide, l antivirus peut se révéler plus lent que le virus, ce qui fait que le bilan est négatif et le virus gagne immanquablement du terrain, et n est donc pas supprimé. Ce problème de vitesse a été résolu dans certain cas 7 par une désinfection par un autre virus informatique lancé sur les ordinateurs, ce virus devait désinfecter les fichiers infecter et se désinfecter lui même à partir d une date donnée. Ce dernier exemple nous montre que bien que nous soyons condamnés à vivre avec les virus il peuvent aussi nous apporter. 3.6 Les virus «utiles» Bien que cette notion ne soit pas très bien vue par les éditeurs d antivirus, il est possible de créer des virus utiles, qui permettent, par exemple, d assurer des taches d administration sur un réseau (sans avoir de programme résident). Il a déjà été envisagé par exemple de créer un virus qui gérerait la compression de fichiers 6 Les exemple de ce genre son plethore. 7 Comme par exemple dans la cas du ver Creeper qui devait éliminer un autre ver qui avais infecté un système de contrôle aérien. 10
peu utilisés, en les cherchant, puis en les compressant et enfin en s y copiant. Enfin des vers (qui sont des virus adaptés aux réseaux) peuvent permettre de maintenir à jour, ou faire du calcul distribué. 3.7 Ouverture sur la notion de virus Nous avons montré au 3.1 comment produire un ensemble potentiellement infini de ces pseudos virus. On pourrait même imaginer de faire un virus qui, à certaines duplications change de façon aléatoire des parties de son code. Dans bien des cas cette évolution rendrait non exécutable le programme, mais parfois elle pourrait produire des améliorations du programme. Ainsi l on peut fantasmer une évolution darwinienne dans un ordinateur où les meilleurs programmes prendraient le pas sur les virus ne pouvant pas faire face à la pression exercée par les autres virus pour occuper l espace mémoire. On retrouve cette idée dans le jeu corwar 8 où deux programmes s affrontent sur un espace mémoire très limité et doivent éliminer leur adversaire, mais dans ce jeu il n est pas question d évolution, il illustre simplement comment peut se faire une «sélection naturelle». Il est à noter que le nom de virus est particulièrement bien choisi car le parallèle avec la biologie peut être poussé assez loin, en effet les mécanismes sont assez proches, et les programmateurs se sont inspiré des mécanismes naturels pour programmer de virus. Conclusion La notion de virus est encore mal connue aujourd hui. Elle est mystifiée par des professionnels de la sécurité informatique qui souhaitent souvent conserver un monopole intellectuel sur ce sujet. Il est ainsi courant de rencontrer un refus catégorique lorsque sont proposés des tests grandeur nature d évaluation de sécurité des systèmes informatiques, car il est fréquent que des décideurs pensent qu un problème non diagnostiqué n existe pas. Ainsi il est important de reprendre la définition et de rappeler les possibles et les impossibles en la matière 9. Mais il est important aussi que la virologie informatique se développe car le potentiel stratégique des virus informatiques est énorme. En effet, d importants dégâts ont été causés par des virus développés par des individus seuls. On peut donc imaginer les conséquences que pourraient avoir une attaque massive menée par un état. 8 C est d ailleurs pour ce jeu qu ont été crées les premiers virus informatiques 9 Le théorème de non décidabilité de la détection virale contre bien des slogans outranciers de sociétés commercialisant des antivirus. 11
Références [1] Fred Cohen (1985) Computer Viruses [2] Fred Cohen (1994) A Short Course on Computer viruses [3] Eric Filiol (2004) Les virus informatiques : théorie, pratique et applications [4] Article Wikipedia sur les Machines de Turing 12
Annexe Description succincte, et intuitive des machines de Turing Une machine de Turing M est composée de trois parties Une unité de stockage (ou bande de calcul), qui est de longueur infinie et est divisée en cellules qui contiennent chacune un caractère d un alphabet (fini) donné, dont le vide est un caractère. Le nombre de cellules non vides sera fini. Cette bande permet en début de calcul d apporter les données du calcul à la machine, en cours de calcul de servir d unité de stockage, puis en fin de calcul de donner les données de sortie. Une tête de lecture et d écriture qui se déplace le long de la bande de calcul, en traitant une cellule à la fois, puis se déplace vers la droite ou la gauche. Cette tête permet ainsi de désigner la cellule courante et permet de lire, puis d écrire un nouveau caractère sur la bande, avant de se déplacer. Une fonction de contrôle qui pilote la tête. Cette fonction contient l état de la machine qui est une forme de mémoire de cette machine. Ainsi si S désigne l ensemble fini des états de la machine et I l alphabet, on a que F : S I S I {G, 0, D}. Ainsi la fonction est dans un état donné et la tête lui transmet le caractère lu sur la bande de calcul. La fonction va passer dans un nouvel état, va faire remplacer le caractère contenu dans la cellule de la bande de calcul, et va indiquer à la tête si elle doit rester dans la même position, ou aller sur la cellule de gauche ou de droite. Si bien que la machine M est caractérisée par sa fonction F. Ainsi, si le calcul de la machine de Turing s arrête, Lorsque l on est en situation ou la tête ne bouge plus,et l état non plus tout comme le caractère contenu par la cellule courante. Cette notion de machine de Turing ne semble pas suffisante pour décrire le fonctionnement des ordinateurs actuels, car une machine correspond à une seule fonction à priori. Ainsi nous allons définir la notion de machine de Turing universelle. Définition 3.7.1. Une machine de Turing universelle U est une machine de Turing qui, sur des données d entrée décrivant d une part une machine de Turing M donnée, et d autre part une donnée d entrée x pour cette machine, simule l action de M sur x, autrement dit calcule M(x). On note U(M; x) = M(x). Une telle machine peut émuler l action de toute autre machine sur une donnée. Nous ne développerons pas les techniques de représentation d une telle machine M sur la bande de calcul, mais nous supposerons que cela est possible. 13