麻省理工学院。 讲座课程#6.858。 “计算机系统的安全性。” Nikolai Zeldovich,James Mickens。 2014年
计算机系统安全是一门有关开发和实施安全计算机系统的课程。 讲座涵盖了威胁模型,危害安全性的攻击以及基于最新科学研究的安全技术。 主题包括操作系统(OS)安全性,功能,信息流管理,语言安全性,网络协议,硬件安全性和Web应用程序安全性。
第1课:“简介:威胁模型”
第1 部分 /
第2 部分 /
第3部分第2课:“控制黑客攻击”,
第1 部分 /
第2 部分 /
第3部分第3讲:“缓冲区溢出:漏洞利用和保护”
第1 部分 /
第2 部分 /
第3部分讲座4:“特权分离”,
第1 部分 /
第2 部分 /
第3部分讲座5:“安全系统从何而来?”
第1 部分 /
第2部分讲座6:“机会”
第1 部分 /
第2 部分 /
第3部分讲座7:“本地客户端沙箱”
第1 部分 /
第2 部分 /
第3部分 今天,我们将讨论一个称为
Native Client的系统,
Google在现实世界中会使用该系统。 它是一种沙箱技术,用于在不同平台上运行代码。 它在
Chrome浏览器中使用 ,允许Web应用程序运行任意机器代码。 这实际上是一个非常酷的系统。 它还说明了隔离功能以及一种独特的沙箱或特权分离技术,称为
软件故障隔离 ,即
软件故障隔离 ,而无需使用操作系统或虚拟机来创建沙箱。

相反,本
机客户端采用完全不同的方法来查看二进制文件中的特定指令,以查明运行该文件是否安全。 因此,在开始研究系统的技术细节之前,让我们先弄清楚为什么这些人真的想运行机器代码? 他们的特殊兴趣是在Web浏览器中应用此解决方案,您已经可以在其中运行
JavaScript代码,
Flash Player和一些其他进程。 为什么这些人对在
x86平台上运行代码的能力感到如此兴奋? 毕竟,这似乎是退后一步。
受众:他们希望获得非常快速的计算。
教授:是的,这是机器代码的一大优势。 即使从长远来看它可能是不安全的,它也确实可以提供高性能。 例如,编写程序并编译,而您在
JavaScript中不会执行的所有操作,实际上都可以更快地完成。 还有其他原因吗?
受众:运行现有代码?
教授:对。 重要的是,并非所有内容都可以用
JavaScript编写 。 因此,如果您有一个现有的应用程序,或者用行业术语来说,打算在Internet上运行的“继承”代码,这似乎是一个不错的解决方案。 例如,由于您只能使用现有的库,因此某种复杂的图形“引擎”既会对性能以及您不想重新实现的许多其他复杂事物都敏感,那么这将是一个很好的解决方案。
如果您只是在编写新的Web应用程序,那么如果您不特别关心继承或性能,是否应该使用自己的客户端?
受众:那么您无需使用
JavaScript 。
教授:是的,这是一个很好的理由。 如果您不喜欢
JavaScript ,则不需要使用它,对吗? 例如,您可以使用
C ,您可以运行
Python代码,用您认为更合适的任何语言在
Haskell中编写代码。
因此,这是在浏览器中运行您自己的代码的极具说服力的动机,并且很难获得执行此操作的权利。 稍后,我们将考虑技术细节,现在我想向您展示一个从
Native Client网站收到的简单培训演示。

这非常简单,因为您可以使用
C ++或
C程序并在浏览器中运行它。 您可以查看此网页,这是一个
HTML文件,其中包含一堆
JavaScript代码。

该
JavaScript代码存在的原因是,它允许您与
Native Client的各个部分进行交互。 关于浏览器的操作,这种解决方案的含义是您拥有某种包含
JavaScript代码的网页。 并且此解决方案使用页面的特权,并允许您在网页本身上执行各种操作,例如,在某些情况下与网络进行通信。
Native Client允许您在浏览器中运行模块,因此
JavaScript代码可以与其交互并接收响应。 这显示了本
机客户端与我们将要运行的特定
NaCl模块进行交互所需的一些
JavaScript代码。

