麻省理工学院。 讲座课程#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部分 因此,在继续共享特权这一主题的今天,我们将讨论机会。 如果您还记得的话,上周我们讨论了
Unix如何为应用程序提供一些机制,以便在我们需要将特权与应用程序的内部结构分开时使用。
今天,我们将讨论使我们对应用程序可能具有的特权有不同看法的可能性。 因此,在今天的演讲中,我们有两个单独的问题需要讨论。 一个问题是关于如何避免在确定权限时造成混淆,以及如何在编写程序时使您的特权更加清晰明确,以免您不小心使用错误的特权。
第二个问题涉及称为
Capsicum的“沙盒”,它是一个类似于
OKWS的系统,它将使您能够以较少的特权运行代码片段。 因此,如果系统受到威胁,则不会造成太大的破坏。

这种方法允许您以不同于
Unix允许的方式来操纵特权。 首先,让我们看一下这个令人困惑的权限问题,我们正在讨论的文章的作者Norman Hardy面临该问题,并找出为什么她对他如此困惑。
这篇文章是很久以前写的,作者为文件名使用了语法结构,这有点令人惊讶。 但是我们可以尝试至少将他的问题翻译成更熟悉的
Unix风格的名称语法。
据我所知,他使用了位于
/ sysx / fort中的
Fortran编译器 ,并且他想更改此编译器以保留有关编译内容的统计信息,该编译器的哪些部分最耗费资源等等。 因此,他希望确保该
Fortran编译器将以某种方式在
/ sysx / stat文件中提供一个条目,并且他将在此处写入有关各种编译器调用的信息。

他们的操作系统具有类似于我们在
Unix上讨论过的
setuid函数的功能。 他们称其为家庭文件许可证。 这意味着,如果您运行
/ sysx / fort ,并且该程序具有所谓的
主文件许可证,那么您刚刚启动的此过程将对
/ sysx /中的所有内容具有额外的写权限。 也就是说,您可以在斜线
后记下通常标有星号的所有内容,得到形式为
/ sysx / *的表达式。 这样就可以访问
/之后的目录中写入的所有文件,并且用户可以运行它们。 因此,他们面临的特定问题是,某些聪明的用户可以通过运行编译器来执行此操作,这可能像
GCC一样接受很多参数。
例如,这样的用户可以收集
foo.f之类的
内容 ,其中
f是
Fortran的源代码,并在此处添加-o
/ sysx / stat 。

他们在系统
/ sysx中有另一个文件,该文件是所有系统客户机的记帐文件。 它的伤害会造成更大的伤害。 可能以类似于“询问”编译器的方式来编译源文件
/ sysx / bill并将其放在
/ sysx中的某个特殊文件中。 在他们的情况下,它起作用了。 尽管用户本人对此文件或目录没有写访问权,但他还是使用了编译器,该编译器具有此附加特权-主文件的许可证。 多亏了编译器的特权,他才能够替换文件,违背了开发者的意图。

他们应该为谁负责? 他们认为出了什么问题? 您可以采取不同的行动以免遇到此类问题吗? 他们认为,
Fortran编译器在使用其特权时会非常小心。 实际上,在特定级别上,Fortran编译器具有两种使用的特权。
一种是主要的,基于这样一个事实:如果用户调用了编译器,则他应该能够访问源文件,例如
foo.f。 并且,如果是其他一些用户未激活或未调用编译器,则该用户将无法访问“正确”用户的源代码。
此许可证提供了第二种特权,它允许您写入这些特殊文件。 在编译器源代码的内部级别上,应该有明确的说明,有关他在打开文件或执行任何特权操作时要使用哪些特权。 它可以像打开其他程序一样简单地打开,读取和写入文件。 它隐式地使用它拥有的所有特权,也就是说,在他们的系统设计中,它是用户特权和使用主文件的许可证的一种组合。
因此,这些家伙对解决这个问题真的很感兴趣。 他们将这种编译器称为“愚蠢的助手”,因为他必须区分自己拥有的许多特权,并在必要时谨慎使用它们。
因此,我们应该考虑如何在
Unix上开发类似的编译器。 在他们的系统中,所有内容都与此文件许可证相关联。 他们后来将其他机制引入他们的计划中以发现机会,我们将在不久的将来讨论它们。 但是我们可以在
Unix系统上解决这个问题吗?
假设您必须在
Unix上编写此
Fortran编译器 ,编写此特殊文件,并避免出现此问题。 你会怎么做? 有什么想法吗? 我认为您可以简单地宣布这是一个糟糕的计划,例如,不保留统计数据。 还是不支持数据输入类型-
哦 。 另一方面,您可以指定要编译的源代码,以便可以读取
/ bill文件或统计文件,而这些文件可能需要保密。
或者,也许您可以提供对标准源代码的支持,但随后它必须包含其他源代码的一部分,因此有些深奥。
受众:可以共享编译器特权。
教授:是的,那将是另一个分享他的证书的潜在好设计。 我们知道,实际上,Fortran编译器不需要同时具有两个特权。 因此,也许在
Unix中 ,我们可以创建一个诸如
world / bin / fortcc之类的编译器,它只是一个没有附加特权的常规程序。 然后,我们将创建
/ bin / fortlog ,这将是一个具有一些附加特权的特殊程序,它将收集有关编译器中发生的情况的统计信息,并且
fortcc函数将调用
fortlog 。 那么,我们将给予此
堡垒日志什么特权?
受众:也许如果您使用
setuid或
fortlog之类的东西,那么任何其他用户也可以通过它注册任意数据。
教授:是的,所以不是很好。 因为在
Unix中授予
totlog附加特权的唯一方法是成为其所有者,所以我不知道,也许是创建
fort UID和
setuid 。 每次您运行
fortlog时 ,它都会切换到该
堡垒UID 。 并且,也许这里仍然需要一些特殊的统计文件。 但是毕竟,每个人都可以称这个
堡垒日志 。

