web-dev-qa-db-fra.com

Est-il mathématiquement prouvé que l'antivirus ne peut pas détecter tous les virus?

À quelle analyse Bruce Schneier faisait-il référence lorsqu'il écrivait:

Les virus n'ont pas de "remède". Il a été mathématiquement prouvé qu’il est toujours possible d’écrire un virus que tout programme antivirus existant ne peut pas arrêter.

Extrait du livre Secrets & Lies de Bruce Schneier, page 154.

148
Cate

Selon une interprétation possible de cela, c'est le résultat de théorème de Rice . Un programme est malveillant s'il effectue une action malveillante, ce qui en fait une propriété sémantique. Certains programmes sont malveillants et d'autres non, ce qui en fait une propriété non triviale. Ainsi, selon le théorème de Rice, il est indécidable dans le cas général de savoir si un programme est malveillant.

En fait, le contraire peut être facilement prouvé: étant donné que tous les virus informatiques sont du code exécutable d'une manière ou d'une autre, tout ce que vous avez à faire est de écrire un programme antivirus qui signalera TOUT code exécutable comme Il s’ensuit logiquement qu’un tel programme détectera TOUS les virus possibles:

  • Tout le code est détecté par votre antivirus (C → D)
  • Tous les virus sont du code (V → C)
  • Tous les virus sont détectés par votre antivirus (V → D)

Bien sûr, un argument pourrait être avancé à propos de ce logiciel antivirus éliminant trop de "faux positifs". Mais quels sont les critères pour décider si un positif est faux ou vrai? Ah! Il s'avère que la distinction entre le code bénin et le code malveillant, entre une suite honnête de "contrôle à distance du PC" et un cheval de Troie comme Netbus est complètement arbitraire, et donc toute la question est inutile.

191
walen

Selon Wikipedia:

En 1987, Fred Cohen a publié une démonstration qu'il n'y a pas d'algorithme capable de détecter parfaitement tous les virus possibles.

Il fait également référence à ce document . C'est peut-être l'analyse à laquelle M. Schneier faisait référence.

93
Harry Johnston

L'énoncé ne peut être prouvé mathématiquement que s'il est reformulé en tant que proposition mathématique.

À tout le moins, cela nécessite une définition mathématiquement valable de ce qu'est un "virus": ce qui est difficile; et vous pourriez vous retrouver avec une abstraction qui n'est pas utile dans la pratique, car elle inclut certains comportements que les gens considèrent comme entièrement bénins et utiles, et/ou exclut certains comportements que les gens considèrent comme antisociaux.

La chose difficile ici est qu'un virus est un programme qui modifie son environnement d'une manière ou d'une autre, et toute tentative de définir l'environnement rigoureusement sera trop limitative pour une utilisation pratique.

Je dirais donc non: la proposition ne peut pas être prouvée mathématiquement, et c'est parce qu'elle ne peut pas être formulée mathématiquement.

25
Michael Kay

tl; dr - La réponse dépend exactement des exigences que vous imposez à la question.

  1. Si vous souhaitez simplement détecter tous les virus sans aucune contrainte supplémentaire, signalez simplement tout et n'importe quoi comme virus, et vous avez terminé.

  2. Si vous voulez identifier correctement tous les programmes comme virus ou non, il est impossible dans le cas non lié, car le problème de classification se réduit au problème d'arrêt.

  3. Si vous voulez identifier correctement tous les programmes comme étant un virus ou non, et que vous envisagez une machine finie, alors c'est théoriquement possible mais généralement pas faisable dans la pratique.

  4. Si vous autorisez l'ordinateur à produire des erreurs aléatoires, tout programme peut être un virus.

Cas 1: Détection complète des virus

De toute évidence, signaler tous les programmes comme des virus les attrape tous. ( Pok'e'mon !)

En commençant par ce cas pour faire valoir qu'il n'est pas difficile de détecter tous les virus; le problème théorique spécifique est plutôt de classer correctement iff les programmes sont des virus.