您可以将消息发送到此模块。 怎么做? 您可以在
JavaScript中使用此模块的对象,将其称为
postMessage,从而支持将此消息发送到
NaCl模块。 当
NaCl模块响应时,它将启动
JavaScript中的message函数。 在这种情况下,浏览器中会弹出一个对话框。

因此,在
JavaScript方面,这是一个非常简单的网页界面。 您唯一需要做的就是以这种方式分配
NaCl模块。 也就是说,您只需
在此处插入具有特定
ID的模块。 这里最有趣的是扩展名为
nmf的
hello代码。 他只是说有一个可执行文件,您需要下载该文件并在
NaCl环境中开始使用它。

此本地代码确实与您可以编写的任何其他C ++代码一样。 有趣的部分是此
HandleMessage消息处理功能。

这是
C ++类,每当
JavaScript代码向本
机代码发送消息时,它将执行此功能。 它执行
if(message = ='hello')检查。 如果是这样,它将创建某种响应行并将其发送回去。 这是非常简单的东西。 但具体来说,让我们尝试运行它,看看会发生什么。
我们可以构建并运行一个小型Web服务器,该服务器将为该页面和
Native Client模块提供服务。 在这里,我可以转到该
URL ,在这里我们可以看到
NaCl网页。 该模块收到了来自
JavaScript的欢迎消息,并用
JavaScript中的字符串进行了响应,并且
JavaScript代码触发了包含此响应的弹出对话框。

因此,它确实有效。
尝试找出是否会导致本
机客户端崩溃。 我希望不会,但是我们可以使用此代码和此缓冲区,并在其中编写一堆废话,例如65536,然后看看会发生什么。

我希望这不会导致我的浏览器崩溃,因为
Native Client试图提供隔离。 但是,让我们看看会发生什么。
重新启动Web服务器。 我们看到模块的入口仍然成功,我们的浏览器没有受到伤害。 但是,没有与客户端进行消息传递,因此缺少该对话框。 让我们看一下页面底部的
JavaScript控制台,并查看
Native Client模块将
NaCl模块的故障通知我们。

我输入的参数有可能导致缓冲区溢出或访问了一些错误的地址,但是无论如何,
NaCl模块确实能够以不影响浏览器的方式隔离意外的内存损坏。
这是该系统的快速演示,您可以将其用作最终用户或开发人员。 让我们再看几个例子。 例如,本
机客户端将如何工作,或者为什么我们只需要此
客户端 ,而不是替代设计。
因此,如果您的目标是隔离自己的代码,则可以使用几种替代方法。 实际上,在
Native Client出现之前,人们曾经在使用遗留代码和其他语言时遇到问题。 他们以各种方式解决了这些问题,这可能不像
Native Client那样安全和便利,但是提供了相同的隔离功能。
那么,如果您真的想在浏览器中运行机器代码,该怎么办? 一种选择是对开发人员的信任。 这种方法的一种变体是您询问用户是否要在浏览器中运行某些代码。
所以,每个人都大致了解这是什么计划,对吗? 例如,代替所有本
机客户端编译策略,我可以创建一个
C程序,在浏览器中运行它,他会问我是否要运行此站点? 如果我单击“是”,不小心在浏览器的内存中“移动”,它将崩溃。 所以有可能吧? 当然,这解决了所有这些问题,但是那有什么问题呢?
我认为坏的是这种解决方案是不安全的。 这是解决该系统和许多其他系统的一种方法。
Microsoft有一个称为
ActiveX的系统,该系统基本上实现了该计划。 您可以将二进制文件发送到
IE (计算机上的浏览器),直到它们返回由特定开发人员(例如由
Microsoft或其他人签名)的证书返回后,浏览器才会运行您的代码。 您认为这是有用的计划吗?
观众:这是一个信任的问题!
教授:是的。 您确实需要一点点相信开发人员将只签署那些不会做错任何事情的“二进制文件”。 但是,通常无法弄清楚这是否是一件坏事,因此他们只需编写
C代码并盲目地对其签名即可,而无需进行大量工作。 在这种情况下,将来可能会遇到某些问题。
同样,询问用户是否真的要运行事物的决定根本不能保证安全。 即使用户想要小心,实际上也不清楚他应该如何决定? 假设我真的想了解是否可以让该程序正常工作? 有人告诉我一切都很好,也许它是由
Google.com或
Microsoft.com的知名开发人员创建的。 但是,这是可执行文件
foo.exe ,我绝对不知道其中的内容。 即使我反汇编了他的代码,也很难说他是否会做坏事。 因此,用户很难确定代码执行对系统是否安全。

