麻省理工学院的课程“计算机系统安全”。 讲座6:机会,第2部分

麻省理工学院。 讲座课程#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部分

观众:我们可以得出结论,每个机会都有一个过程吗?

教授:我对此表示怀疑。 您可以根据需要拥有任意数量的进程,一种可能性是可以存在多个进程。 简而言之,您不一定每次机会都需要单独的过程。 因为有一个Fort1进程,可以打开许多文件并将许多功能传递给Fort的特权组件。



您认为我们需要处理的每个机会都需要一个单独的流程,这是因为功能和外部特权之间的这种奇怪的相互作用。

因为fort1具有外部特权。 我们要做的基本上就是在此Fort1流程中将外部特权转换为Capability 。 因此,如果您要谨慎使用几种不同类型的外部特权或几种不同特权,那么您可能想要一个单独的具有此特权的进程。 而且,每当您要使用一组特定的特权时,都将要求适当的过程来执行分离,如果分离成功,则将要求该过程将Capability返回给您。

实际上,这种操作系统的设计完全基于功能并且没有任何外部特权。 这很酷,但在实际系统中使用不是很实用。 事实证明,实际上,您不需要太多的外部特权,而没有机会给对象命名并告诉某人有关该对象的机会,而不会无误地将权限转让给该对象。

也许我不知道您对某些常规文档可能具有什么特权,但是我想告诉您我们拥有该常规文档。 如果可以阅读,请阅读。 如果您将其写入,可以写。 但是我不想转让任何权利。 我只想告诉你:“嘿,这东西,去试试吧!” 因此,这在机遇世界中是一种不便,因为它确实迫使您在不将权利转让给该对象的情况下永远不要谈论对象。

因此,重要的是要了解这一点并在系统的某些部分中使用此功能,但不要依赖于此作为系统安全性的解决方案。



受众:假设该流程具有其他流程赋予的功能,但事实证明,该流程对于某些对象已经具有强大的功能。 流程可以比较它们以确保它们触摸相同的对象吗? 还是他会利用大机遇?

教授:事实是流程不会以隐式方式使用功能,因此这是功能的非常有用的属性。 您必须明确指出要使用的选项。 因此,从文件描述符的角度考虑它。 假设我为您提供了某个文件的打开文件描述符,并且它是只读的。 然后其他人给您另一个机会来处理其他文件,其中可能包括该文件。 一项新功能允许您读取和写入文件。

在这种情况下,如果您尝试写入第一个文件,则无疑会成功,因为将为其打开一个附加的文件描述符,该文件描述符不仅允许读取而且可以写入。 因此,当您不需要额外的外部特权时,这是一件很酷的事情。 您将拥有所有这些可能性,因为人们实际上已经建立了这样的库,并且原则上他们会为您管理您的功能。 他们有点收集它们。 当他们尝试执行一项操作时,他们会寻找机会并找到使之起作用的机会。

这将使您返回到要避免的环境权限的外部控制。 可能性的一个积极特征是它是简化您生活的软件设计。 这在安全解决方案中并不常见。 此属性使您可以更轻松地编写代码,以从安全的角度指向要使用的特权。 这很容易编写代码。
但是, 功能可以解决其他问题。 因此,当您需要执行一些不受信任的代码时,经常会出现特权管理问题。 因为您确实想控制您赋予的特权,否则可能会滥用您提供的任何特权。 这与关于辣椒的文章的作者探讨机会的观点略有不同。 他们当然知道外部权限问题,但这是您可以解决或无法解决的问题。 但基本上,他们关心自己的应用程序具有非常大的特权,并且担心该应用程序源代码的不同部分中会出现错误。 因此,他们希望减少此应用程序各个组件的特权。

从这个意义上讲,这个故事与OKWS非常相似。 因此,您有一个大型应用程序,将其分为多个组件并限制了每个组件的权限。 在OKWS中,这当然是有意义的。 在其他情况下,您可能会担心共享特权吗? 我认为在他们的文章中,他们描述了我应该尝试执行的示例,例如tcpdump和其他分析网络数据的应用程序。 他们为什么如此担心分析网络输入的应用程序? tcpdump中会发生什么? 他们偏执的原因是什么?

受众:攻击者可以控制发送什么和调用什么执行,例如数据包。

教授:是的,他们确实关心这种攻击,以及攻击者是否真的可以控制输入数据? 因为如果您编写应该处理数据结构的C代码,这是很成问题的。 显然,通过将字节复制到分配内存的数组中,您将进行很多指针操作。 同时,很容易在内存管理中犯一个错误,这将导致灾难性的后果。

因此,这就是他们决定在沙盒中完成网络协议和其他工作的原因。



需要特权共享的现实世界中的另一个示例是您的浏览器。 您可能需要隔离Flash插件, Java扩展或其他东西。 因为它们代表了广泛使用的攻击领域。

