David A.Wheeler关于通过多样的双编译(DDC)全面对抗信任信任的文章-对抗编译器上的特洛伊木马攻击

以下是我对抗“信任”攻击的工作信息。“信任信任”攻击是计算机安全中令人难以置信的恶意攻击;到目前为止,人们认为这是不可抵抗的基本攻击。我担心了很长一段时间,基本上是因为肯·汤普森公开描述了它。毕竟,如果有已知无法进行的攻击如果被有效地对抗,我们是否应该使用计算机?谢天谢地,我认为有一个有效的对策,我已经命名了“多样化双编译”(DDC)。

本页记录了我的2009年博士论文及其前身2005年ACSAC论文,有点引用我的作品、和详细数据(重复实验),然后它有关于消除误解,把这个应用到硬件上怎么样?,软件专利和应用程序编程接口(API)版权,到期信用证、和谁在谈论它?.然后我们有一个关于DDC的实际应用特别是讨论GNU Mes。它包括一个关于一些相关材料.

2009年博士论文

通过多元化双重编译全面对抗信托(PDF版本,HTML版本,OpenDocument文本版本,PDF的Perma.cc链接,arXiv:1004.5534,PDF格式,GMU梅森档案存储库服务(MARS))我2009年的博士论文解释了如何应对使用“Diverse Double Compiling”(DDC)进行“trusting trust”攻击技术。这篇论文于2009年10月26日被我的博士委员会接受。

视频我的官方公共辩护也可用;本演示文稿发布于2009年11月23日下午1点至3点(播客/RSS可用).演示材料也可以在PDF格式OpenDocument(ODP)格式。公共辩护在乔治·梅森大学,弗吉尼亚州费尔法克斯,创新大厅,105室[校园位置] [谷歌地图].

以下是论文摘要:

空军对Multics的评估以及Ken Thompson的图灵奖讲座(“反思论信托“),表明编译器可以被颠覆,将恶意特洛伊木马插入关键软件,包括他们自己。如果这种“信任”攻击未被发现,即使对系统源代码进行完整的分析,也不会发现正在运行的恶意代码。先前已知的对策有严重不足。如果无法反击此攻击,攻击者可以悄悄地破坏整个计算机系统类对金融、基础设施、军事和/或商业的控制全球系统基础设施。本论文的主题是可以检测到信任攻击并有效应对使用“多样双编译”(DDC)技术,如(1) DDC可以确定源代码和生成的可执行代码对应,(2)用四个编译器演示DDC(小型C编译器、小型Lisp编译器、小型恶意损坏的Lisp编译器和大型工业级C编译器(GCC),以及(3) 描述在各种现实世界中应用DDC的方法情节。在DDC技术中,源代码编译两次:一次使用第二个(受信任的)编译器(使用编译器的源代码父级),然后使用结果编译编译器源代码第一次编译的。如果结果与不可信的可执行文件,则源代码准确地表示可执行文件。

论文包括一节,解释它是如何扩展的我之前的2005年ACSAC论文.本文概括了ACSAC论文(现在编译器不需要自父级),包括正式的证明,以及包括GCC演示(以演示可扩展性)并使用恶意编译器。

如果你读了论文,你也应该看看论文勘误表(勘误表微不足道不要影响论文中任何内容的基础)。

我要感谢委员会成员,他们给予了我很大的帮助。特别感谢Ravi Sandhu博士;我想做一篇博士论文这完全偏离了常规,他有足够的灵活性让我来做吧。他还对如何完成这个过程提出了一些很好的建议。Daniel A.Menascé博士让我用一个恶意编译器(我就是这么做的)。Jeff Offutt医生问我它与N版本编程(所以我添加了关于这有什么不同的材料N版本编程)。Paul Ammann博士对N版编程有一些有趣的评论材料;原来他亲自参与了那项里程碑式的研究!钟玉涛博士问我关于T形图的问题(所以我添加了关于原因的材料我做的使用它们)。委员会中的每个人都提出了很好的问题,尤其是在公开辩护前的私下陈述;谢谢您!

2005年ACSAC论文

以下是我2005年的论文,该论文由ACSAC正式审查和发表:

通过多样化的双重编译对抗信任(DDC),David A.Wheeler,第二十一届会议记录年度计算机安全应用会议(ACSAC)2005年12月5日至9日,亚利桑那州图森,第28-40页,洛斯·阿拉米托斯:IEEE计算机学会。ISBN 0-7695-2461-3,ISSN 1063-9527,IEEE计算机学会订单号P2461。如果你不能从ACSAC获得那篇论文,这里有一份本地的通过多样化双重编译(DDC)对抗信任信任由ACSAC发布。您还可以获得此备选PDF“通过多样化双重编译(DDC)对抗信托”OpenDocument表单“通过多样化双重编译(DDC)对抗信托”.(我有权在这里发表同样。)

我很荣幸被ACSAC 2005年会议接受。他们收到了很多不错的投稿,但在2005年,他们拒绝了77%的他们提交的论文。我提交给ACSAC的一个原因是,我相信web对于结果的广泛使用至关重要;ACSAC已经在网上发布了很长一段时间开放存取会议。

ACSAC论文和后期论文:
项目ACSAC(2005)论文(2009)
可信编译器T型c(c)T型
测试中的编译器A类c(c)A类
父编译器-c(c)

我有一份基于ACSAC论文的报告。我在ACSAC上做了原始演示;我已经更新了一点基于我收到的各种反馈。

您可以通过以下方式获取演示文稿:

注:ACSAC 2005年论文“通过多样的双重编译对抗信托”有一个输入错误。在第4节的最后一段,就在图的前面,它说:“如果c(sA,c(sA,T))、A和c(sB,T)相同,…”。“c(sA,T)”应为“c(s A,A)”;您可以确认这一点,因为图中清楚地显示了“c(sA,A)”而不是“c(s A,T)”。我感谢乌尔夫·迪特默向我指出这一点!

引用我的作品(我是大卫·A·惠勒)

如果你引用我的作品,至少包括我中间的首字母“A”,如果可能的话请使用“David A.Wheeler”。请不要引用我作为任何书面作品中的“David Wheeler”或“D.Wheeler(包括互联网等电子媒体)。大卫·惠勒太多了,所以这就像根本不给我信用。如果你被你无法控制的力量要求使用缩写,至少使用“D.A.Wheeler”。不过,如果你能给我看一下礼貌地使用我的名字,相反改变它。一般来说,请列举人们实际使用的名字;请不要把它们改成别人的名字。谢谢。当然,这不适用于当面交谈;通常在那里房间里不是有那么多大卫·惠勒吗混淆:-)。

复制实验的详细数据

我坚信科学工作必须是可重复的。可悲的是,许多所谓的计算科学不再是一门科学,因为越来越不可能复制作品。这个问题已经不是什么秘密了;它在诸如维多利亚·C·斯托登(Victoria C.Stodden)《可复制研究:解决计算科学中数据和代码共享的需求》(Computing in Science&Engineering,2010).这也不仅仅是计算机科学;有一种广泛的科学中的复制危机.另请参阅报纸上的博客帖子为什么大多数心理学在统计上是不容置疑的.“错误积极心理学:未公开数据收集和分析的灵活性允许通过“约瑟夫·西蒙斯(Joseph P.Simmons)、莱夫·纳尔逊(Leif D.Nelson)和乌里·西蒙森(Uri Simonsohn)讨论一些可疑的做法这使得几乎任何东西都能被“实验证明”。科学不是真理的唯一来源,但如果你要称之为科学科学,它实际上需要科学。

相比之下,我提供必要的信息复制这部作品。对于ACSAC论文,请参阅我的Tiny C编译器(tcc)页面如何复制ACSAC实验,以及其他tcc相关工作.对于博士论文,请参阅博士论文详细数据的单独页面.这些为重复或扩展实验提供了足够的信息。

消除误解

有些误解似乎特别难以消除,所以让我在这里(也)反击他们。

DDC方法确实如此假设两个完全相同不同的编译器将产生相同的二进制输出,给出相同的输入。

我在ACSAC的论文中说过,在论文中也说过,但不知怎么的,它并没有被接受,所以让我再试一次。

ACSAC论文和论文都有假设不同的编译器产生相同的结果。事实上,两者都明确表示不同的编译器通常会生成不同的结果。事实上,正如论文所述,这是一种改进如果受信任的编译器为不同的CPU体系结构生成代码而不是被测试的编译器(例如M68000和80x86)。显然,如果他们正在为生成代码不同的CPU,两个编译器的二进制输出不能在一般情况下总是相同的!