Cas 2: Impossible de classer correctement dans un scénario général et illimité

Considérez le programme:

doHaltingProblem();          //  Not a virus operation itself
installEveryVirusEver();     //  Definitely a virus operation, but will it happen?

Dans ce cas, le programme n'est un virus que si le problème d'arrêt s'arrête, permettant à installEveryVirusEver() de se produire. Ainsi, la détection de virus se réduit au problème d'arrêt dans le cas général non lié.

Cas 3: Possible par recherche par force brute dans des scénarios bornés

Si des programmes à classer comme virus ou non doivent fonctionner sur une machine finie, vous pouvez simplement simuler la machine en cours d'exécution à partir de tous les états de démarrage possibles. Les machines finies finiront par revenir en boucle à un état antérieur , c'est donc nécessairement une analyse finie (si longue).

Cas 4: Les machines qui peuvent commettre des erreurs peuvent faire émerger spontanément des virus

En supposant qu'une machine puisse exécuter un programme qui serait considéré comme un virus et qu'il y a une chance non nulle qu'une mutation aléatoire le place dans cet état, elle devrait finalement arriver à un état de virus.

Ce qui est un peu ennuyeux, mais juste pour être complet.


Discussion sur la citation dans la question

Les virus n'ont pas de "remède". Il a été mathématiquement prouvé qu’il est toujours possible d’écrire un virus que tout programme antivirus existant ne peut pas arrêter.

" Secrets & Lies" , Bruce Schneier, page 154

Comme indiqué dans le cas (1) ci-dessus, il est possible de signaler tous les virus en signalant simplement tout comme virus; c'est facile. Ce qui est impossible, c'est de déterminer, dans un cas non lié, si chaque programme possible est un virus ou non.

De plus, il est difficile d'établir si des programmes particuliers sont des virus dans les cas liés. Par exemple, considérez le programme:

var toExecute = decryptByBruteForce([ciphertext]);  // Decrypt the next part of the program by brute-force
run(toExecute);                                     // Run the now-decrypted part of the program

Comme indiqué dans le cas (3), ce programme peut être classé comme virus ou non lorsqu'il est exécuté sur une machine finie, mais comme cela nécessiterait le forçage brutal d'un message chiffré, il n'est probablement pas réalisable dans des scénarios pratiques.

Ainsi, dans les applications du monde réel, cela se réduit à un problème de heuristique : les programmes antivirus font des suppositions sur ce qu'est un virus ou non. Ou si vous voulez une sécurité plus fiable, vous pouvez avoir un programme antivirus pour signaler tout ce qu'il ne peut pas prouver être sûr, évitant ainsi de devoir classer tous les programmes possibles.

Malheureusement, l'utilisation d'heuristiques donne aux attaquants avertis des failles de sécurité à cibler. Sans lire la source de la citation, je soupçonne que ce problème est ce à quoi ils essayaient de se référer.

18
Nat

Cela dépend de votre définition de "stop".

Si vous définissez stop comme étant "détecter, à l'avance, ce code pourrait faire quelque chose de malveillant et l'empêcher de s'exécuter", alors comme d'autres l'ont mentionné, cela est impossible, selon le théorème de Rice.

Si vous définissez stop comme "détecter lorsqu'un programme en cours essaie de faire quelque chose de mal, puis l'arrêter", le théorème de Rice ne s'applique pas. Votre antivirus n'a pas besoin de décider si le programme peut faire quelque chose de malveillant, seulement s'il fait quelque chose de malveillant maintenant.

AFAIK, la deuxième version n'a pas été prouvée impossible mathématiquement impossible. Et en effet, pour toute définition suffisamment spécifique de "malveillant", c'est très faisable - c'est essentiellement du sandboxing.

Il semble cependant probable qu'il n'y ait pas de bonne définition de "malveillant", qui couvrirait toutes les formes de malveillance qu'un virus pourrait tenter. Et un virus qui exploite le bitcoin? Ou qui sert des films de pirates? Ou qui spams des babillards électroniques en votre nom? Tous ces éléments ne peuvent pas être distingués du code exécuté par des utilisateurs qui veulent vraiment faire exactement ces choses. En tant que tel, je soupçonne (bien que je ne sache aucune tentative de prouver) que la création d'un antivirus est une IA complète.