因此,本
机客户端可以充当一种机制,通过该机制,用户可以对自己是否应该对某个程序说“是”或“否”获得一定的信心。
因此,在实践中,我认为我们的客座讲师Paul Yang上周应该提出一个选择。 他建议运行“
播放扩展程序 ”插件,或者在
Chrome浏览器中运行“
播放扩展程序”。 也就是说,事实证明,在启动任何扩展(包括
Native Client)之前 ,您需要先单击此东西。 在某种程度上,这与询问用户相同。 但是在这种情况下,即使用户决定回答“是”,系统仍将是安全的,因为
本地客户端将包含在工作中。 从这个意义上讲,我们有双重安全机制:首先询问用户,然后以肯定的答案启动沙箱客户端,这将不允许浏览器崩溃。
因此,应采用的另一种方法是使用通过OS或硬件实现的沙箱,或隔离进程。 这是我们在最近2堂课中讨论的内容。
也许您会使用
Unix隔离机制。 如果您有更复杂的东西,可以使用
FreeBSD或
Capsicum 。 隔离沙箱中的一段代码非常有用,因为您可以限制其功能。
Linux具有类似的机制,称为
Seccomp ,我们在上一讲中对此进行了简要介绍,它还允许您执行此类操作。
因此,已经有一种机制可以在您的计算机上隔离地编写代码。 为什么这些人反对使用此现有解决方案? 他们似乎出于某种原因在“发明轮子”。 那到底是怎么回事?
听众:也许他们想减少错误?
教授:是的,在某种程度上,他们不信任操作系统。 也许他们实际上担心操作系统错误。
FreeBSD内核或
Linux内核很可能包含许多他们不想要的
C代码,或者即使他们愿意也无法检查其正确性。 而且在
Capsicum或
Seccomp中,工作是根据隔离计划完成的,因此内核仅需编写一小段忠实的代码就足够了,以便沙盒维护并应用隔离。
受众:由于您有更多使用浏览器的方法,因此您必须处理各种操作系统(例如iOS和Android)并访问...
教授:是的,实际上,另一个有趣的考虑是通常许多操作系统都有错误。 而且,实际上,不同的操作系统在某种程度上是彼此不兼容的。 这意味着每种操作系统都有其自己的机制,如下所示:
Unix具有
Capsicum ,
Linux具有
Seccomp ,但这只是
Unix的变体。
Mac OS具有
Seatbelt ,
Windows具有其他功能,并且清单还在继续。
因此,最后,您使用的每个平台都有其自己的隔离机制。 真正让他们感到困扰的是,他们将不得不为
Mac ,
Windows和
Linux编写不同的代码。 但更重要的是,它影响了您编写这些内容以使其在沙箱中工作的方式。 因为在
Native Client中,您实际上编写了一段代码,其运行方式与“本机” OS代码相同,并且与
Apple代码,
Windows代码或
Linux系统代码执行的方式相同。
而且,如果您使用这些隔离机制,那么它们实际上会对放置在沙箱中的程序施加不同的限制。 因此,您必须编写一个将在
Linux沙箱中运行的程序,另一个要在
Windows沙箱中运行的
程序 ,依此类推。
那是他们真正无法接受的。 他们不想处理这类问题。 您还有什么其他考虑?
受众:大概是系统性能。 因为如果您使用
Capsicum ,则需要照顾足够的资源以确保流程在沙盒内正常工作。 在这里,他们可能面临同样的问题。
教授:是的,是的。 软件崩溃隔离计划实际上是非常耗费资源的,这在操作系统级别可能会导致缺乏支持沙箱的资源。 事实证明,在他们自己的
Native Client中,他们实际上使用沙箱和OS沙箱来提供额外的安全性。 因此,实际上,尽管它们可能会赢,但它们并不能在实现的性能上取胜。
观众:也许他们想控制一切。 因为他们可以控制浏览器中发生的事情,但是如果将它们发送到操作系统上的客户端计算机,他们将不知道在那里会发生什么。
教授:可以说,操作系统可能有错误或不能很好地管理沙箱。 或界面有所不同,因此您不知道操作系统将要显示什么。
听众:这不会阻止代码做一些不好的事情。 代码有很多功能,例如,您想执行静态分析,但是代码循环会阻止程序运行。
教授:实际上,确定是否存在无限循环的过程非常困难,但是从原则上讲,这种方法使您可以捕获一些代码问题。 我认为,一个非常有趣的示例(直到我阅读他们的文章之前才知道)表明,这些人担心的是硬件错误,而不仅仅是代码可运行的操作系统漏洞。 例如,处理器本身有一些指令,可能会导致其冻结或重新启动计算机。 基本上,您的设备不应出现此类错误,因为操作系统依赖于这样的事实:硬件在任何情况下都将帮助其到达内核,以便消除用户错误的后果。
但是事实证明,处理器是如此复杂,以至于它们有错误,这些家伙说他们找到了证据。 如果处理器不希望收到某些复杂的指令,它将停止而不是处理系统核心。 不好 我认为如果仅在笔记本电脑上运行一些有用的操作就不会造成灾难性的后果,但是如果我在访问某种网页时计算机死机会更糟。
因此,他们希望为
Native Client模块创建更高级别的保护,而不是在OS级别上提供隔离,甚至没有硬件错误。 因此,关于安全性,它们的行为类似于偏执狂,包括硬件安全性问题。
现在,让我们看看
Native Client如何真正隔离沙箱中的进程。 因此,本
机客户端采用了另一种方法,称为“隔离软件故障”。

