tl; dr - La réponse dépend exactement des exigences que vous imposez à la question.
-
Si vous voulez détecter tous les virus sans autre contrainte, alors marquez simplement n'importe quoi et tout comme un virus, et vous avez terminé.
-
Si vous voulez identifier correctement tous les programmes comme un virus ou non, alors c'est impossible dans le cas non lié puisque le problème de classification se réduit au problème d'arrêt.
-
Si vous voulez identifier correctement tous les programmes comme virus ou non, et vous considérez une machine finie, alors c'est théoriquement possible mais pas généralement faisable en pratique.
-
Si vous admettez que l'ordinateur peut produire des erreurs aléatoires, alors n'importe quel programme peut être un virus.
Cas 1: Détection complète des virus
De toute évidence, signaler tous les programmes comme virus les attrape tous. ( Pok'e'mon! )
En commençant par ce cas pour faire remarquer qu'il n'est pas difficile de détecter tous les virus; plutôt, le problème théorique spécifique est de classer correctement les programmes iff comme des virus.
Cas 2: Impossible de classer correctement dans un scénario général et illimité
Considérez le programme:
doHaltingProblem (); // Pas une opération de virus itselfinstallEveryVirusEver (); // Certainement une opération de virus, mais cela se produira-t-il?
Dans ce cas, le programme n'est un virus que si le problème d'arrêt s'arrête, permettant installEveryVirusEver ()
pour 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 limités
Si les programmes doivent être classés comme virus -ou non doivent fonctionner sur une machine finie, alors vous pouvez simplement simuler la machine fonctionnant à partir de tous les états de démarrage possibles. Les machines finies finiront par revenir à un état antérieur, donc c'est nécessairement une analyse finie (si longue).
Cas 4: les machines qui peuvent faire des erreurs peuvent faire émerger spontanément des virus
En supposant qu’une machine peut exécuter un programme qui serait considéré comme un virus, et qu’il n’y a pas de chance nulle de changement de mutation aléatoire dans cet état, puis il devrait finalement arriver à un état de virus.
Ce qui est un peu ennuyeux, mais juste pour être complet.
Discussion sur le quote dans la question
Les virus n'ont pas de «remède». Il a été prouvé mathématiquement qu'il est toujours possible d'écrire un virus qu'aucun programme antivirus existant ne peut 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 un virus; c'est facile. Ce qui est impossible, dans un cas non lié, est de déterminer si chaque programme possible est un virus ou non.
De plus, il est difficile d'établir si des programmes particuliers sont des virus dans des cas liés. Par exemple, considérons le programme:
var toExecute = decryptByBruteForce ([ciphertext]); // Décrypter la partie suivante du programme par brute-forcerun (toExecute); // Exécutez la partie maintenant décryptée du programme
Comme indiqué dans le cas (3), ce programme peut être classé comme un virus ou pas lorsqu'il est exécuté sur une machine finie, mais comme cela nécessiterait de forcer brutalement un message chiffré, ce n'est probablement pas faisable dans des scénarios pratiques.
Ainsi, dans les applications du monde réel, cela se réduit à un problème d ' heuristique: les programmes antivirus tentent de deviner ce qu'est un virus ou non. Ou si vous voulez une sécurité plus fiable, vous pouvez demander à un programme antivirus de signaler tout ce qu'il ne peut pas prouver sûr, évitant ainsi la nécessité de classer tous les programmes possibles.
Malheureusement, l'utilisation de l'heuristique donne aux attaquants bien informés 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.