问题 使用定理证明来发现攻击


我已经听过一些关于使用自动化定理证明的尝试,以证明软件系统中不存在安全漏洞。总的来说,这是非常难以做到的。

我的问题是有没有人完成使用类似工具的工作  现有或拟议系统中的漏洞?


艾德:我是  询问证明软件系统是安全的。我问的是找到(理想情况下以前未知的)漏洞(甚至是它们的类)。我在想这里(但不是)黑帽子:描述系统的形式语义,描述我想要攻击的内容,然后让计算机弄清楚我需要用什么行动来接管你的系统。


4436
2017-09-09 17:09


起源

我认为谷歌的本地客户可以为此提供便利;他们通过需要一个特殊的编译器来欺骗(编译到目标指令集的某个子集,使得'更容易'验证代码)。参见NaCl at chromium.org/nativeclient/reference/research-papers - sehe


答案:


因此,至少在一些有意义的意义上,证明某些东西是安全的相反的是找到它不是的代码路径。

尝试 Byron Cook的TERMINATOR项目

在Channel9上至少有两个视频。 这是其中之一

他的研究可能是您了解这个非常有趣的研究领域的一个很好的起点。

Spec#和Typed-Assembly-Language等项目也是相关的。为了将安全检查的可能性从运行时转移到编译时,它们允许编译器检测许多错误的代码路径作为编译错误。严格来说,它们并不能帮助您明确的意图,但它们利用的理论可能对您有用。


4
2017-09-09 17:20





是的,在这个领域已经做了很多工作。可满足性(SAT和SMT)求解器经常用于发现安全漏洞。 例如,在Microsoft中,一个名为的工具 智者 用于根除窗口中的缓冲区溢出错误。 SAGE使用 Z3定理证明 作为其可满足性检查器。 如果您使用“智能模糊测试”或“白盒模糊测试”等关键字搜索互联网,您会发现其他几个项目使用可满足性检查器来查找安全漏洞。 高级想法如下:收集程序中的执行路径(您没有设法运行,也就是说,您没有找到使程序执行它的输入),将这些路径转换为数学公式,并将这些公式提供给可满足性求解器。 我们的想法是只有在有一个输入使程序执行给定路径时才能创建一个可满足/可行的公式。 如果产生的公式是可满足的(即可行的),那么可满足性求解器将产生分配和所需的输入值。白盒模糊器使用不同的策略来选择执行路径。 主要目标是找到一个输入,使程序执行导致崩溃的路径。


5
2017-08-26 20:35





我目前正在与其他人一起在Coq中编写PDF解析器。虽然这种情况下的目标是生成一段安全的代码,但做这样的事情肯定有助于找到致命的逻辑错误。

一旦熟悉了该工具,大多数证据都变得简单。更难的证明会产生有趣的测试用例,有时会触发真实的现有程序中的错误。 (并且为了找到错误,一旦你确定没有找到错误,就没有必要进行严格的证明,你可以简单地将定理假设为公理。)

大约一个月前,我们遇到了一个问题,解析了多个/旧的XREF表格的PDF。我们无法证明解析终止。考虑到这一点,我在预告片中构建了一个带有循环/上一个指针的PDF(谁想到了这个?:-P),这自然使一些观众永远循环。 (最值得注意的是,几乎所有基于poppler的浏览器都在Ubuntu上。让我笑,并诅咒Gnome / evince-thumbnailer吃了我所有的CPU。我认为他们现在修复它了,所以。)


使用Coq查找较低级别的错误将很困难。为了证明什么,你需要一个程序行为的模型。对于堆栈/堆问题,您可能必须建模CPU级别或至少C级执行。虽然技术上可行,但我认为这不值得。

使用SPLint for C或使用您选择的语言编写自定义检查器应该更有效。


2
2017-07-10 23:57





STACK 和 编制品 使用约束求解器来查找许多OSS项目中的漏洞,比如linux内核和ffmpeg。项目页面指向论文和代码。


