刚听说这条消息的时候,我直接就是一个嗤之以鼻。一个系统只要能接受来自人类的指令,就一定存在相应的攻击向量。你可以不断拔高攻击的难度,但是“不可攻破”就是痴人说梦了,研究人员和记者两方必有一方是骗人的小狗。
于是我翻开相关论文,扫了一眼相关机构,嗯……密歇根大学、UT Austin、普林斯顿大学,还拿了美国国防高级研究计划局(DARPA)足足360万经费,好,肯定是记者的报道出了偏差,他是要负责任的。
批判完记者的标题党行为之后,我怀着对新架构的好奇继续读完了论文,然后……我感觉整个人都陷入了一种“哇”的状态。这个 MORPHEUS 架构虽然远远谈不上“不可攻破”,但是它却有可能将一类相当常见、相当泛滥的漏洞彻底根除,对信息安全领域产生深刻的影响。
那么,请容我在这里卖个关子。在 CPU 架构层能根绝的漏洞类型不多,猜到是哪一种了吗?
比较书卷气的答案是控制流劫持(Control-Flow Hijacking)。这个叫法有点太学术了,不少人可能听不懂我说的是什么。但如果我说溢出攻击(Overflow)的话,想必有人就会恍然大悟了。
其实严格来讲,这两个概念并不完全一样。
溢出攻击指的是黑客通过一些内存读写方面的逻辑漏洞,恶意覆盖某段内存,把里面的数据污染成自己想要的内容。如果黑客污染的是跳转地址、函数返回地址等数据的话,就能实现控制流劫持,操纵程序跳转到自己想要的任意位置;污染其他敏感数据的话,又会产生别的效果,比如篡改关键校验位、提升权限等。
目前,MORPHEUS 架构对后一种情况还力不从心,但是对于前一种情况却有着极其优异的表现。我所说的“极其优异”,是指跟目前所有防护手段相比,MORPHEUS 都呈现出压倒性的安全优势和性能优势。在看完了具体数据之后,我甚至开始有些害怕:如果美方单方面地将这类“安全处理器架构”发展成熟,列装到政府系统和军用系统里,中方在这个领域会不会变得只能被动挨打?只能看着敌人把这些高危攻击砸在我们的系统里,我们却无法还击?想必美国的国防高级研究计划局也是因为看到了这种可能,才会豪掷360万美金参与打造了 MORPHEUS 的原型机,以求能在这个方向上领先一步占据优势。
好了,危言耸听了这么多,是时候科普一下目前为止 MORPHEUS 公开的技术细节了。在开始科普之前,先来贴一下相关论文链接:Morpheus: A Vulnerability-Tolerant Secure Architecture Based on Ensembles of Moving Target Defenses with Churn.
0x01 浅谈栈溢出攻击
为了照顾背景知识不足的读者,我们先来简单聊一聊一类常见的控制流劫持攻击——栈溢出攻击(Stack Overflow)。
有编程背景的同学应该都知道,一个函数调用的内存是在栈(Stack)上分配的,其中包含着这个函数执行结束后应该返回的位置。
栈溢出攻击,就是利用程序读写内存时出现的逻辑缺陷,将这个返回地址覆盖成攻击者想要的地址,让程序跳转到攻击者预先注入的一段恶意程序上,接管整个程序的执行。
显而易见地,为了让这整段攻击顺利完成,攻击者需要达成起码三项条件:
- 成功覆盖某段关键内存,比如函数返回地址。
- 覆盖后成功跳转到一段恶意代码。
- 跳转到的恶意代码成功得到执行。
所有关于栈溢出的攻防,总归是要围绕这三项条件展开的,比如:
- Rust 、C∀ (C for all) 等项目想要设计出更安全的编程语言,从源头上杜绝攻击者覆盖内存。但是由于包括 Linux 内核在内的老旧C语言项目数量太多、规模太大,在将来十到二十年内也许看不到将它们全部移植到安全语言的可能。
- 代码指针完整性校验(Code-Pointer Integrity, CPI)与代码指针隔离(Code-Pointer Seperation, CPS)则是把所有指向代码的指针都隔离存放到一块安全的区域里,并且限定读写这些指针的条件,防止攻击者将它们覆盖、指向恶意代码。
- 地址空间布局随机化(Address Space Layout Randomization, ASLR)可以打乱数据在内存中的分布,让攻击者找不到自己注入的恶意代码,从而阻止恶意跳转发生。然而 ASLR 仅仅会在程序加载时打乱一次,之后不再进行打乱,因此可以通过堆喷(Heap Spray)等攻击手段绕过。
- 控制流完整性校验(Control-Flow Integrity, CFI)试图审计与监控跳转行为,拦截所有可疑的跳转。但是这样的方案理所当然地会产生严重的性能负担,所以现有的 CFI 方案基本都为了性能牺牲了安全性,留下了种种破绽。
- 数据执行保护(Data Execution Prevention, DEP)和指令集随机化(Instruction-Set Randomization, ISR)等防护可以阻止未授权的代码在设备上执行,但是这类防护大都可以通过面向返回编程(Return-Oriented Programming, ROP)、面向跳转编程(Jump-Oriented Programming, JOP)等手段绕过。
这些年来,CPI 和 CFI 都是相当热门的研究方向。尤其是 CPI,不仅通过形式化证明论证了自己理论上百分之百的安全性,性能数据也相当喜人。根据 SPEC2006 的性能测试结果,应用了 CPI 技术后,程序的运行时间平均增加 8.5%,最差情况下增加 44.2% ,远低于“细粒度 CFI”等相同安全级别的防护手段。
但是,让我们把目光放回到今天的主角身上,MORPHEUS 的性能表现又是如何呢?
同样是 SPEC2006 性能测试,程序运行在标准的 MORPHEUS 架构上时,运行时间平均增加 0.86%,最差增加 6.71%,碾压了几乎全部的已知手段。这个悬殊的结果乍一看让人觉得有些不可思议,但细想之后又是理所当然:MORPHEUS 所用到的所有操作,都是在硬件层由电路直接支持的,怎么可能会不快呢。其他防护手段想要胜过 MORPHEUS,估计只能从安全性上做文章了。
遗憾的是,在读过 MORPHEUS 的设计之后,我觉得其他手段在安全性上应该也很难和它比肩了。因为在 MORPHEUS 的设计里,我觉得我能看到所有已知手段的影子。
0x02 MORPHEUS 架构原理
MORPHEUS架构的原理,用论文标题中的一段就能完美概括:“Ensembles of Moving Target Defenses with Churn”,直译成中文的话,就是“将若干种移动目标防御手段结合使用,并且反复进行搅乱操作”。
移动目标防御(Moving Target Defenses)是近些年各国都极其重视的发展方向,被美国国土安全部称为“改变游戏规则的新型信息安全技术”。它的基本思想很简单:在传统的静态系统里,大部分的敏感数据都是固定不变的,攻方可以有相当宽裕的时间进行刺探和信息收集,而守方只能在出事之后被动应对,处于敌暗我明的不利局面。移动目标防御的目的,就是让整个系统活动起来、随机起来,让攻方刺探到的每一条信息都迅速失效,拉平攻守双方的信息不对称。
可以被归类为移动目标防御的技术手段有很多,比如我们常见的银行数字令牌,就属于一次性密码(One-Time Password)的范畴。而在控制流劫持这个领域,我们主要用到的技术是之前提到的 ASLR 和 ISR,这里让我们复读一下:
- 地址空间布局随机化(Address Space Layout Randomization, ASLR)可以在程序每次加载时,打乱数据在内存中的分布,让攻击者找不到自己注入的恶意代码。
- 指令集随机化(Instruction Set Randomization, ISR)可以在程序每次加载时,为 CPU 制定一套加密过的指令集,并且把内存里的每一行代码都转换成加密过的指令集。这样一来,由于黑客不知道程序这次运行所使用的指令集,他写出来的二进制代码也就不可能正常执行。
这两种 MTD 都只会在程序加载时执行一次,所以又被称为加载时移动目标防御(Load-time MTD)。显然,它们的防护力度并不够理想,尤其是对于各种服务器软件来说,一次运行往往要持续好几个月,期间地址空间布局和指令集都会保持不变,给攻击者留下充足的刺探时间。
既然如此,那这几个月我们对服务器软件随机做几次 ASLR 和 ISR,是不是就能解决问题了呢?很遗憾,对于传统 CPU 架构来说这基本是不可能的。这种行为打个比方的话,就相当于是在客机飞行期间给发动机换零件,发动机还不能熄火。如果这都不爆炸的话,你修的可能是纸飞机。
而 MORPHEUS 架构的奇妙之处,就在于它把 ASLR 和 ISR 转换成了两种效果相仿的操作,并且在架构层添加了若干电路和一个搅乱单元(Churn Unit)进行硬件支持,把“万米高空修飞机”这个虚幻操作变成了可能。更夸张的是,它不仅把这个操作变成了可能,还把它变得贼快,以至于你可以每 50ms 搅乱一次,对性能的损耗却仅仅只有 0.86% 左右。
这个魔术具体的实现细节比较繁琐,我在科普文里就不再细讲了,有兴趣的朋友可以看一下论文的4.2、4.3和4.4节。顺便一提,4.3节的 Domain Encryption 不仅仅有 ISR 的效果,它同时还加密了代码指针(Code Pointer),起到了类似 CPI/CPS 的防护效果。
在论文之中,有一张图很好地体现了 MORPHEUS 架构的优越之处:
图中的“Probe”表示攻击者在进行嗅探的时间。上中下三条分别表示:
- 没有移动目标防御的情况下,攻击者简单进行一次嗅探就可以开始攻击了。
- 使用移动目标防御之后,攻击者的嗅探时间被拖得很长,但是还是成功进行了攻击。
- 而在 MORPHEUS 架构下,攻击者每次嗅探都遭到了疯狂打断,一次攻击都没能完成。
更无情的是,MORPHEUS 架构还吸取了 DEP 的核心思想,实现了对可疑行为的动态检测。
在 MORPHEUS 架构上,设计人员定义了四种数据类型:代码(C)、数据(D)、代码指针(CP)、数据指针(DP)。MORPHEUS 的编译器会标记每块内存的身份,帮助 CPU 判断用户的行为合不合理,比如:
- 一块内存被标记为数据,用户却要把它当成代码去执行,这明显就是一个恶意行为,MORPHEUS 会直接终止程序执行。
- 一块内存标记为代码指针,用户却要对它进行加减乘除,这很可能是攻击者在进行嗅探,属于可疑行为,会当场触发一次搅乱(Churn)。
这一整套组合下来,对于攻击者来说基本就是地狱难度了。即使攻击者小心翼翼地绕过了行为检测,他也只有顶多50毫秒的时间进行操作。这50毫秒可能还不够数据包传到服务器上,所有的敏感数据就全打乱了。这种感觉就好像是猎人进山打鸟,发现山里的鸟竟然都会瞬移,别说站远处打了,枪口顶在鸟头上你都打不中,这种效果简直令猎人绝望。
0x03 头脑冷静时间
那么,MORPHEUS 架构是否就是我们要找的“银弹”了?是否就是完美的解决方案了?
坦白地说,现在还不知道,因为还没有看到形式化证明。即使有了形式化证明,也只是证明了理论上的绝对安全。实际做成产品之后,又会因为现实世界的不完美而出现种种缺陷。即使实际产品也已经做到尽善尽美了,它所解决的问题也只是信息安全领域一个相当狭窄的子集,在这之外还有浩如烟海的漏洞是 MORPHEUS 无能为力的。
不过,就算 MORPHEUS 本身不是我们在找的银弹,它也为我们指出了一条前景似乎非常美妙的道路——基于硬件进行高速 MTD,把攻击者直接逼上绝路。这条路如果真的能够走通的话,对于信息安全领域绝对会产生非常深刻的影响,甚至可能衍生出一批“耐漏洞”的计算机架构,让人类永远摆脱漏洞挖掘这项繁琐又枯燥的工作。
当然,如果真有那一天,安全行业恐怕就要大失业了。
最后顺便闲聊两句吧。
这段时间日子过得比较忙,索性从知乎上淡出了两个月,做个简单的休息与调整,毕竟一直坚持输出干货实在是太累了。现在休息得差不多了,手里也攒了一些比较有意思的材料,接下来应该会小小地活跃一阵子,欢迎关注。
另外,觉得本文有价值的话,欢迎点个赞支持一下。对信息安全感兴趣的同学,也欢迎阅读我写的其他信息安全科普类文章:
- CA 机构是如何保护自己私钥的?
- SSH是如何防御重放攻击的?
- 在非对称加密中,是怎么做到知道公钥也没法破解密文的?
- 什么是哈希洪水攻击(Hash-Flooding Attack)?
- 加密软件在解密时如何判断密码是否正确?
来源:知乎 www.zhihu.com
作者:Gh0u1L5
【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载
此问题还有 14 个回答,查看全部。
延伸阅读:
会不会所有的芯片都有后门?包括用国外设计软件设计的自主生产的芯片?