因此,这似乎是一个明智的计划。 例如,如果编写某些软件,则要检查沙箱中其组件的行为。 更一般而言,这是指您从Internet下载的内容并打算以较少的特权运行。 Capsicum提供的隔离样式适合吗? 我可以从互联网上下载一些随机的屏幕保护程序或游戏。 我想在我的计算机上运行它们,但首先要确保它们不会破坏我的所有财产。 您会为此使用Capsicum吗?

受众:您可以编写一个沙箱程序,在其中将使用Capsicum

教授:对。 您将如何使用它? 好了,您只需使用cap_enter命令进入沙盒模式,然后运行该程序。 您希望这行得通吗? 我认为会有问题。 它与以下事实有关:如果程序不希望它被Capsicum隔离,那么它可能会尝试打开共享库,但是它将无法执行此操作,因为它将无法打开/ lib / ...之类的东西,因为它不会在功能模式下允许。

因此,这些沙箱方法应用于开发人员已预见可以在此模式下执行的那些事情。 可能还有其他沙箱方法可用于未经修改的代码,但是要求可能会稍有变化。 因此, Capsicum的创建者并不十分担心向后兼容性。 如果我们必须以不同的方式打开文件,我们将以不同的方式打开它们。 但是,如果要保留现有代码,则需要更多功能,例如成熟的虚拟机,以便可以在其中运行代码。 这就引出了一个问题-我们是否应该将虚拟机用于Capsicum沙箱?

受众:在这种情况下,内存可能会溢出。

教授:是的。 但是,如果我们不关心内存怎么办? 因此,虚拟机可能非常好,并且不占用大量内存。 那么,由于什么其他原因,我们不应该在Capsicum中使用VM

受众:很难控制网络活动。

教授:对! 由于您没有使虚拟机访问网络,或者您正在通过NAT模式或使用PreviewVMWare连接到网络,因此很难控制网络上发生的事情。 但是,您的沙箱便可以访问整个Internet。 因此,您可能必须通过为虚拟机设置防火墙规则等来更详细地管理网络。 这不太好。

但是,如果您不关心网络怎么办? 假设您只有某种视频,如果您处理一些简单视频或分析tcpdump,该怎么办? 在这种情况下,您只需启动虚拟机,它就会开始分析tcpdump数据包,并在演示tcpdump要写入用户的演示文稿之后将您扔回去,因为没有真正的网络I / O。 那么,还有其他原因吗?



受众:因为初始化的开销仍然很高。

教授:是的,这可能是启动虚拟机的初始开销,这会降低性能。 的确如此。

受众:嗯,您可能仍想拥有数据库等的权限。

教授:是的。 但总的来说,这意味着您拥有正在使用的真实数据,并且很难分开。 因此,虚拟机确实是一个更大的共享机制,因此,您无法轻松共享事物。 因此,这对于您有一个要运行的完全隔离的程序,而又不想共享任何文件,目录,进程,而只是让它们分别工作的情况很有用。

所以这很棒。 在某种程度上,这可能比Capsicum所提供的隔离更强,因为出现问题的可能性更少。 但是,当您要使用Capsicum时,这种隔离不适用于许多情况。 因为在Capsicum中,您可以使用沙箱的功能高精度地交换文件。

因此,让我们看一下tcpdump ,看看为什么使用Unix机制隔离它很困难。 如果您还记得,在Capsicum中, tcpdump的工作方式是打开一些特殊的套接字,然后对网络数据包运行解析逻辑,然后将其输出到用户终端上。 那么基于Unixtcpdump沙箱需要什么呢? 您的特权受到限制吗? Unix的问题在于,真正更改特权的唯一方法是更改​​决策函数中的输入,该决策函数确定您是否真的可以访问某些对象。 您唯一真正可以更改的是流程的特权。 这意味着该进程将能够将UID发送其他人。

或者,您可以更改系统上各种对象的权限。 实际上,您可以同时使用这两种解决方案。

如果要在沙箱中隔离tcpdump ,则可能必须选择其他用户ID并在工作时切换到该ID。 但这不是一个理想的计划,因为您将不会在同一用户ID下运行tcpdump的多个实例。 因此,如果我破坏了一个tcpdump实例,这并不意味着我想允许攻击者使用此因素来控制在我的计算机上运行的其他tcpdump实例。 因此,在这种情况下使用uid可能是一个错误的决定。

另一个问题是,在Unix上,您必须具有root用户特权才能更改用户ID,特权,进程或其他东西,或将它们切换到其他东西。 这也是不好的。

另一个问题是,无论您的ID是什么,打开的访问文件都可能存在。 因此,您的系统可能具有一整套可读或可写的文件,例如密码文件。 确实,无论您拥有什么ID ,该过程仍将能够读取此密码。 所以这也不是很好。