这不好,因为任何人都可以写入统计文件。 在这种情况下,出于安全性考虑,这是一个小问题,但是如果不是
统计信息 ,而是
账单支付文件,会发生什么情况呢? 在这种情况下,问题将更加严重。
Unix有一个相当复杂的机制,我们在星期一的上一堂课中省略了它。 这种机制允许应用程序在多个
uid之间切换。 因此,要运行不同的应用程序,可以在用户
ID之间切换。 以正确的方式做这有点困难,但可行。 因此,这种机制可能是我们系统的另一种潜在设计。
我认为您可以再做一个技巧:使
fortlog “二进制”可执行文件仅适用于特定组,并
为该组创建
fortcc setgid二进制文件。 但是,这不是很好,因为它会删除用户最初拥有的任何组列表。 但是谁知道呢,也许总比没有好。
无论如何,这都是一个相当复杂的问题,但是可以使用
Unix机制完全解决。 也许您应该重新考虑您的问题,而不必太担心
stat统计文件,将其安全放在首位。 我们的项目出了什么问题?
如果出现问题,有两件事要注意。 第一个称为
环境权限或外部权限。 有人知道他们的意思吗? 他们从未给出这个确切的定义。
受众:这意味着您拥有环境赋予您的权限。 就像您是一个不受限制的用户一样。
教授:是的,您正在执行一个操作,并且可以指出要执行的操作,但是该操作是否成功的决定取决于过程中的一些其他间接参数。
在
Unix上,您可以确定环境权限检查的外观。 因此,如果您进行系统调用,则可能给系统调用起了一个名字。 在内核内部,此名称映射到某个对象。 并且该对象应该在其内部包含某种访问控制列表,例如,对该文件的权限等等。

因此,您可以从该对象获得一些权限,并且需要确定是否将允许使用使用授予该应用程序此名称的操作,
即已创建名称->对象->权限链。 这就是应用程序看到的过程。
在内核内部,存在进行调用的流程
进程UID的当前用户ID。 他还参与决定是否允许执行特定操作。 因此,此当前进程用户ID是外部特权。 内核将尝试使用当前的
UID和当前的
GID以及您可能拥有的其他任何特权,来验证您想要执行的任何操作。 尽管有一些特权可以执行此操作,但是您可以执行此操作。 虽然,您可能不想使用所有这些特权来打开特定文件或执行任何其他操作。
您了解这些
环境特权是什么,外部特权吗? 对于操作系统,这意味着该进程具有某种用户ID。 您能否举例说明与操作系统无关的特权? 例如,当您执行过程标识操作以查找是否成功时。 防火墙可以作为示例-如果您在网络内部或具有内部IP地址,则可以执行某种操作;如果您在网络外部,则将禁止您执行同一操作。
假设您访问的某个网站包含指向其他服务器的链接,也许您不想使用必须遵循此链接的特权。 因为这可能会使某人访问您的内部网络打印机,并且某人将能够使用它。 但实际上,为您提供链接的那个人不应访问您的打印机,因为它位于网络外部。 或者您的浏览器的防火墙通过访问此链接可以以欺诈的方式进行。