这种方法要求受信任的编译器能够编译被测试编译器父级的源代码。您不能使用Java编译器直接编译C代码。

学究们:是的,有时可以编写这样的机器代码运行在多种截然不同的CPU架构上,取决于体系结构。你甚至可以设计代码确定它在哪个体系结构上运行,然后跳转到该架构的“正确”代码。这些将利用各种机器代码的精确值,并且当然是聪明的黑客。但如果你想这样做,胖二进制具有多个段(每个段用于不同的体系结构)这是一种更好的方法&它们的设计目的是干净利落地做到这一点。无论如何,这不是重点;关键是编译器未经测试和受信任的编译器需要生成与输出相同的代码。

非确定性硬件在DDC中可以使用

DDC确实要求父编译器必须是确定性的当它编译被测试的编译器时。那是一样假设两个不同的编译器总是产生相同的结果。编译器是确定性的,如果在相同的输入上运行两次(使用所有相同的选项标志等),它产生相同的输出。你可以使用随机数生成器,只要你给用户随机数发生器种子的控制(例如,gcc有一个用于设置种子的命令行选项)。例如,在Unix/Linux系统上,您应该能够执行以下操作:

$mycompiler input.c#编译,将结果存储在“a.out”中。$mv a.out a.out.saved#保存旧结果。$mycompiler input.c#再次执行$cmp a.out a.out.saved#如果始终相同,则为确定性。

这是一个相对简单的约束,也是大多数编译器作者的一个约束无论如何都要为true(因为非确定性编译器很难调试)。一般编译程序确定性,可能嵌入式时间戳异常-我将讨论如何处理在论文中嵌入时间戳。有时您可能需要使用标志(例如,设置随机数GCC C++编译器中的生成器种子)。

父编译器可以在内部使用以下构造单个非确定性(例如具有非确定性调度),但如果是这样,则必须使用以某种方式确保输出在每个执行都给出了相同的输入。当今的底层CPU具有各种非确定性属性(例如,从线程多个核心,或时间差异);“现代CPU固有的随机性和复杂性顶部通用操作系统放大这种固有的随机性[“Linux内核固有随机性分析”作者:Nicholas Mc Guire、Peter Okech和Georg Schiesser]。但如果CPU是如此不确定,以至于您无法按特定顺序可靠地写入数据,您无法运行编译器或任何其他程序。因此,父编译器只需以确保这些影响不会影响其结果。例如,父编译器可以使用锁定以确保线程调度变化不会导致结果的变化。实际上,开发人员倾向于这样做。

可信编译器(ACSAC论文中的“编译器T”,以及论文中的“编译器cT”)不需要确定。

参见本文中的假设sP_portal_and_derminantial如果你想了解更多细节。

DDC使用可信编译器从根本上提高了可信度

过去的一些方法使用了第二个编译器,但它们基本上只是切换了您必须完全信任的编译器。事实上,如果你从一个不明真相的人转变过来,事情可能会变得更糟编译器转换为被破坏的编译器。

相反,DDC使用额外的编译器作为检查在第一个。这从根本上改变了事情,因为现在攻击者必须同时颠覆原始编译器,全部的DDC中使用的编译器。颠覆多个编译器要比颠覆一个编译器困难得多,尤其是因为防御者可以选择在DDC中使用哪些编译器并且可以在执行攻击后选择DDC中使用的编译器。

为什么不使用可信的编译器?

使用不同的可信编译器会大大增加确信编译器可执行文件与其源代码相对应。当第二个编译器用作DDC的一部分时,攻击者必须颠覆多个可执行文件和可执行生成过程来执行未经检测的“信任”攻击。如果您只使用受信任的编译器,你又回到了原来的问题,我将其视为对单个编译器可执行文件的完全信任可行的验证过程。

此外,如中所述第4.6节,可信编译器可能不适合的原因有很多通用。它可能很慢,生成的代码很慢,为与预期不同的CPU体系结构、成本高或不理想软件许可限制。它可能缺少多用途所需的许多有用功能。在DDC中,受信任的编译器只需要能够编译父级;它不需要提供其他功能。

最后,请注意“可信”编译器可能是恶意的并且在DDC中仍然工作良好。我们只需要有理由相信任何触发因素或有效载荷在受信任的编译器中,应用时不会影响DDC进程编译器未经测试。这很容易证明。

应用DDC本身能保证编译器不是恶意的吗?

否,应用DDC就其本身而言不保证编译器不是恶意的,或者编译器没有做什么让您感到惊讶的是,编译器没有缺陷。例如,2016年发现默认情况下,Microsoft Visual Studio 2015 Update 2正在悄悄地将遥测调用插入编译程序,尽管这没有很好的记录,可能会损害隐私。这不是DDC通常可以检测到的那种情况。

通过DDC测试简单地说,您可以阅读编译器源代码以查看编译器做什么,而不必审查可执行(二进制)代码。但这是一个重要的区别:开发人员习惯于在源代码中,因为这是他们通常做的。DDC将一个棘手的挑战转变为一个正常的审查过程。

“完全”是什么意思?

我说的“完全”是指“信任攻击可以是发现并有效应对“(正如我在论文中所说)。一点背景可能有助于说明我为什么使用这个词“完全”。

首先,抱怨人们信任他人是浪费时间。必须在现代社会中信任他人。没有人种植自己所有的食物,用自己的食物建造自己的庇护所材料,并自行提供所有其他需求;我们都信任别人。然而,存在严重的系统性问题如果你不能独立验证你信任的东西。你应该努力“信任,但验证”.

我认为信任攻击造成的根本问题是独立核实你所依赖的是什么是不切实际的(可执行文件)对应于其人类可读表示(源代码)。这是因为程序处理程序可以破坏人类审查的内容和实际使用的内容之间的关系。肯·汤普森(Ken Thompson)的论文没有题为“对信任的反思”;它是“关于信任的思考”。我再次认为问题不在于信任,但缺乏有意义的独立核查程序。

有了DDC,我们现在有了一个实际过程独立验证源代码和可执行文件对应。DDC公司解决问题我们缺少一个实用的独立验证过程用于程序处理程序(如编译器)。

我认为重要的是我们理解任何结果的局限性。第8.14条详细解释了攻击者如何破坏DDC。因为DDC已经用正式的数学证明证明了,这个只有对付DDC的方法是伪造其中一个证明假设。辩护人可以做出这种捏造非常困难。例如,这个防守队员而不是攻击者,可以选择编译器用作可信编译器;防守队员甚至可以自己写。的确,一个不明智的防御者可以依赖于不是真正的多元化,但第6节描述了如何获得这种多元化。一旦防守者知道多元化是一个目标,防守者可以想出各种方法来提供帮助。

我的目标是创建一个独立核查流程。DDC提供了一个独立的验证过程可以实际应用。我将DDC进程应用于四个不同的编译器可执行文件,其中之一就是广泛使用的gcc。因此,DDC完全满足了独立验证过程的需要这是可以实际应用的。

那我为什么要用这个词在论文标题上?嗯,我需要找到一些方法区分ACSAC论文和博士论文的标题。我意识到我以前的ACSAC论文有一个重要的局限性:它只适用于自父编译器。许多编译器不是自父的,因此,旧的ACSAC论文进程无法应用于许多正在使用的编译器可执行文件。相比之下,2009年的论文可以针对所有编译器,不管你有没有做父母。因此,论文“完全”提供了一个过程用于验证编译器可执行文件,无论它们是否为自父级。我应该注意,即使我想,我现在也不能更改标题:-)。

把这个应用到硬件上怎么样?

我提到将这种DDC方法应用于硬件在论文和ACSAC会议上。显然,如果你的软件没问题,但硬件被破坏了,你还是被颠覆了。ACSAC的演示和论文对此进行了更详细的讨论。DDC可以应用于硬件,也可以应用于软件。正如我还提到的,有两个问题领域:法律和技术。

法律问题是越来越多的芯片设计师芯片制造商无法合法地知道什么是想象上的成为筹码。例如,芯片上使用的各种“IP核”的开发人员通常禁止芯片设计师和制造商获得或使用此信息。

