停机问题对信息安全有什么适用性?

信息安全 理论 静态分析
2021-08-11 05:34:52

我最近在阅读一个 infosec 博客,我被下面的声明吓了一跳:

当然,您可以在您的数据中心运行最新的软件和防火墙以及网络设备,这显然可以解决停机问题……或者您可以开始以不同的方式思考,并在攻击者试图利用您的应用程序时将不确定性推给他。

我意识到了停机问题,但从未真正关注它,所以我做了一些后续阅读。我了解该原则的基本含义,但我想知道使用停止问题是否不是为网络安全状况不佳辩护的方便借口?停机问题实际上对网络安全应用程序有什么适用性,例如恶意软件检测或漏洞检测?

在我看来,停止问题表明不可能编写一个通用程序来100%准确地确定每个可能程序的行为。我正在考虑一个分析软件以确定它是否是恶意的程序,或者一个分析软件以确定它是否包含缓冲区溢出或 SQLi 漏洞的程序。

证明依赖于一个特殊的、人为的程序来显示这个悖论。这并不意味着任何程序都不能被另一个程序以 100% 的准确率分析,甚至大多数现实世界的程序也不能被另一个程序以 100% 的准确率可靠地分析。

我的最后一个问题是攻击者可以使用停止问题作为一种攻击形式吗?例如,无论您编写什么分析程序来检测攻击者的存在或活动,攻击者是否可以编写一个具有相同可证明行为的程序,使您的检测算法无法确定?

非常感谢任何指向现实世界研究或有关该主题的知名专家的指针。

2个回答

成熟的专家......那就是我(虽然不是这个名字——我使用化名,因为我非常谦虚)。那么请允许我回答。

“停止问题”确实说明了(对于计算机)不可能决定给定程序是否会停止。当然,很多程序都是可判定的,但不是全部。人们倾向于认为,如果我们能够准确地“预测”计算机程序的行为,那么恶意软件就不可能出现。这过于简单化了,原因如下:

  • “停止问题”是关于决定计算机程序是否会停止,对于给定的输入,这是先验已知的该模型仅适用于纯计算且不进行 I/O 的程序。根据定义,这不适用于连接到 Internet 或可由人控制的任何应用程序。例如,考虑一个运行视频的应用程序。只要人类用户点击倒带按钮,这个就永远不会停止。但是如果用户不点击任何按钮,它可能会停止(并且应该很容易证明) 。

  • 可判定性是关于一个给定的函数是否可以被评估而不是它是否可以被有效地评估。如果您想让防病毒软件扫描恶意软件,您希望在 2 或 3 秒内得到答案——而不是十年。这种可判定性的概念并没有涵盖我们感兴趣的所有事物。

  • 我们可以有要求。考虑一个 Java 应用程序。它是用字节码编写的,可以(有效)自动证明。也就是说,JVM 将以非常正式的方式证明代码符合 Java 的类型规则(它从不调用不具有该方法的类的方法)。不可能对每个可能的字节码指令序列进行一般性的证明;有效的 Java 代码是字节码,它可以以这样的方式被证明。这意味着在实践中可以对现有代码实施“可证明性”的要求。从“停止问题”的角度来看,这就像声明不能绝对(并且快速)确定停止行为的程序将被毫不客气地阻止执行。

  • 我们对程序是否会停止不感兴趣,而是对程序是否会做坏事感兴趣。我完全赞成用电脑改变我的银行账户……只要那是我想要的。我,人类/熊用户,通过银行网站管理我的钱,和恶意软件,通过银行网站吸走我宝贵的黄金,这在计算机世界中是不存在的。计算机中没有邪恶的概念。如果我想要安全,我必须首先以所有需要的精确度定义我究竟想让计算机做什么,以及我不想要什么。在问自己一个计算机程序是否能够自动决定我的核心安全属性是否会受到给定代码的尊重之前,我必须首先定义这些属性,而最初的部分工作远未完成。让计算机猜测什么是好的是一个看起来很难老问题

由于这些原因,我声称援引“停机问题”是一个糟糕的借口。它确实突出了一个事实,即我们正在处理比编写另一个 PHP 网站需要更多思考的问题。但这并不意味着安全是不可能的,只有科学不会拿出一个神奇的工具,它会解决它毫不费力地(因为这个得天独厚的判定性的+3锤也将解决停机问题,这不是数学上可能的)。

攻击者可以将停机问题作为一种攻击形式吗?

这不是算法复杂攻击使用的吗?您的服务器使用了一些算法,该算法在最坏情况下的行为非常糟糕,可能就像不在特殊输入序列上终止一样。因为不存在通用方法,所以您很难辨别哪些特殊输入序列可能会导致您的漂亮算法出现无限循环。