该计划不是基于操作系统或设备在程序运行时会检查事物的事实,而是要依靠它们事先查看指令并确定它们可以完全安全地执行。 因此,实际上,查看二进制文件以检查所有可能的指令并查看它们是否安全是足够的。 一旦确定一切都将是安全的,您就可以简单地开始该过程,因为您知道它由安全的事物组成,并且不会有任何失败。
因此,他们要做的就是查看发送到浏览器的二进制代码中的几乎所有指令,并确定特定指令是否安全。
? . ? , , .
-
ALU , , . , . , , . , , , .

? , , . , , , . , «» , ? .
, , , - , . «» , - . , «» , . , , , , .
, ( ) . . ,
if , , . , , – .
, , , . . , , . , , , , «» .

. , , . , , .
, , , , - , . , , , , .
Trusted Service Runtime , . .
Google . ,
NaCl .
, , , , , — , — . , .
: , ,
NaCl ? , ?
: , , ,
NaCl . ,
malloc pthread_create ,
Trusted Service Runtime . - ,
Unix , - . , ,
JavaScript -.
RPC JavaScript , .

, ,
NaCl Unix -, - , -.
. ,
Native Client . –
Native Client ?
,
Native Client . , , . , ,
x86 . , , «», .
, . , , 0 256 . , , , , .
? , ?
: , .
: , . , , . , , ? , ?
: .
: !
: -, , . .
: , . , . , , . , , ,
Trusted Service Runtime . , ,
Trusted Service Runtime , . , .
, ,
NaCl , . , 0. ,
NaCl . .
28:00
:
麻省理工学院的课程“计算机系统安全”。 7: « Native Client», 2.
, . 你喜欢我们的文章吗? 想看更多有趣的资料吗? 通过下订单或将其推荐给您的朋友来支持我们,为我们为您开发
的入门级服务器的独特模拟,为Habr用户提供
30%的折扣: 关于VPS(KVM)E5-2650 v4(6核)的全部真相10GB DDR4 240GB SSD 1Gbps从$ 20还是如何划分服务器? (RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。
3 Dell R630 —
2 Intel Deca-Core Xeon E5-2630 v4 / 128GB DDR4 / 41TB HDD 2240GB SSD / 1Gbps 10 TB — $99,33 , ,
.
戴尔R730xd便宜2倍? 仅
在荷兰和美国,我们有
2台Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100电视(249美元起) ! 阅读有关
如何构建基础架构大厦的信息。 使用价格为9000欧元的Dell R730xd E5-2650 v4服务器的上等课程?