关键技术问题是创建一个有意义的硬件“平等”测试。我推测各种技术,例如扫描电子显微镜,可以用来帮助实现相等测试。其他硬件验证机制(例如,参见半导体IP验证更快),可能也发挥了作用。但从根本上来说,对硬件(与软件相比)。我在论文中引用了几篇关于这方面的论文。你可以从从那以后发表的论文中了解更多关于这一挑战的信息,例如“隐形兴奋剂级硬件特洛伊木马”作者:Georg T.Becker、Francesco Regazzoni、Christof Paar、,和Wayne P.Burleson(Bruce Schneier简要讨论了这一点),以及Karen Mercedes Goertzel的《集成电路安全威胁和硬件保证对策》(CrossTalk,2013年11月/12月)[备用URL].《A2:模拟恶意硬件》作者:Kaiyuan Yang、Matthew Hicks、Qing Dong、Todd Austin和Dennis Sylvester展示“制造时间攻击者如何利用模拟电路创建硬件攻击小型(即只需要一个门)和隐身(即。,在影响芯片之前需要一个不太可能的触发序列功能)。"密歇根大学的研究人员在2016年展示了一种名为A2的被破坏的处理器; 它可以由芯片厂的一名员工种植。

然而,虽然存在挑战,但也有希望。如中所述Samuel K.Moore的《X射线技术揭露芯片秘密》(IEEE综览, 2019-10-07,瑞士和美国的研究人员拥有一种非破坏性技术有能力在不损坏芯片的情况下对整个芯片进行反向工程。这种方法称为眼科的X射线分层成像,可能“被使用集成电路设计师验证制造的芯片匹配他们的设计。"

对抗被破坏的硬件是这无疑是一个潜在的未来研究领域。一般来说,我认为逻辑硬件验证。日益增长的半导体设计问题一个特别容易理解的关于硬件验证,也称为验证差距。

软件专利和应用程序编程接口(API)版权

这里描述的方法只有在您可以创建计算机语言(编译器)的替代实现。这样做没有技术问题,但有些组织试图使合法地创建备选方案实现。

创建或分发替代实现的任何限制对计算机语言的任何用户都会造成危险的威胁计算机语言。它还对开发的程序的任何用户造成威胁(直接或间接地)。

计算机应用程序编程接口(API)和语言通常是被认为不在版权范围内。特定实现和他们的文档可以受版权保护,但API和语言是基本理念不仅仅是固定表达式。这一点早就被理解了,但2012年(美国和欧洲)有许多裁决让这件事更清楚。。。虽然有一些风暴云威胁到这一点。这个Oracle诉谷歌“订单RE版权Java应用程序编程接口的某些复制元素”2012年发现“只要用于实现方法的特定代码不同,根据《版权法》,任何人都可以自由编写自己的代码执行与任何方法完全相同的功能或规范在Java API中使用。声明或方法标题行是相同的。根据Java规则,它们必须相同才能声明方法指定相同的功能“即使实现是不同的。当只有一种方式来表达一个想法或功能时,那么每个人都可以这样做没有人能独占这个表达。而且,虽然Android方法和类名可以与Java中的对应名称不同并且仍然在工作,版权作为法律问题,保护从来没有延伸到名字或短语。。。此命令结构是在因此,《版权法》第102(b)节不受版权保护。”(格罗克劳将此作为文本.)同样,欧盟法院裁定在SAS Institute v.World Programming Ltd.案C-406/10的判决中,“计算机程序和编程语言的功能不受版权保护。”(以下是C-406/10的实际判断.)根据美国法律,版权不包括任何“理念、程序、过程,系统、操作方法、概念、原理或发现”;历史和理由不仅仅是想法)在中给出“为什么版权法排除系统和帕梅拉·萨缪尔森(Pamela Samuelson)《保护范围内的进程》.然而,2014年5月9日,联邦巡回法院部分推翻了地区法院的裁决,做出了有利于甲骨文的裁决关于版权问题,并将合理使用问题发回地区法院。我希望这将被狭义地解释;如果从广义上解释,那么版权可能会有效地阻止未来的所有竞争。实际上,软件必须相互协作;如果是公司可以阻止兼容的实现,然后该公司可以有效防止有意义的竞争DDC等验证措施。请参见计算机科学家要求最高法院裁定API不受版权保护有关的详细信息API和版权。

可悲的是,正如论文。请参见我的软件专利页面了解更多信息。

关于论文的其他想法

我在提到“可信编译器”时使用了“可信”这个词。我应该注意到单词之间有很大的区别“值得信任”和“值得信赖”。如果有证据表明某物值得信任,那么它就是可信的;如果有人信任某件事,那么它就是可信的(希望是因为他们已经信任了确定它是可信的)。如果使用DDC,则需要使用受信任的编译器,因为信任其结果,顾名思义,它是可信的。应该选择可信编译器作为可信编译器,然而。

好消息是你不需要使用完全完美的,永不出错的编译器;这样的编译器很少见。相反,您只需使用满足条件的编译器在本文中描述,这是更容易满足的条件。

我试图总结一些关于如何使用在我的短文中证明事物的工具“如何自动证明材料”.

我的论文发表后,我得知另一个被颠覆的编译器示例(在信任的意义上)Mike Stute的答案“程序员最可怕的噩梦是什么?”.他试图修改程序,但发现无法成功。经过15天的工作,“我突然意识到它在编译器中。。。每次编译并运行原始代码时将潜意识消息代码放入源代码中。。。几天后。。我们从源代码重新编译编译器。这解决了……但它没有。。。这个贪吃的学生毒害了编译器已重新编译。。。我们还发现,如果编译了/sbin/login,它将在后门允许任何使用特定密码的人以root用户身份登录。这台计算机可以通过调制解调器和Tymnet访问。最后这引起了计算中心的注意。天才!但是把它放在一个可怕的原因上。"

信用到期时的信用

正如我在论文中明确指出的那样,我没有想出最初的想法用于DDC对策。这个原创想法是聪明绝顶的亨利·斯宾塞梦寐以求的.然而,他从未追求过它;事实上,随着时间的推移,他已经忘记了这件事。我用了他几句话来描述他的想法,并对其进行了详细阐述,包括对其更详细和分析的描述,以及证明和证明。例如,他最初的做法是假定自己为人父母,我的博士论文消除了一个限制。我感谢他最初的想法,以及此后他提出的有益意见。

我还想赞扬那些让世界意识到这个问题的人首先是保罗·卡格、罗杰·谢尔和肯·汤普森。Paul Karger和Roger Schell对Multics的开创性分析这是第一次发现这个问题。解决问题的关键一步是首先知道存在问题!我和保罗·卡格进行了几次很好的对话,他非常对这项工作充满热情,并提供了一些有益的意见。悲哀地,保罗·卡格于2010年去世这是全世界的损失;好消息是,当他去世时,他知道我的解决方案对此感到非常高兴。我也和罗杰·谢尔谈过这件事。我还要感谢肯·汤普森(Ken Thompson)成就)证明了这一攻击并使更多人意识到这个问题。

谁在谈论它?

第一个教学大纲包括我的ACSAC 2005论文作为必读材料CSC 593:安全软件工程研讨会,北肯塔基大学詹姆斯·沃尔登博士2006年春季授课。他把我的论文与肯·汤普森1984年的经典论文配对反思论信托.这也是一节课的主题乔治·梅森大学(GMU)计算机安全高级主题:网络身份、权威和信任(IT962)由Ravi Sandhu教授。我今天有幸来访并亲自为2006年春季会议做了报告。多特蒙德理工大学Lehrstuhl Informatik VI(Ulrich Flegel博士和Michael Meier博士)(WS2007/2008)也包括在内。这在Linux勒德人播客#21(2014年8月22日)1点41分开始也。

ACSAC的论文在许多地方被引用,包括“增加开源软件集成国防部非保密桌面”史蒂文·安东尼·谢尔(Steven Anthony Schearer)(2008年6月)海军研究生院(NPS)论文,“入侵容忍分布式系统的实用性如何?”Obelheiro等人。(2006年9月),里斯本大学信息学系、和博士论文“用于文件完整性检查的防篡改对等存储”作者:Alexander Zangerl,邦德大学信息技术学院(2006年8月).

ACSAC文件已在许多地方被提及或讨论,包括Bugtraq公司,comp.risks(风险摘要),Bruce Schneier的博客(Crypto-Gram的来源),Lambda终极,SC-L(安全编码邮件列表),LinuxSecurity.com,Chi Publishing的信息安全公告,维基百科的“后门”文章,打开Web应用程序安全项目(OWASP)(邮件列表),和其他。

特别是布鲁斯·施耐尔的页面包括关于它的长篇评论,以及两者他的网站和Lamba-the-Ultimate有各种各样的博客条目。文章开源是安全的讨论了这篇论文及其影响,特别是最后可以通过源代码分析做出非常有力的声明。

BartK的“击败信任攻击”总结博士论文;这触发了热烈的红人讨论2013年9月.

有一个热闹的Y Combinator《黑客新闻》论文讨论2016年10月.

