科恩的问题

信息安全 恶意软件 病毒 杀毒软件
2021-08-12 11:03:40

Fred Cohen 从理论上确定病毒检测是一个无法确定的问题。谁能提供一个直观的推理?

背景

Fred Cohen 对计算机病毒进行了实验,证实了 Neumann 的假设,并研究了恶意软件的其他特性,例如可检测性、使用基本加密的自我混淆等。他 1988 年的博士论文是关于计算机病毒的

2个回答

当然。在 Cohen 的著名结果中,他说当且仅当输入程序可以像病毒一样运行(即感染您的机器并造成损害)时,一个完美的病毒检测器应该发出警报。

考虑以下程序:

f();
infect_and_do_damage();

哪里f()是一些无害的功能,并且infect_and_do_damage()是一种病毒有效载荷,它会感染你的机器并造成各种损害(擦除你的硬盘,偷走你所有的钱,等等)。

让我们考虑一个完美的病毒检测器应该对这个程序说些什么:

  • 如果f()可以返回,这是病毒,病毒检测器应该发出警报。

  • 另一方面,如果f()总是进入死循环并且永远不返回,那么第二行是死代码,infect_and_do_damage()永远不会被调用,这个程序永远不会像病毒一样,病毒检测器也不应该发出任何警报。

因此,确定此代码是否是病毒的问题等同于确定函数是否f()可以停止的问题。这就是著名的停机问题,众所周知,它是不可判定的。

换句话说,检测一个程序是否是病毒至少和检测一个程序是否会停止一样困难。因此,这两个问题都是不可判定的。


请注意,这是一个纯粹的理论结果。不可判定性是一个纯粹的理论结构。问题无法确定这一事实并不是谈话的结束;这只是谈话的开始。

在实践中,有多种方法可以尝试处理不可判定性:例如,尝试编写一个概率正确的解决方案,即使它并不总是在所有程序上都是正确的;尝试找到适用于您在实践中可能找到的程序集的解决方案,即使它不适用于所有程序;允许解决方案偶尔回答“我不知道”或在将程序声明为病毒方面出错(或在误报方面出错);等等。

因此,您不应将此视为不可能进行病毒检测的明确声明——仅仅因为问题无法确定并不意味着在实践中一定不可能找到足够好的解决方案。但它确实确定了构建完美病毒检测器的一些基本障碍。

为了补充@DW的回答:即使可以解决停机问题,也存在一个固有的定义问题:无论如何,什么病毒?

例如,正如笑话所说,Microsoft Word 是一种病毒:

  • 它很普遍。
  • 它“复制”:当一些人开始使用 .doc 文件作为文档和业务交流的基础时,他们以某种方式强迫其他人自己安装 Word。
  • Word 使许多人(包括我)的生活成为活生生的地狱(不是持续的,但经常足以引起人们的注意)。

Word 在哪些方面不是病毒?

当然,很多人(包括微软的律师)会争辩说 Word 不是病毒,这是一个荒谬的断言。然而,这表明非病毒属性是宏观的:它不是单独来自代码的明确区分(“宏观”是指它是整体的涌现属性,而不是任何可执行文件中的汇编操作码)。

让我们举一个不那么离谱的例子:Linux 操作系统的安装程序。是代码吗?是的。它会复制自己吗?确实是的。它会修改引导扇区吗?绝对地。它是否会改变机器上已有的操作系​​统?哦是的。使其成为病毒的一个属性是,每当安装程序执行上述所有操作时,人类用户都希望以这种方式进行。

因此,完美的防病毒软件必须以某种方式猜测用户想要什么。对此不可能有绝对的答案。在实践中,大多数防病毒软件都试图做出“有根据的猜测”,并最终决定用户应该想要什么(这就是我今天早上花了一个令人沮丧的小时试图向客户发送可执行文件的方式:一些防病毒软件已决定我不可能想通过电子邮件发送可执行文件)。