这在道德上相当于网络模型中这个令人困惑的问题。
受众:现有权限也会对此产生影响。
教授:是的。
受众:因为
Capsicum本质上使用
DAC-自由访问控制。
教授:是的,这主要是因为
Capsicum的人员使用了诸如随意访问控制之类的东西。 这意味着对象的用户或所有者决定该对象的安全策略是什么样。 对于
Unix,这是很自然的-这些是我的文件,我可以决定要使用它们做什么,我可以将它们提供给您或保留它们。 因此,几乎所有
DAC系统都是这样,因为它们需要某种权限,用户可以更改这些权限来管理其文件的安全策略。
DAC的另一面是强制访问控制。 我们将在后面讨论,但是从某种程度上说,这些系统对世界的看法截然不同。 他们认为您只是计算机用户,而其他人则设置了使用此计算机的安全策略。 这种观点来自70或80年代,当时军方真的希望拥有秘密的计算机系统,在其中您可以处理被标记为“秘密”的某些事情。 而且,如果您正在处理被标记为
“秘密”的内容,而我正在处理被标记为
“最高机密”的内容,那么它们就不会那么容易地为您带来帮助。 但我不必设置文件的权限,依此类推,只是某种顶级人物不允许这样做。
因此,强制访问控制实际上是首先尝试将各种类型的访问策略放置在有用户和应用程序开发人员的地方,此外,还有其他人来设置此策略。 但是,您可以猜测,这并不总是有效。 我们稍后再讨论。 但这是任意访问控制的本质含义。
我们还有许多其他使用外部访问控制的示例。 这并不一定很糟糕,使用时只需要非常小心。 如果您具有
环境特权系统,则在执行特权操作时需要非常小心。 您必须确保您确实使用了正确的权限,并且不会像25年前使用此
Fortran编译器那样被意外欺骗。
因此,这是对正在发生的事情的一种解释。 而且这不一定是思考出问题的唯一方法,对吗? 另一个可能性是,如果应用程序本身知道是否应该代表某种原理访问文件,那将是很好的选择。 因此,问题2是访问控制检查的复杂性。

从某种意义上说,当
Fortran编译器正在运行时,它将代表用户打开文件,并且您需要重复图中所示的相同逻辑,只是
Fortran编译器必须为
Sur进程UID连接其他内容。 除了应该使用当前特权外,他还应该重复“
名称”->“对象”->“权限”检查,并尝试对
您的进程UID使用一组不同的特权来执行此操作。
在
Unix上,这很难做到,因为在许多地方都进行安全检查。 如果您具有符号软链接,则将扫描符号链接,并且还会使用某些特权等评估路径名。 但是有可能在某些系统中,如果可以在应用程序中独立完成访问控制检查,则可以简化访问控制检查。 您不认为这是一个明智的计划吗? 你同意吗? 是否有重复此测试的危险?
受众:如果您在应用程序中进行检查,则根本无法进行其他检查。
教授:是的,您可以轻松地跳过其他检查,这是绝对正确的。 因此,从某种程度上来说,当他们在这里使用
Fortran编译器时,他甚至没有尝试进行任何检查,因此他们失败了。 除了缺少检查之外,另一个结果是内核可以随时更改,然后其检查会略有不同。 这将引入一些附加的安全要求,但是应用程序将不会更改,并且将实现旧的检查样式。 因此,这不是一个好计划。
请记住,在安全领域有一个好主意-减少所涉及的机制的数量。 因此,该程序仅在少数几个应用安全策略的地方。 您可能不想在应用程序,内核等中重复相同的功能。 您确实希望将这些检查集中在程序中的某个位置。 那么,授权问题应该怎么解决呢?
解决问题最接近的是
Unix上的文件描述符功能。

在可能性的世界中,此方案的替代方法是,您可以使用一个非常简单的方案来代替遵循
名称->对象->权限链并根据
流程UID的外部能力来决定是否可以使用它,而是使用该方案。
假设您具有与特定对象相关的功能。 这些功能对于您可以使用此对象可能有很多限制。

但基本上,如果有机会使用此对象,则可以访问它。 . , , , .
,
Capability , , , , . .
Capability , - , — .
Capability , . , ?
, , . , . , , .
, , , « ». , ,
Capsicum ? ?
: , , ,
Capability .
: , , , , . — .
Unix , 0, , 1, . . , , . , - , , .
PID , ,
PID:57 , . , , . , , , , , .. .

, , , . , -, - , .
, , ,
Unix , , ,
/etc/pwd .
. . , . , « »?

, ,
integer . , . , .
, . , ? , . , .
, ,
Capability ,
Fortran .
sysx/fort ? , ?
: , . , ,
output- . , , .
: , . ,
Fortran /sysx/stat . , .
, , . , , «»
Unix . , , ,
Fortran , , , , , .
.
fort1 , , - , ,
foo.f , , , —
o ,
. , . , .
, , , . ! , , , ,
setuid Fortran .

,
setuid - , . , . , , , , .
, , , , . , , ,
Capability , , , , .
26:30
:
麻省理工学院的课程“计算机系统安全”。 讲座6:机会,第2部分该课程的完整版本可在此处获得。感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的资料吗? 通过下订单或将其推荐给您的朋友来支持我们,为我们为您开发
的入门级服务器的独特模拟,为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服务器的上等课程?