16
James_pic

Oui, cela a été prouvé mathématiquement par Alonzo Church en 1935-1936 et indépendamment peu de temps après par Alan Turing en 1936.

https://en.wikipedia.org/wiki/Entscheidungsproblem

8
Michał Kuliński

Non, vous ne pouvez pas, car la différence entre un logiciel malveillant et un programme utile est complètement subjective. Tout comportement "mauvais" peut être un comportement voulu. Par exemple, j'ai les programmes suivants en cours d'exécution sur mon ordinateur en ce moment:

  • Un programme qui crypte tous mes fichiers. Est-ce un rançongiciel cryptolocker ou un outil de chiffrement complet du disque?
  • Un programme qui permet un accès à distance pour contrôler mon ordinateur. Est-ce un cheval de Troie ou est-ce Team Viewer?
  • Un programme qui crée des connexions réseau à toutes sortes d'ordinateurs sur Internet et échange des données obscures avec eux. Est-ce un botnet ou une plateforme informatique distribuée?
  • Un programme qui envoie tous mes fichiers personnels vers un serveur distant. S'agit-il d'un logiciel espion ou d'une sauvegarde dans le cloud?
  • Un programme qui télécharge des fichiers exécutables à partir d'Internet et les exécute. Est-ce un compte-gouttes de malware ou est-ce Steam?

Vous ne pouvez pas faire la différence, car d'un point de vue purement technique, ils font exactement les mêmes choses. La seule différence réside dans l'intention. Un programme trompe l'utilisateur sur ce qu'il fait et agit contre ses intérêts, l'autre fait exactement ce que l'utilisateur veut qu'il fasse. Mais ce que l'utilisateur veut vraiment de son logiciel, c'est quelque chose qu'une machine ne peut pas décider ... du moins pas au stade actuel de la technologie de l'IA. C'est pourquoi tous les antivirus sont principalement basés sur des signatures.

8
Philipp

Pour prouver mathématiquement qu'il est toujours possible d'écrire un virus qui peut contourner tous les programmes antivirus existants, vous devez d'abord définir mathématiquement ce qu'est un virus, et bonne chance avec cela.

Peut-être un "programme qui effectue des actions indésirables"? Eh bien, c'est tout simplement impossible, imaginez un programme qui ouvre une connexion à votre PC et permet le contrôle à distance. L'antivirus peut voir que le programme fait cela, mais comment peut-il savoir s'il est souhaité ou non?

Il peut s'agir d'un programme de contrôle à distance légitime comme TeamViewer, ou il peut s'agir d'un virus se présentant comme un simple programme de visualisation d'images, de manière eigter, votre antivirus verra un programme qui peut lire et afficher des images à partir de votre PC et ouvrir des connexions à distance, et il n'aura aucun moyen de savoir s'il s'agit d'un comportement "souhaité" ou non, car il ne peut pas savoir pourquoi vous installez ce programme.

5
kajacx

Comme l'a souligné @walen, il est en fait possible de détecter tous les virus si les faux positifs sont autorisés: signalez tout simplement comme un virus.

Supposons qu'il soit également possible de détecter tous les virus si les faux positifs ne sont pas autorisés. Nous aurons une fonction IsVirus qui peut être exécutée sur n'importe quel programme et retourner si ce programme est un virus ou non. Maintenant, considérons ce programme que nous appellerons P:

if IsVirus(P):
    exit
else:
    DoVirusThings

Quelle est la valeur de IsVirus(P)? Si c'est true, alors P sort simplement sans rien faire et nous avons donc un faux positif. Mais si c'est false, alors P fait des virus et nous avons un virus non détecté.

Cela prouve qu'il n'est pas possible de détecter tous les virus si les faux positifs ne sont pas autorisés.

4
Matthew