加密货币软件的多样化双重编译作者:Niklas Rosencrantz,2023年,KTH,电气工程与计算机科学学院(EECS))是后续工作。其摘要是:“信任攻击是软件供应链的特例攻击。本报告中的项目命名为多样性双重编译对于加密货币(DDC4CC),演示并解释了一种防御用于加密货币软件抵御信任攻击。DDC4CC公司包括一个实施信任攻击和针对加密货币被盗的假想辩护比特币区块链。这种攻击的动机很容易要明白:对手可以获得大量货币资金通过操纵经济或分散的金融系统。对于一般来说,供应链攻击的结果可能是势均力敌的更严重。对手可以控制整个组织,甚至属于组织客户的系统,如果链条受损。当目标天生就是由于对供应商的信任和对供应的信任而易受攻击链,即硬件构造者和软件作者,上游开发团队以及供应中的依赖关系链条。"这是一篇硕士论文。

这篇论文不寻常吗?

当然。特别是,本论文将不经常合并的技术领域。实际演示涉及分析机器代码(不仅仅是汇编代码!)由C编译器生成,以及由Lisp生成的S表达式。收件人证明这真的很管用,我最终使用一阶谓词逻辑(数学逻辑符号)和有助于自动化其使用的各种工具。我的数学模型最终不得不考虑到以下内容不同的文本编码系统,因为我希望模型准确地模拟真实世界,足以真正对抗攻击。一些论文深入探讨了机器代码的技术细节,而另一些则飞入数学证明的抽象;两者兼而有之的人要少得多。坦白地说,我认为不寻常的组合会产生结果更有趣;我希望你也这样做。

很多人当然我所做的一切都无法实现,所以我尽我所能证明它是正确的。我不仅仅提供数学证明;我提供了正式的证据,每一步都有详细说明(数学书中的大多数证明都“跳过细节”,但我没有)。我以希尔伯特(3栏)的风格提出了证据,并给出了理由绝对是每一步。我直接使用了一个证明工具的输出;我本可以按摩一下清晰,但通过直接使用输出,我避免了我所产生的费用这是一个转变中的错误,更重要的是我可以用一个单独的工具(常春藤)仔细检查校样。很多人没有这方面的背景数学领域,所以我给出各种步骤的来源,我解释详细说明每个开始的数学陈述。

DDC的现实应用

本节讨论DDC在现实世界中的应用。我知道至少有一个真实的DDC应用程序,专门用于GNU Mes C编译器。所以让我们讨论一下!

DDC应用程序:GNU Mes C编译器增强

GNU网格“用于引导GNU的Scheme解释器和C编译器系统。自版本0.22以来,它再次帮助将大小减半当前正在使用的不透明、不可见的二元种子在GNU Guix的Reduced Binary Seed引导程序中。最终目标是为了帮助创建一个完整的源代码引导程序,作为可引导程序的一部分为类UNIX操作系统构建工作。"

换言之,这个想法是GNU Mes如果值得信任,就可以作为从源代码重建其他一切的起点您更加确信源代码是一个准确的表示。GNU Mes可以反过来用于引导整个发行版special用于引导GNUGuix(一个完整的操作系统)。但是,如何确保GNU Mes的可执行文件是可信的?这似乎是一个鸡和蛋的问题。获得信心的一种方法是DDC。

帖子Mes C编译器的可复制引导描述了他们应用DDC来获得Mes C编译器的信心二元的。他们使用了三种不同的分布(GNU Guix、Nix和Debian)使用三个不同的GCC主要版本重新编译GNU网格。他们后来也使用了tcc编译器(尽管有详细说明粗略)。在所有情况下,他们都重新创建了GNU Mes的逐位相同结果C编译器!

与所有实际应用一样,存在局限性。DDC必须仅使用受信任的进程和程序执行,在这种情况下,“可信”意味着有“合理的信心,它没有触发和影响DDC结果的有效载荷”(DDC论文第6节)。

这里描述的应用程序显示了几个不同的分布使用不同的可执行文件会产生相同的底层结果。然而,其中三个应用程序使用相同的编译器,特别是GCC(尽管版本不同)。这些测试使用相似且高度相关的分布;他们甚至使用许多相同的底层组件,如glibc、Linux内核等打开(尽管版本不同)。

所以,尽管如此使用DDC,这确实增加了信心,它只能在有限的程度上增加信心,因为检查系统相对相似。他们希望尝试使用偶数未来会有一组更加多样化的编译器,这将提供更大的信心。

这是一个很棒的DDC应用程序,我相信这是第一个公开承认在二进制文件上使用DDC(超出了我的范围)。基本上,GNU Mes旨在提供一个安全的起点,并且DDC可用于验证GNU Mes是否提供了一个安全的起点。此应用程序DDC的精彩的.

一些相关材料

许多人在相关领域工作过,特别是,实施可复制(确定性)构建(它可以精确地重新创建给定源代码的可执行文件)或者证明程序做到了他们所说的。我提到了一些问题和对策“应对发展环境攻击”在旧金山举行的2015 RSA大会上(这是Dan Reddy和我的演讲)。

这里有一些提示。

工具链攻击:真实的和声称的

它是重要的保护开发环境,包括它的开发工具链。肯·汤普森在20世纪80年代演示了对工具链的攻击,这是一次全面的“信任”攻击。我的论文还讨论了对Delphi编译器的攻击。

Ken Thompson真的在现实生活中发动了他的“Trusting Trust”特洛伊木马攻击提供完整Usenet消息的副本,讨论肯·汤普森证明的颠覆。更多可用来源mail-archive.com谷歌群组.值得注意的是“编译器从未发布)外部”,但那是因为肯·汤普森(Ken Thompson)是合乎道德的,并不是因为他做不到。

也许更重要的是,今天Ken Thompson的源代码攻击现在可用并已注释。“运行‘关于信任的思考’编译器”拉斯·考克斯(2023-10-25)分享了该源代码,并对其进行了详细的讨论。此版本是已更正没有持续生成的版本生成的编译器的稍长版本。你可以用做实验对基于web的模拟器的攻击.

我还想纠正汤普森工作中的一个小问题。有一次,我认为被破坏的编译器没有被检测到。我没有证据表明它被检测为成为攻击,但由于Ken Thompson实施了他的信任实施,它最终失败了。这个Ken Thompson于2021-09-20发布的帖子,标题为“[TUHS]Thompson特洛伊木马已投入使用”注意,每次重新编译时,它都会增加另一个字节。他们注意到了这个奇怪的现象,然后“他们一直玩到打破了奎因部分”(它是如何工作的)。Ken指出“多余的字节是我的错误”并说“我不确定……他们是否意识到发生了什么。”这是在黑客新闻中讨论.认为未来的攻击将是错误的是不明智的,特别是因为很容易检测到这种错误(确保被颠覆的编译器每次都生成相同的字节)。现在发布的攻击版本不包含此错误。

“章鱼扫描仪恶意软件:攻击开源供应链”阿尔瓦罗·穆尼奥斯(Alvaro Muñoz)(2020-05-28)讨论Octopus Scanner恶意软件,“旨在枚举和后门NetBeans项目,它使用构建过程及其生成的工件来传播自己。"

暗影锤行动于2019年3月由卡巴斯基实验室披露,它所做的一件事就是破坏开发工具。如中所述“Operation ShadowHammer利用了软件管道中的弱点”法赫米达·拉希德,IEEE综览2019年5月1日,“攻击者还针对至少三家游戏公司。。。攻击者对目标的集成进行了单线更改开发环境(IDE),开发人员使用的软件程序编写代码。结果是,每当Microsoft Visual Studio使用特定的Microsoft拥有的库编译代码,IDE使用名称类似的库文件。编译器和开发平台是软件供应链。。。少数开发人员机器上的一个受感染的编译器可能会导致成千上万的特洛伊木马软件应用程序安装在数百万最终用户计算机。“这是一颗有毒的种子。把有毒的种子种在安全的地方,它就会变成有毒的树,结出果实。”。。。由于编译器从链接库和其他组件中提取相关代码段,因此使用被篡改的库意味着开发人员不想包含的代码被添加到应用程序中。源代码审查不会发现问题,因为问题不在原始代码中,而且开发人员不知道备用库。Kamluk说:“当编译器对你撒谎时,无论源代码是什么,你的产品都会有后门。”。"