因此,为了在Unix上组织沙箱,您可能应该同时做这两个事情:更改UID并仔细检查所有对象的权限,以确保您没有未隔离的,容易被黑客覆盖或读取的打开文件。 我认为这样做会获得另一种可以使用的机制。 如果提交到最后,可能会遇到共享文件或共享目录的困难。

现在让我们看看Capsicum如何尝试解决这个问题。 在这里,一旦我们进入“沙盒”模式,一切将仅通过机会获得。 因此,如果您没有Capability ,则根本无法访问任何对象。

本文中的这些人在全局命名空间上大举赌注。 那么这个全局名称空间是什么,为什么他们如此担心呢?

他们的文件系统本身就是全局命名空间的一个光辉的例子。 您可以写一个斜杠并在其后面列出您想要的任何文件。 例如,转到主目录中的某个人,例如/ home / nickolai / ...为什么这样不好? 他们为什么反对Capsicum中的全局名称空间? 你觉得呢



受众:如果您具有错误的权限,那么在使用权限时会遇到麻烦。

教授:是的。 问题在于它仍然是Unix 。 因此,仍然有常规的文件权限。 因此,也许,如果您真的想隔离沙箱中的某些进程,则将无法读取或写入系统中的任何内容。 但是,如果您设法在某个愚蠢用户的主目录中找到可写文件,那么对于沙盒客户端来说,这将是非常不愉快的。

更笼统地说,他们的想法是准确列出流程中所有的对象。 因为您可以简单地在文件描述符表中或为您存储功能的任何其他位置列出所有功能。 这是该过程可以触及的唯一东西。

但是,如果您有权访问全局名称空间,那么这可能是不可能的。 因为即使功能集有限,您仍然可以在斜线开头写一些新文件,并且您永远不会知道此过程可以访问的一组操作或对象。

这就是为什么他们如此担心全局名称空间的原因,因为它与精确控制沙箱进程应有权访问的所有内容的目标相抵触。 这样,他们试图通过FreeBSD中的许多内核更改来消除全局名称空间。 在这种情况下,内核必须确保所有操作都具有某些功能,即通过文件描述符。

让我们检查是否真的需要更改内核。 如果我们只是在库中这样做呢? 毕竟,我们正在实现Capsicum ,它已经有了一个库。 我们要做的就是更改所有这些功能,例如“打开,读取,写入”,以专门使用功能功能。 然后,所有操作都将经历某些功能,在文件表中查找它们,依此类推。 这样行吗?



受众:您始终可以进行syscall系统调用。

教授:是的。 问题在于,内核接受了一组系统调用,即使您实现了良好的库,也无法避免不良或受侵害的进程直接进行系统调用的可能性。 因此,您必须以某种方式加强核心。

在编译器中,威胁模型不是在受损的编译器过程中,也不在任意代码中,而是在于程序员的粗心大意。 因此,如果程序开发人员没有记错并且做正确的事,那么该库可能就足够了。

, , , . - , .

? — , cap_enter . , cap_enter ? , ?

, , . , , , . cap_enter , open () , openat .

Unix- , , open , openat , , , — : openat (dirfd,“name) . openat «name» , .



, Capability open , , , . . - ? -, ? , – . , ?

: , .

: . , , . , , . , . , , . -, .

, , , , , . , , .. , , , . ?

. ? , Unix PID . , kill (25) PID = 25 . , . Capsicum ? ?

: .

: . -, . , Unix , . , PID , , fork , pdfork , « ». , - .

. , . , - : « «» , , , , ». . , , - .

, , , . , . , , .



. , «-» . , openat , «-». , «-», .

? , «-» ?

: , , . , Capability .

: , .

: , , - …

: .

: - .

: , . «-» ? , openat - b/c/../.. ?

, , ? - , . , , , openat (d, “b/c/../..) «c» , - .



. , , , . «-», . , , . , , . , UID - ?

: , .

: , . , , «» UID ? : cap_enter UID . , . ? ?

: , UID , , , , , - .

: , . «» UID . , , UID . , , , . UID .

54:14

:

麻省理工学院的课程“计算机系统安全”。 6: «», 3


.

感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的资料吗? 通过下订单或将其推荐给您的朋友来支持我们,为我们为您开发的入门级​​服务器的独特模拟,为Habr用户提供30%的折扣: 关于VPS(KVM)E5-2650 v4(6核)的全部真相10GB DDR4 240GB SSD 1Gbps从$ 20还是如何划分服务器? (RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。

戴尔R730xd便宜2倍?在荷兰和美国,我们有2台Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100电视(249美元起) 阅读有关如何构建基础架构大厦的信息。 使用价格为9000欧元的Dell R730xd E5-2650 v4服务器的上等课程?

Source: https://habr.com/ru/post/zh-CN418219/


All Articles