2
2017-12-20 23:22



第p页的代码段。 STACK纸中的一个是看起来坚如磐石的一个很好的例子,但实际上并非如此。对于语言标准作者来说,如何将某些东西定义为“未定义的行为”也会出乎意料地适得其反。 - j_random_hacker


它与定理证明无关,但是 模糊测试 是一种以自动方式查找漏洞的常用技术。


1
2017-09-09 17:15





L4验证内核 这是试图做到这一点。但是,如果你看一下利用历史,就会发现全新的攻击模式,然后很多写到这一点的软件很容易受到攻击。例如,格式字符串漏洞直到1999年才被发现。大约一个月前H.D.摩尔发布了 DLL劫持 而且几乎所有东西都在窗户下 很脆弱

我不认为有可能证明一块软件可以抵御未知攻击。至少直到一个定理能够发现这样的攻击,并且据我所知这没有发生。


1
2017-09-09 17:20



通过安全性,我认为你的意思是一组不变量适用于在已知硬件上运行的某段代码。如果是这种情况,我相信有可能证明不变量成立。随着软件变得越来越大,它变得越来越难,但从我所读到的,我们变得越来越聪明。 - Jason Kleban
如果不是这样,我会非常沮丧。 - Jason Kleban
@uosɐs让我用不同的方式,多年来我写了很多漏洞,我已经忘记了发给我的CVE编号,我不认为这可以证明。至少还没有。 - rook
你听起来比我更合格。您是否相信可以保护琐碎的代码?我的意思是,删除操作系统,运行您可以直接在硬件上考虑的最琐碎的事情,这样的事情是否可以绝对安全地远程攻击?如果是这样,那就是一个极端。我们知道另一个极端(XP?)。在中间某处有一个边界。我们必须找出边界。 - Jason Kleban
但正如你所说,“至少还没有”。我不是在挑战你,我很想知道你的更多想法。 - Jason Kleban


免责声明:我对自动化定理证明器几乎没有经验

一些观察

  • 像密码学这样的东西很少被“证明”,只是被认为是安全的。如果你的程序使用类似的东西,它只会像加密一样强大。
  • 定理证明者无法分析所有内容(或者他们能够解决暂停问题)
  • 你必须非常清楚地定义证明者的不安全手段。这本身就是一个巨大的挑战

0
2017-09-09 17:21



我不是百分之百确定这一点,但我很确定大部分密码学都被证明了公理(特别是建议的P!= NP),它经常被误用。正如您在第三点中所述,重要的是严格定义您对机制的依赖 - 只有这样才能证明您的使用是正确的应用程序。 - Jason Kleban
@uosɐs密码分析的大部分内容涉及减少强制密码/哈希所需的轮数。另外,我很确定“分解很难”尚未得到证实(不可靠来源: en.wikipedia.org/wiki/Integer_factorization ) - cobbal
同样,我不是专家,但为了您的考虑:整数因子化并不是唯一可用的“硬”机制。此外,最近的P!= NP将(等待审查)证明存在难题。而且我认为已经证明了!如果!存在难题,整数分解或其某些朋友属于该类别。 - Jason Kleban
此外,Byron Cook链接解决了暂停问题。简而言之:是的,暂停问题仍然存在,但这只是说,正如你所说,你无法静态分析每个程序的终止,但这并不意味着没有各种各样的程序可以可以静态分析终止。 - Jason Kleban
让我想知道是否存在一些静态可分析质量和图灵完整性的交集 - 可能已经/正在探索。 - Jason Kleban


是。许多定理证明项目通过展示软件中的漏洞或缺陷来展示其软件的质量。为了使其与安全性相关,只需想象在安全协议中找到漏洞。 Carlos Olarte的博士Ugo Montanari的论文有一个这样的例子。

它在应用程序中。并非真正的定理证明本身与安全性或其特殊知识有关。


0
2017-09-09 18:12