2015年,有消息称超过4000个苹果iOS应用程序被破坏进入苹果应用程序商店通过名为XCodeGhost的攻击。这次攻击说服了开发人员使用一个被颠覆的版本苹果的XCode开发环境。许多流行应用程序通过XCodeGhost感染,包括《愤怒的小鸟2》和微信。FireEye估计XcodeGhost为4000多个应用程序添加了恶意代码。CNBC报道那个苹果正在“清理其iOS应用商店,以删除在第一次大规模攻击流行移动软件商店时发现的恶意iPhone和iPad程序。几家网络安全公司报告发现一个名为XcodeGhost的恶意程序嵌入数百个合法应用程序后,该公司披露了这一努力。。。苹果表示,黑客将恶意代码嵌入这些应用程序中,说服合法软件的开发人员使用苹果软件的受污染、伪造版本来创建iOS和Mac应用程序,即Xcode。"路透社也有类似报道.维基百科有一篇关于Xcode重影 Manish Goregaokar的《关于信任生锈的思考》演示了“信任信任”攻击在Rust编程语言。这不是一次攻击,这是一次攻击的演示,但这是一个很好的演示。有一个黑客新闻重新编辑讨论它。

“一家风投公司是如何破坏开源社区的”(大纲, 2017)提出了一些关于风投投资初创公司Kite的行动。文章指出,凯特为了Kite的利益修改开发人员工具。这与信任攻击完全不同,但这确实表明,开发人员的工具是一个潜在的目标。

安全构建

以安全的方式构建软件很重要。

Qubes建造过程中的安全挑战有一个有趣的讨论。他们的目标是:

  1. “我们想构建(和分发)非后门软件。
  2. 我们不希望构建过程本身能够损害开发人员的机器。"

为此,他们专注于以下任务:

  1. “为了验证所有输入源、git repo提交和其他组件(例如我们也使用的股票RPM和DEB),即它们具有由我们选择信任的选择密钥创建的适当数字签名。”
  2. “为构建Qubes OS中不太受信任的部分提供强大的沙盒,例如各种模板,这样即使(正确签名的)源或其他组件被证明是恶意的*,生成的系统的其余部分,例如Xen虚拟机监控程序和dom0,也不会受到影响(开发人员的机器也不会受影响)。”

其中包括一个重要的脚注:“当然,人们应该理解,仅仅是包或源被正确签名的事实,即使有密钥我们决定信任,但不保证代码没有后门。如果其中一个开发人员被证明是恶意的,或者被胁迫引入后门,例如通过某种搜查令或勒索,或者如果他们的笔记本电脑遭到某种程度的破坏,则可能会发生这种情况。我们愿意为此类潜在情况辩护。"

可复制(确定性)构建

创建可复制版本(也称为确定性构建)是检测许多开发时攻击的极好方法,并且是应用DDC的前提条件。这个可再生建筑.org网站上有很多关于这个主题的信息。视频可复制版本:战壕中的两年(2017年)总结了他们的工作。他们开发了一种叫做差速器我希望我有!有关相关主题的更多信息,请参见下文语义上可复制的构建.

这里有一些你可能会觉得有用的提示。

Tails操作系统映像是可复制的。验证尾部图像的再现性描述了独立再现和验证图像的过程。

“防止SolarWinds等供应链攻击”(Linux基金会博客帖子)作者:David A.Wheeler(我!)讨论了如何对抗颠覆性的构建过程,比如SolarWinds中的构建过程,通过使用已验证的可复制版本.基本上,使用可复制的构建来独立验证那个您的构建结果是正确的。关于太阳风猎户座的详细技术讨论颠覆,包括对SUNSPOT(插入后门的恶意软件)和SUNBURST(后门本身),请参阅众袭情报团队(2020-01-11).

电报支持可复制的构建以便其他人能够验证它的开放源代码与苹果应用商店和谷歌游戏。截至2021年初,它被认为是“有点实验性的”。Telegram指出,可复制构建对iOS来说尤其困难由于苹果当前的政策和MacOS限制。正如他们所说:(1) “苹果坚持使用FairPlay加密来“保护”甚至从“应用程序盗版”中免费获取应用程序,从而获得可执行文件没有越狱设备,应用程序代码是不可能实现的。“和(2)“macOS不支持Docker这样的容器。”这仍然是可能的,但具有挑战性。

Mike Lai(微软)的《源代码和可执行文件》讨论了可复制构建和在NIST/DHS软件和供应链保证(SSCA)上给出2019年末论坛。

有人告诉我俄罗斯“无文件功能”(NDF)认证制度可能特别要求演示可复制的构建,微软至少有一次满足了NDF的要求。然而,我无法证实这一点。一个问题是我不会说俄语。也许有人可以看看这样的网站梯队网站来确认这一点?

“通过多样化的双重编译和Yrjan Skrimstad《可复制建筑》(奥斯陆大学,2018年)也许是最接近我工作的论文(因为它建立在它的基础上)。在我的工作中,我注意到可以使用多个“可信”编译器(即两个以上的祖代编译器)增加攻击者的难度。Yrjan Skrimstad的这项工作进一步扩展了这一点当有两个以上这样的编译器时的影响。它演示了信任攻击(使用奎因)在Go编程语言中,然后并演示如何使用DDC(与3位祖父母)检测攻击。它还讨论了DDC和可复制构建之间的关系。Yrjan Skrimstad的这项工作在GitHub回购yrjan/不可信价值_go.

Tor项目非常关注可复制(确定性)构建:

这个Yocto项目不仅有可复制的构建,而且有其CI/CD管道验证每个版本都是可复制的.

Jos van den Oever:“这真的是这个软件的源代码吗?”(2013-06-19)关于尝试从源代码重新创建可执行文件。有时情况还不错,例如Debian,“从Debian源程序包构建的二进制程序包是与发布的二进制包不同,但不同之处在于仅限于时间戳和可执行文件中的构建id。”但有时很难,就像我几年前发现的那样,因为你经常需要比你能得到的更多的构建信息。您需要的远不止源代码和构建脚本;你需要要知道所有相关构建软件的确切版本配置等。但确实如此可能的记录所有这些信息,以便这个过程可以重复。。。你可以重复这个过程以确保你什么都有。如果你记录了这些信息,那么你的问题是“我如何知道我的构建工具不是恶意的?”这时,DDC前来救援。。。因为DDC可以帮助你验证一下。

Simon Butler、Jonas Gamalielsson、Björn Lundell、Christoprove Brax、Anders Mattsson、Tomas Gustavsson、Jonas Feist、Bengt Kvarnström和Erik Lönroth,2022-11-29,《软件质量杂志》,“企业采用和使用可复制构建的开源和闭源软件”从业务角度讨论可复制的构建。“通过与软件从业人员和业务经理的访谈,这项研究探讨了在主要和次要软件部门以及业务和支持其采用的技术原因。我们发现企业使用安全关键和安全域中的R-B,以及R-B对可追溯性和支持协作软件有价值发展。我们还发现R-B被视为工程过程,被视为软件质量的标志,但没有切实的价值主张。有充分的工程理由在工业软件开发中使用R-B,以及原理在源代码和二进制提供之间建立通信进一步应用开发的机会。"这是一篇开放存取的论文,所以任何人都可以阅读。

这个Debian ReproductiveBuilds项目有成功的目标可以逐字节复制Debian中每个包的每个构建。他们做了一个许多我是进步的关键看到它真的很高兴。他们的与可复制构建相关的已知问题概述显示了通常导致问题的原因;这些包括来自各种原因的嵌入生成的时间戳(这是一个大的)和随机/无序排序。例如,SOURCE_DATE_EPOCH规范提供了一种简单的机制,将复杂的时间戳问题转化为简单一些。此外来源.debian.net网站提供对Debian源代码的方便浏览访问。Debian是如何试图关闭CIA并使软件再次值得信任的还对此进行了讨论。

Fedora的可复制版本是与类似的项目确定性地复制Fedora的包。

F-机器人卫报项目正在为Android开发可复制的构建。有关更多信息,请参阅LWN.net(LWN.网络),关于Guardian(开发人员的工具)第一个可复制版本的信息,他们在实用程序Checky上的成功.

我是如何为Win32编译TrueCrypt 7.1a并匹配官方二进制文件的描述了确定性构建(具有可解释的差异)实现了TrueCrypt。这是一个能够实时运行的加密软件在基于文件、分区或磁盘的虚拟磁盘上进行加密,但它作者是匿名的,导致一些人担心可执行文件都是后门的。注:虽然它的源代码是可见的,但它没有使用标准的OSS许可证和它施加的限制可能意味着它不是OSS;许多主流Linux发行版都不认为它是FLOSS包括Debian、Ubuntu、Fedora、openSUSE和Gentoo.最近,TrueCrypt开发人员停止了开发它缺乏真正的OSS许可证可能会阻碍其他任何人支持它。