La question d'origine était "At-il été prouvé mathématiquement que l'antivirus ne peut pas détecter tous les virus?"

Il est probablement exact de dire que nous ne pouvons jamais prouver que nous avons un code écrit qui détectera tous les virus.

Un ordinateur polyvalent connecté à Internet avec la capacité de télécharger et d'exécuter du code est probablement équivalent à une machine Turing universelle. Cette équivalence inclut la taille de bande infinie de Turing: si la bande passante de l'interface réseau de la machine est inférieure au taux de croissance total des données accessibles sur Internet, la machine ne pourra jamais atteindre la "fin de la bande". (J'ai couvert cela un peu dans la conclusion de cet article il y a longtemps. Bien que cela puisse être démontré dans un sens pratique, trouver une preuve mathématique nécessiterait probablement l'ajout de certaines contraintes.)

Si ce qui précède est vrai, et si "arrêter" signifie "produire un rapport répertoriant tous les virus sur le système, ni plus ni moins", alors nous ne pouvons pas prouver à l'avance que le programme s'arrêtera avec une réponse correcte; nous devons l'exécuter pour le découvrir.

Si les deux paragraphes ci-dessus sont vrais, alors nous ne pouvons jamais vérifier l'exactitude du rapport résultant, car nous ne pouvons jamais compiler une liste complète de tous les virus possibles pour les comparer: Ces virus sont tous là quelque part sur la bande, c'est infini de taille, et nous ne pouvons jamais lire le tout.

Si les trois paragraphes sont vrais, alors nous ne pouvons jamais prouver que nous avons écrit un détecteur de virus 100% correct.

2
stevegt

At-il été mathématiquement prouvé que l'antivirus ne peut pas détecter tous les virus?

À quelle analyse Bruce Schneier faisait-il référence lorsqu'il écrivait:

Les virus n'ont pas de "remède". Il a été prouvé mathématiquement qu'il est toujours possible d'écrire un virus que tout programme antivirus existant ne peut pas arrêter. "[0]

[0] Secrets & Lies. Bruce Schneier. Page 154

Cette réponse ne traite pas directement de l'analyse à laquelle Bruce Schneier faisait référence. Une personne qui souhaite savoir ce que signifiait une source principale lorsqu'elle a fait une déclaration devrait faire l'effort de contacter la source principale elle-même pour lui poser des questions spécifiques , pour éviter la spéculation, la conjecture ou la confusion.

Théorème d'incomplétude de Kurt Gödel publié en 1931 dans Über formal unentscheidbare Sätze der "Principia Mathematica" und verwandter Systeme (appelé en anglais " Sur les propositions formellement indécidables de "Principia Mathematica" et des systèmes associés ") lorsque soigneusement examiné est très instructif et pertinent pour l'analyse de tout système formel, des virus informatiques à la politique

1. Si un système (formel logique ou axiomatique) est cohérent, il ne peut pas être complet.
2. La cohérence des axiomes ne peut pas être prouvée dans leur propre système.

Ces théorèmes ont mis fin à un demi-siècle de tentatives, à commencer par les travaux de Frege et aboutissant à Principia Mathematica et au formalisme de Hilbert, pour trouver un ensemble d'axiomes suffisants pour toutes les mathématiques.