吉田是一种“面向安全源控制的软件分发方法[这样]您可以下载受信任的二进制文件由多个建筑商验证。”

流浪者旨在“创建和配置轻量级、可复制和可移植的开发环境”。塞斯·瓦戈简要讨论。

报纸Omar S.Navarro Leija等人的《可复制容器》将于2020年3月在第25届国际建筑支持会议2020年编程语言和操作系统(ASPLOS)(这是计算机协会(ACM)的一次会议)。本文“描述了DetTrace,一个用于Linux在用户空间中实现。"这看起来像真正地很有希望。这个实现是OSS(MIT许可证).

Buildroot是一种简单的机制通过交叉编译创建嵌入式Linux系统。

拜占庭Askemos语言层(BALL)Askemos分布式虚拟机.它为应用程序创建了一个“自主虚拟执行环境”与传统云环境不同的是专门设计用于提供容错和以防篡改。它在多台不同的机器上执行代码,运行库、编译器、操作系统等并比较加密签名。因此,这试图对抗各种低级别组件的破坏。

Christophe Rhodes讨论过钢铁银行通用Lisp(SBCL)的复制构建问题中的不同系统仍在进行可复制的构建可复制版本-提前一个月.虽然他的笔记是针对SBCL的,但它们说明了更一般的问题。他指出,SBCL与其母公司分离的原因之一CMCL将“实现其构建结果独立于用于构建它的编译器。”他的目标主要不是反击,而是消灭难以发现的错误:“…我们怎么知道没有奇怪的差异主机编译器潜伏,这不会明显影响正常运行,但会以后会引起难以调试的麻烦吗?(事实上,有很多这样的人,在不合适的时候突然出现)。我一直在断断续续地处理这个问题使通用Lisp代码成为SBCL!编译器编写充分可移植的,在不同的实现上执行它会生成按位相同的输出。因为只有那时,我们才能相信我们不会以某种不可预见的方式依赖于某个特定的特定于实现的详细信息。。。".以下是他(也许还有其他SBCL开发人员)发现并修复了以下问题:

  1. Common Lisp规范允许实现计算(write-to-string’(引用foo):相当零)作为其中之一“(引用FOO)”“‘FOO’.创建可复制的构建他们必须使用一种变通方法(包括函数名计数器)这样差异就无关紧要了。
  2. 反引号出现了一个相关问题:Common Lisp规范允许实现确定值是否合并,但这可以产生不同的结果;解决方案是更改代码从而保证其结果。
  3. 各种与设置相关的功能(例如集差、联合、交叉等)按顺序返回集合,这可能导致不同的生成。解决方案是对集合运算的结果进行排序,以强制它们到特定的已知顺序。
  4. 调用maphash直接影响Lisp图像。通常,当您遍历它们的内容,因此如果迭代,需要强制排序他们的内容。
  5. 实现定义的常量,尤其是most-protive-fix数和most-negate-fix数,还包括阵列尺寸限制和每秒内部时间单位。
  6. 一些函数(如random和sxhash)可以理解地有所不同,这导致访问模式不同。
  7. 这个分类Lisp中的例程未指定为稳定的,因此,当试图通过多个阶段使其具有确定性时,马厩式分拣机应改为使用。
  8. 数组的初始值是未定义的,所以不要依赖于它们的值!

需要注意的关键是,可以轻松创建编译器在其他编译器上具有可复制的(确定性)构建通常在现实世界中工作。。。但这是非常可行的。

有各种工具可以帮助您创建可复制的构建。例如,如果嵌入了构建路径,则可以强制修复目录值以使其可复制。有一些工具可以在不需要root权限的情况下启用此功能,包括我的工具用户-联合自动测试目录,以及类似的工具骄傲.

LF-Edge EVE致力于再现性。请参见EVE图像再现性EVE图像源下面是一个有趣的例子如何实施更高的标准。

语义等效的构建

可复制的构建对于显示包确实已构建非常有用从某些特定的来源,但有时很难做到。一种有用的退避是所谓的“语义等价构建”。

如文档中所述oss-reproducible工具(属于OSS插件),“项目生成是语义等价如果它的构建结果可以精确地重新创建(一点一点地可复制版本,或者在正常情况下,发布包和重建包之间的差异预计不会产生功能差异。例如,重新构建的包可能具有不同的日期/时间戳,或者其中一个可能包含类似.gitignore的文件,这些文件不在另一个包中,并且在正常情况下不会更改程序的执行。"

语义等价的构建被破坏的风险很低只要是已证实的在语义上等价。换句话说,验证包是否具有语义上等效的构建应对假定源代码并非恶意的风险,但有人篡改了构建或分发过程,生成一个内置包恶意的。构建生成不同的日期/时间戳是很常见的,或者添加或删除“额外”文件,如果原始文件源代码没有恶意。

它是许多的软件更容易(且成本更低)开发人员创建语义等效的构建,而不是总是创建完全可复制的构建。完全可复制的构建仍然是验证的黄金标准构建没有被篡改。然而,创建完全可复制的构建通常需要该包创建者改变他们的构建过程,有时是以实质性的方式。在许多情况下,语义等价的构建不需要更改,而且,即使需要更改,所需的更改通常也会更少。

OSS插件包含一个工具,可以确定给定的包是否语义等价。使包成为一个完全可复制的构建仍然很有帮助。完全可复制的构建是一种更有力的主张,并且您不需要一个复杂的工具来确定软件包是否完整可复制。即使如此,首先创建一个语义等价,以及然后解决遗留问题使其成为完全可复制的构建。

语义等价构建的预期用例(而不是完全可复制的构建)真正帮助人们在思考时做出风险决策关于引入外部软件。我主要是想处理开发人员决定提供可复制的构建,我必须估计可能性它被恶意建造(大概是决定是否建造的一部分该包安装起来是安全的)。我主要想将此过程应用于大多数非托管存储库像npm、PyPI和RubyGems一样,*而不是*像这样的托管存储库大多数Linux发行版的存储库(其中有其他反恶意构建的机制)。问题是我不能让开发者给我一个可复制的版本(我可以求求你,但那不是同一件事)。我正试图利用我掌握的信息做出正确的决定,不是我想要的信息。

威胁模型也有点不同。假设不是这样的“这些差异不可能造成损害”。假设“原始源代码是良性的,编码合理,没有造成损坏”。问题是,“这是不可复制的吗?”包很可能是从中生成的,即使它是不是可复制的版本?"

这里有一个例子可以阐明威胁模型。有可能是程序可以查找文件“.gitignore”并运行它(如果存在)。源代码回购可能没有.gitignore文件,但恶意软件包可能会添加.gitignore文件并将其填充恶意应用程序。这将导致恶意代码执行。然而,它也会“高度”怀疑源代码到运行一个“.gitignore”文件(这不是它们的目的),所以可以合理地假设源代码没有这样做。如果攻击者插入的文件*会*导致恶意代码要在一个合理编码的应用程序中执行,那将是一个问题。“合理的”很难真正写下来,但忽略日期/时间戳并忽略特定文件名的白名单似乎是一个合理的位置开始。

当然,理想情况下,一切都会有一个可复制的版本。既然那天不在了,我们该怎么做才能一点一点地吃呢朝着这个方向迈进?

简而言之,使包至少在语义上等价(并验证这一点)是对付被破坏的构建的一个很好的对策。

可引导构建

可引导构建重点是最小化引导二进制文件的数量。他们不仅对直接的“引导”代码感兴趣启动计算机,以及生成直接引导代码。可引导构建试图解决的问题是一个实际问题,也就是说,他们担心被破坏的引导代码。

在理想的意义上,他们想要建立“从无到有的编译器、解释器和工具”——当然你不能真正地从无到有,必有一个起点。DDC为可引导构建提供了一个很好的补充-可引导构建试图限制您所依赖的二进制文件,并且DDC可用于验证您所依赖的二进制文件。

这种方法的一个例子是阶段0.

另一个例子是建筑工-hex0,内核”,用于引导编译器,无需信任预先构建的二进制文件”。他们现在可以从Hex0引导POSIX内核并使用它用它引导跨平台C编译器。

形式化方法/证明

Xavier Leroy(OCaml的主要开发人员)正在使用Coq编写一个认证编译器,计算机证书,这保证了C的语义源程序保持为PowerPC程序集。的*规范*(不幸的是不是Coq证明)编译器后端作为GPL软件提供.

您可能还对MITRE Vlisp项目的结果感兴趣。Vlisp自述说:“验证编程语言实现项目已经开发Scheme编程语言的正式验证的实现,称为Vlisp。。。项目概述如下在Vlisp指南中介绍。还有更多关于Vlisp的可访问PDF.另一篇你可能会感兴趣的论文是乔纳森·A·里斯。“基于Lambda-Calculus的安全内核”。博士。论文。1995年2月.

秘密代码/恶意误导代码

在我的博士论文中,我注意到了故意编写的代码的问题(在人看来)它做了一件事,但实际上又做了另一件事。在我的论文中,我称之为“恶意代码”;最近术语“暗码”似乎变得越来越常见。不管怎样,这都不是一件好事。有一些比赛,如模糊V竞赛和秘密C竞赛表明这是非常可能的,2003年Linux上的一次未遂攻击内核表明,这不仅仅是一个学术问题。

如果你对秘密代码这个话题感兴趣,我建议你看看我的论文“非法源代码的初步分析”作者:David A.Wheeler,IDA文件D-13166,2020年4月(这是一个Perma.cc链接到D-13166的PDF).

构建(更多)可信硬件

一个相关的问题是开发(更多)受信任的硬件。由于很难确定硬件是否“等效”,因此攻击者可以通过多种方式破坏不属于信任攻击的硬件。破坏ASIC掩码特别容易,不幸的是很难检测。控制铸造厂的人很容易发动攻击很难检测到。我无法涵盖这个巨大的领域,但我想我应该对此做一些笔记。

首先,众所周知,可以对硬件插入攻击以后很难检测到。例如。,"A2:模拟恶意硬件展示了“制造时间攻击者如何利用模拟电路创建硬件攻击小型(即只需要一个门)和隐身(即。,在影响芯片之前需要一个不太可能的触发序列功能)。"它在第37届IEEE安全与隐私研讨会上获得“最佳论文”ComputerWorld有一篇关于它的文章.

一些对策。例如。,"使用门级信息流跟踪检测硬件木马(IEEE Computer 2016年8月)使用信息流跟踪发现硬件木马如a中所述UCSD文章,它通过为重要数据分配标签来工作就像加密密钥一样。这有一些价值,但它不是一种好的通用技术对抗任意特洛伊木马-如果特洛伊没有尝试侵犯了那个特定的财产?

显然,我们会喜欢拥有我们能拥有的电脑真正地直接或用作重要任务的信托检查“正常”计算机。我几十年来建议的一种方法可能是使用FPGA来实现一些计算机。FPGA也可以被破坏,特别是添加“kill switch”,但至少FPGA制造商对芯片的使用了解较少。

一组真正有趣的工作是"“值得信赖、免费(Libre)、支持Linux、,自托管64位RISC-V计算机“由加布里埃尔·L·索姆洛(请务必查看FOSDEM 2023演示”自托管(几乎)一路下滑").加布里埃尔·L·索姆洛使用FPGA构建了一个完整的硬件和软件系统。他通过实施RISC-V来实现这一点,这是一个开放的指令集当今的Linux系统支持。我特别高兴他指着我的DDC工作(微笑)。

截至2020年,Somlo的FPGA实现系统的速度约为65MHz。很明显比用GHzr测量的当前系统慢得多不过,如果你有耐心,这是一个可用的速度;它比过去几十年的计算机速度快得多。我还认为未来的版本可能是许多的速度更快,如果资源倾注其中。这项工作使用了许多现成的组件;我希望这些组件可以优化得更快。目前FPGA的容量不足也严重限制了其速度(2020年实施缺乏硬件浮点有限的一级缓存)。未来的FPGA系统可以开发更大的容量(和更多的RAM)以提高其性能。

其他

攻击者可以故意利用编译器错误编写以破坏程序的方式触发错误的代码。这是另一种编写恶意程序的方法(我在论文中讨论的一般主题)。此攻击与DDC的“信任”攻击不同计数器,但它肯定是相关的。报纸“使用编译器错误拒绝后门”作者Scott Bauer、Pascal Cuoq和John Regehr,Manul Laphroaig牧师的出口——受控教会通讯,2015年6月20日,演示编译器缺陷(公开的或发现的通过模糊化等技术)可以被利用。在他们的案例中,他们展示了如何苏多可能被利用通过innocent-looking代码。John Regehr的博客帖子关于“防范基于编译器的后门”(2015-06-21)指出了这一点,注意到“这种后门的优点包括微妙性、否认性和目标特异性”,然后他做出一些很棒的观点。他特别指出编译器开发人员需要将已知的错误编译错误修复为尽快使用fuzz工具;编译器是安全敏感的以一种通常不被欣赏的方式。开源软件包的维护者需要怀疑巴洛克风格提交补丁并考虑重写补丁。这种攻击比传统攻击更脆弱“信任信任”攻击,但它们可以在任何程序中发生,可能非常危险,目前很难检测到。短期内,最好集中精力检测和消除广泛使用的编译器中的缺陷。没有人会抱怨消除编译器缺陷,我们今天有很多可以使用的技术,如果编译器缺陷更难触发这些后门企图通常会变得更加明显。但这种短期战略是不够的;我希望人们也将制定长期战略。

B A Wichmann的“关于随机测试的一些评论”,国家物理实验室,泰丁顿,米德尔塞克斯,TW11 0LW,英国,1998年5月,讨论了为编译器创建随机测试。

凯格尔的建造和测试gcc/glibc交叉工具链有很多好信息。

GCC浏览器以交互方式显示GCC的程序集输出(给定各种输入)。

编译器资源管理器以交互方式显示各种编译器的程序集输出和语言。

A类奎因是一个“不接受输入并生成自己副本的计算机程序源代码作为其唯一输出。"编写攻击自己的编译器与奎因高度相关(取决于您的定义,你可以把它们看作是奎因的特例)。David Madore的“Quines(自我复制程序)”讨论更加详细的奎因。“如何编写您的第一个奎因程序”大卫·贝托尔迪(2019-07-26)奎因也解释道。也许是最神奇的奎因梅梅奎因继电器,一个毒蛇奎因它从一个Ruby程序开始生成Rust程序,生成Scala程序,该程序通过128种语言生成Scheme程序等。

RepRap项目正在开发廉价的3D打印机设计希望(最终)能够创造自己。非常有趣,而且在未来,可能非常相关。

这个打开校样网站鼓励开发“开放式证明”,其中实现、证明和所需的工具都是开源软件。

Mark Mitchell的“在GCC中使用C++没问题”(2010年5月30日,星期日17:26:16-0700)官方报道称“海湾合作委员会指导委员会和金融稳定论坛批准在GCC中使用C++。当然,没有理由我们使用C++功能只是因为我们可以。目标是更好编译器面向用户,而不是C++代码库。”Mark Mitchell后来解释说,他希望GCC使用C++谨慎地.对于DDC,这意味着将DDC应用于GCC代码库需要一个C++编译器(至少一个支持GCC使用的部件),而不是只是一个C编译器。我使用了英特尔的icc,它是一个C++编译器,所以它不会特别影响了我的榜样。。。它当然不会改变方法的有效性。

这篇论文有很多关于停顿问题的联系。计算机不能做任何事情的证据(暂停问题)是一段令人愉快的视频,展示了传统以一种聪明的方式证明了问题的解决。你可能也想看看超越计算:P与NP问题——Michael Sipser.

构建工具,如制作对于任何大型系统都很重要。改进品牌描述了我为make改进POSIX标准所做的努力作为make实现,特别是为了支持彼得·米勒的递归被认为是有害的.

杜松子后门很有趣——看起来加密后门本身就是后门。以下是一些有趣的评论马修·格林rpw公司.

杰夫·拉斯顿(Geoff Ralston)的《黑客DNA:CRISPR、肯·汤普森和基因驱动的故事》(2017年4月3日)讨论CRISPR,并顺便讨论肯·汤普森的作品。

《Locus》杂志上的“科里·多克托罗:恶魔出没的世界”(2017-09-02)注意到“世界上没有任何问题是我们要解决的……只要我们赖以生存的电脑正在背后悄悄地给我们治疗作为他们的敌人。"

编译器模糊化,第1部分讨论了模糊编译器的一些结果。

用模糊器打破Solidity编译器讨论他们如何将American Fuzzy Lop(AFL)fuzzer增强为Fuzzy C类语言Solidity编译器中的缺陷。

科幻小说故事Lawrence Kesteloot的《编码机器》(2009年1月)基于这些类型的攻击。

规范/标准