Avec le recul, l'idée de base au cœur du théorème d'incomplétude est assez simple. Gödel a essentiellement construit une formule qui prétend qu'elle n'est pas démontrable dans un système formel donné. Si c'était prouvable, ce serait faux. Ainsi, il y aura toujours au moins une déclaration vraie mais non démontrable. C'est-à-dire que pour tout ensemble d'axiomes numériquement calculables pour l'arithmétique (c'est-à-dire un ensemble qui peut en principe être imprimé par un ordinateur idéalisé avec des ressources illimitées), il existe une formule qui est vraie de l'arithmétique, mais qui n'est pas prouvable dans Pour rendre cela plus précis, Gödel avait cependant besoin de produire une méthode pour coder (en nombres naturels) les déclarations, les preuves et le concept de provabilité; il l'a fait en utilisant un processus connu sous le nom de numérotation Gödel.

1
guest271314

Eh bien, la définition d'un virus est assez vague. Oui, c'est une entité malveillante, mais malveillant est tout aussi vague. Selon le système et ses politiques, les possibilités d'une entité malveillante changeront. Définir une entité en constante évolution est quelque chose qui est apparu dans divers domaines, la théorie des nombres, les machines à états, etc. et il a été prouvé de différentes manières que ce n'est pas possible, du moins sur la base de ce que nous savons.

Une façon serait, au lieu de définir ce qui est malveillant, nous pouvons définir ce qui est autorisé, un système très strict et indépendant, qui ne permet d'effectuer que certaines séquences d'opérations. De cette façon, il PEUT être gardé en sécurité.

Ce problème OMI est tout aussi difficile que de définir aléatoire.

1
Adithya Sama

Un virus n'est qu'un code - il est gentil de dire "Mon programme de tondeuse à gazon AI peut-il faire la différence entre les mauvaises herbes et les plantes" - si oui, tire-t-il des relances?

Si vous téléchargez un programme qui envoie des e-mails à toutes les personnes de votre liste de contacts, s'agit-il d'un virus ou êtes-vous un spammeur? Dépend de la raison pour laquelle vous avez téléchargé le programme, et non de certains octets dans le programme.

Donc, vous n'avez même pas besoin d'aller à la preuve mathématique - vous pouvez simplement penser que cela ne peut pas être fait.

D'un autre côté, vous pourriez dire qu'il est facile d'identifier les virus si vous définissez le virus par son comportement. Les programmes sont mis à jour dans le cadre d'un processus de mise à jour, si quelque chose tente de changer le code sur votre ordinateur en dehors de ce processus, vous pouvez le définir comme un virus. Avec ces définitions, vous pouvez facilement détecter les changements qui se produisent en dehors des procédures d'installation spécifiques. Cela peut prendre du matériel qui peut séparer le code des données et verrouiller l'espace de code lorsque vous ne maintenez pas un bouton, mais c'est possible (si ennuyeux).

Cela suppose également que le code que vous avez délibérément installé pendant le processus de mise à jour n'est pas un virus lui-même, mais puisque nous définissons un virus par comportement pour cet exemple, par définition, je suppose que non.

1
Bill K

Pas une preuve mathématique, mais AFAIK, il existe deux façons de détecter les logiciels malveillants:

Signatures

Étant donné que de nouveaux logiciels malveillants peuvent être développés - y compris en masquant ou en modifiant ceux qui existent déjà - la signature du nouveau logiciel malveillant ne sera pas dans la base de données antivirus, elle ne sera donc pas détectée

Heuristique

Cette méthode utilise une analyse automatique dynamique et/ou statique pour comprendre le comportement du logiciel et selon ce qu'il fait, l'antivirus décide s'il est malveillant ou non.

Et voici la partie délicate, tout ce qui est aujourd'hui considéré comme inoffensif ne le sera peut-être pas à l'avenir.

Par exemple, il y a 20 ans, un logiciel utilisant des bibliothèques de chiffrement n'était peut-être pas considéré comme quelque chose de malveillant, maintenant nous savons qu'il peut s'agir d'une sorte de ransomware chiffrant vos données. Dans le même temps, vous pouvez (et vous devriez) utiliser un gestionnaire de mots de passe qui utilise également des bibliothèques de cryptage pour stocker en toute sécurité vos données. Alors, comment pouvons-nous décider s'il s'agit d'un malware ou non uniquement en fonction du fait qu'il crypte les données? De même, une connexion TCP peut être utilisée pour divulguer des informations ou pour parcourir des sites Web.

La seule différence est sémantique, difficile à analyser de manière automatique car les technologies évoluent constamment et les malwares s'adaptent à cette évolution. Après tout, les logiciels malveillants ne sont pas différents des autres logiciels, à l'exception des mauvaises intentions de leur propriétaire

0
Mr. E