这个Open Trusted Technology Provider Standard(O-TTPS)1.1版:减轻恶意污染和假冒产品来自Open Group你可能会感兴趣。根据其网站描述,“O-TTPS是一个开放标准,包含一套组织指南、要求和建议,供集成商、供应商和组件供应商使用,以增强全球供应链的安全性和商用现货(COTS)信息和通信技术(ICT)的完整性如果正确遵守本标准,将有助于确保在COTS ICT产品生命周期内,包括以下阶段,防止恶意污染和假冒产品:设计、采购、建造、履行、分销、维持和处置。开放式集团可信技术论坛(OTTF)是一项全球倡议,邀请行业、政府和其他感兴趣的参与者共同努力,以发展本文件和其他OTTF交付成果。"

TUF(更新框架)帮助开发人员保护其新的或现有的软件更新系统。在系统级包管理器之间,特定于编程语言的包管理器/存储库和特定于应用程序的更新系统,周围有很多软件更新程序。。他们都需要确保安全。

如何获取以前的关键论文

本文引用了之前的关键论文,以下是如何获得这些内容(我提供了多个链接,以增加您获得它们的可能性):

使用OpenOffice.org/LibreOffice和OpenDocument的提示

我用过开放式办公室写论文,结果很好非常好.OpenOffice.org是一个编写大型文档的好程序。LibreOffice取代OpenOffice.org成为其继任者;LibreOffice从相同的代码开始,拥有一个更加活跃的社区。所以一定要去看看文件基金会的LibreOffice生产力套件.

我开发了一个乔治梅森大学(GMU)的OpenDocument模板这几乎自动完成了所有的格式设置。这样很容易集中精力阅读课文格式。

这个最重要的书写大型文档的规则使用LibreOffice或任何其他文字处理器是为了自动化一切,尤其是,始终使用样式.从未设置字符范围的字体大小、字体类型等或段落(一个例外:使用斜体/粗体强调单词或短语可以)。相反,所有格式信息都应附加到段落样式,然后确保每个段落都有正确的段落样式。对普通文本使用“文本正文”(而不是“默认”)“标题1”、“标题2”和对于标题,依此类推。类似地,使用Insert>Cross-Reference来引用文件;这样,程序可以正确地重新编号。

org让您可以控制单词如何中断(或不中断)在线上;有关详细信息,请参阅“在OpenOffice.org Writer中插入非中断连字符等的简单方法”(索维格·豪格兰).基本上,要获得对连字符的更多控制,请访问工具>选项>语言设置>语言并选择“已启用复杂文本布局”选项。现在您可以使用“插入>格式化标记”菜单插入更多控件格式设置过度。“无宽度无中断”字符,也称为“粘合”字符,“粘合”它之间的字符,以防止换行否则就会出现。类似地,插入“no-width optional break”字符时,表示org表示可以在此处插入换行符通常情况下,它不会这样做。您还可以插入非中断空格、非中断连字符和可选连字符。

在大多数情况下,段落样式应该使段落中断以正确的方式跨页(例如,段落样式应具有合理的默认“寡妇”和“孤儿”设置,以及标题段落样式应设置为“与下一段落保持一致”)。但在某些情况下,段落不会被打断页面很好,因为程序无法“理解”文本。例如,如果您的文本指向下一段,您可能需要右键单击该段落并设置“与下一段保持一致”。在特殊情况下,你可能也想要一个不同的寡妇或孤儿环境。

org支持公式,我经常使用这些公式。它的“堆栈”和“矩阵”选项有时对例如,多行公式。对于内嵌公式,我建议将公式边框设置为0。您可以在编辑公式时通过选择“格式”>“间距”,分类“边框”,然后将所有边界为0(实际上,我建议将其设为默认值)。否则,公式中会嵌入额外的空格,当您试着把公式和标点符号结合起来。

对于最终版本,我使用了Tools>Update All(工具>全部更新)来更新目录、交叉引用等),移动到开头并保存,然后运行文件>导出为PDF。

其他

在进行了无数冗长乏味的编译之后,Xkcd关于编译的漫画让我笑了。全局解决方案解决停滞不前的问题也是相关的:-)。

Dilbert也提到编译时间长:迪尔伯特2013-06-22 迪尔伯特2005-09-23 迪尔伯特1998-06-21.迪尔伯特曾经注意到“也许编译器程序本身有错误!”.Dilbert还制造很清楚为什么软件单一源策略是一个坏主意.

我举了一个简单的例子可读的Lisp s-表达式;这个可读Lisp s-expressions项目有用于curly-infix表达式的规范和实现,新语表达和甜语表达,这可以使Lisp符号a许多更容易阅读。

Mortality.pvs是如何用PVS表达“所有人都会死”的例子.

以下是如何在SGI IRIX上安装gcc.

ERESI公司(ERESI逆向工程软件接口)是一个“统一的多体系结构二进制分析框架基于可执行和链接格式(ELF)的操作系统。”。 developerworks有一篇关于ELF的好文章.Elfkickers公司由布莱恩·雷特(Brian Raiter)撰写,他还写道关于为Linux创建真正年轻的ELF可执行文件的Whirlwind教程阿尔伯特·爱因斯坦的相对论:四个字母或更少的单词.这个旧文章解释ELF的优势.

我试着确保这张纸能粘住走向未来。这里是我的论文“通过多样的双重编译全面对抗信任信任”的GMU页面,以及arXiv.org的副本“通过多样化的双重编译全面对抗信托”UMI ProQuest我的博士论文副本“通过多样化的双重编译全面对抗信托”(通过ProQuest搜索).org也有一份副本.这些只是带有相同信息的附加副本。我提交的PDF文件具有以下属性:
标题通过多元化双重编译全面对抗信托
作者大卫·A·惠勒
日期2009年秋季学期(实际上是2009-11-30)
文件名车轮信任-ddc.pdf
长度1971698字节
199
MD5哈希5320立方英尺082立方英尺060立方英尺7立方英尺58409立方英尺877立方英尺687
SHA-1散列20c8b702dd4b7c6586f2 59eb98f577dbadd359dd
SHA-256散列024bccc5254页9466f12afe39f72b154f63a6919f4e1add5d0513092b2052
SHA-512散列 0004998431af5da486a87794969a531407cb607ffc411c966a23343a58636c2072ceb85835ffe6eef727696ffc41b1ddd6d9e0fd090cbc85a33041c25acd2e55

微型喷漆

旁白:在2005年ACSAC上,Aleks Kissinger(塔尔萨大学)也介绍了他和我在微绘画方面所做的工作。既然这似乎已经从网络上消失了,我想我应该在这里简要描述一下。

Aleks的演讲标题为“使用正则表达式进行细粒度染色分析,”这是ACSA工程进展基本上,我们注意到,您可以不将“污点”赋给整个值,例如字符串在子组件上指定污点,例如每个字符。然后您可以分配标识输入路径的规则,并可能会有什么--通常是零个或多个受污染的字符,以及输出路径上的规则。我们专注于定义合法的正则表达式,尽管任何其他模式表达式,如BNF也可以。我们注意到您可以进行静态或动态检查。对于静态情况,当您反向工作时,如果检查“失败”,您可以甚至可以派生出导致安全失败的输入模式(根据这些信息,应该很容易找出如何修复它)。Aleks最近通过改变常规表达式转换为DFA。ACSAC还介绍了如何使用Java进行污染分析,但这是传统的“全变量”方法,用于许多语言,但许多漏洞都是通过这些语言漏掉的。我们希望这种微涂方法将改进检测工具软件中的安全漏洞,之前该软件是交付给最终用户。

那里我们了解的相关工作弗吉尼亚大学(UVA)正在进行的,虽然我们只是在工作的中途才发现这一点(通过Usenix)。有关UVA工作的更多信息,请参阅“使用精确着色自动强化Web应用程序”作者:Anh Nguyen-Toong、Salvatore Guarnieri、Doug Greene、Jeff Shirley和大卫·埃文斯.他们关注PHP,只关注动态案例;我们对两者都有,但尤其地对静态情况感兴趣(其中您可以显示某些漏洞从未发生并因此不需要任何运行时开销来处理它们)。

其他相关工作包括金砖四国Java字符串分析器(GPL;使用BSD许可的dk.brics.automon)。汉比可能是能够静态地实现这一点,这将非常棒。

在数据流、静态类型和安全(如工作人员Dennis Volpano等人).这是一个很好的工作,但并没有真正关注我们所看到的。这些工作倾向于将变量视为一个整体,而我们跟踪许多的较小的数据单位。我们还跟踪包含数据的序列(如数组)具有不同级别的安全性;大多数此类工作都处理数组就像一个单一的单元(一个基本上不一致的简化我们的方法)。


您还可以查看我的正规教育时间表,我的书编写安全程序,火焰探测器,或我的主页.