麻省理工学院。 讲座课程#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部分 受众:如果该
UID提供对该文件的只读访问权限,并且您还具有文件描述符,那么如果丢失了
UID ,您仍然可以获得读取该文件的权限吗?
教授:是的,因为它将出现在目录中。 因为只要将功能添加到文件中就可以了。 它具有特殊特权等对您开放。 但是问题在于他们拥有这种混合设计。
就是说,他们说-您确实可以在目录中添加功能,并且可以在并行工作时打开一个新文件。 可能是您将功能部件添加到了目录中,例如
/ etc ,但是您没有对
/ etc目录中所有文件的强制访问权。 但是,一旦进入功能模式,就可以在知道
/ etc目录的访问权限的情况下尝试打开这些文件。 毕竟它已经打开了,所以为什么不给我一个位于该目录中的名为
“ password”的文件呢?

然后内核需要决定是否允许您以读取或写入模式打开此目录中的文件,或者拥有什么。 因此,我认为这是您仍然需要此外部特权的唯一地方,因为他们尝试创建兼容的设计,在其中他们使用了不太自然的语义来描述目录的操作。 这似乎是唯一保留设置
Unix文件系统原理的地方。
观众:还有其他地方吗?
教授:好问题。 我想我必须先获得他们以前的源代码才能弄清楚发生了什么,但是大多数其他情况实际上并不需要
UID验证。 因为,例如,它不用于网络。 这些可能是通常的文件系统操作-如果您有共享内存段,则只需打开它即可。
受众:如果您具有“
功能”功能,您能否再解释一下用户ID的确切含义?
教授:当您有机会进行分类时,这一点很重要。 问题是,这个机会给您带来了什么? 考虑一种解释,例如,一种清洁系统(而不是
Capsicum)的功能状态。 如果在这样的系统中有机会建立目录,那么您将无条件访问该目录中的所有文件。
在
Unix上,通常不是这种情况。 您可以将目录打开为
/ etc ,但是它具有许多系统文件,可以在其中存储机密信息,例如服务器的私钥。 而且,您可以打开和滚动浏览此目录的事实并不意味着您无法打开此目录中的文件。 也就是说,有权访问目录,就可以访问文件。
在
Capsicum中 ,如果打开
/ etc目录,然后进入功能模式,则会发生以下情况。 您说:“我不知道这个目录是什么。 我只是在其中添加了一个文件描述符。” 有一个名为“ key”的文件。 为什么不打开此文件
“ key” ? 只是因为那一刻,您可能不希望基于功能的过程打开此文件,因为您不需要它。 尽管这允许您绕过该文件的
Unix权限。
因此,我认为本文的作者谨慎地着手开发不会违反现有安全机制的系统。
观众:也就是说,您可以在某些情况下结合使用这两个安全系数? 也就是说,尽管用户可以更改目录中的文件,但是他访问哪些文件取决于他的用户ID?
教授:好的。 实际上,在
Capsicum中 ,进入功能模式之前,您必须猜测以后可能需要哪些文件。 您可能需要共享库,文本文件,模板,网络连接等。 因此,您需要提前打开所有这些。 而且不一定总是需要知道您需要哪个文件。 因此,这些家伙做到了,这样您就可以简单地打开目录的文件描述符并稍后查看所需的文件。 但是,可能是这些文件没有与您相同的权限。 正是由于这个原因,结合使用了两个安全因素-检查功能和用户
uid 。 因此,这是内核机制的一部分。

他们为什么需要像
libcapsicum这样的库? 我认为它们在此库中支持两个主要方面。
其中之一是它们实现了一个名为
lch_start的函数,您应该使用该函数代替
cap_enter函数。
libcapsicum提供的另一个功能是fd列表的概念,该列表用于按数字传递文件描述符。 该
FD列表的目的
很容易解释。 这基本上是
Unix如何在进程之间管理和传递文件描述符的概括。 在今天使用的传统
Unix和
Linux上 ,进程开始时会将一些文件描述符传递给它。 您只需从该表中打开一些带有整数值的文件描述符,然后启动所需的子进程。 或者,您运行一个特定的二进制文件,它会继承
fd表中所有这些开放的插槽。 但是,除了使用数字作为名称之外,没有其他好方法来命名这些东西。
考虑一个示例,其中插槽0用于输入,插槽1用于输出,插槽2用于打印错误消息。 这就是它在
Unix上的工作方式 。 如果您仅将这三个文件或三个数据流传输到该流程,则效果很好。

但是在
Capsicum中,碰巧您在路径中“遍历”了很多文件描述符。 因此,当您传递某些文件的文件描述符时,您将通过网络连接的文件描述符,共享库的描述符等等。 管理所有这些数字非常繁琐。 因此,实际上,
libcapsicum提供了使用层次结构名称(而不是这些晦涩的整数)从进程之间的这些过去文件描述符的名称中抽象出来的功能。
这是他们在库中提供的简单内容之一。 因此,我可以将文件描述符传递给进程并为其命名,无论显示什么数字都无所谓。 这种方法要简单得多。
他们还有另一个更复杂的沙箱启动机制。 这是
lch ,它是沙盒主机
API ,使用它不仅仅是进入
Capability features模式。 除了简单地进入机会模式之外,他们为什么还需要更多东西? 创建沙箱时通常会困扰您什么?
读者: lch可能会擦除所有继承的内容,以确保系统的“干净”启动。
教授:是的。 我认为他们担心尝试考虑沙箱可以访问的所有内容。 关键是,如果您只是在内核机制级别上从技术上调用
cap_enter ,它将起作用。 对不对 它只是阻止您发现任何新机会。
但是问题在于,该流程可能已经可以访问许多现有的东西。
因此,我认为最简单的示例是您忘记了那里的打开文件描述符,它们将被此过程简单继承。

例如,他们考虑了
tcpdump 。 首先,他们甚至在即将解析所有传入的网络连接之前,只需调用
cap_enter即可更改
tcpdump 。 从某种意义上说,这很有效,因为您无法获得更多的功能。 但是随后,他们查看了打开文件描述符,发现您具有对用户终端的完全访问权限,因为您拥有该文件的打开文件描述符。 这样您就可以拦截用户进行的所有击键等。 因此,这可能不是
tcpdump的好计划。 因为您不希望有人拦截您的键盘活动。
因此,对于
tcpdump,他们手动更改了文件描述符,并向其中添加了一些功能,以限制可以执行的操作类型。 如果您还记得,在
Capsicum中,该功能还具有这些额外的位,指示可以针对给定文件描述符执行的操作类别。 因此,他们基本上假定文件描述符为0。它指向tty用户
终端 。 最初,它只是指向内核中
tty结构的直接指针。 为了限制可以对该描述符执行的操作类型,他们在中间引入了一些中间的beta功能结构。 因此,文件描述符指向此功能结构,并且已经指向您尝试访问的真实文件。 而且此功能结构包含一些限制位或对可以实现的文件描述符对象的权限。
因此,使用
tcpdump中的标准数据输入
,您将无法执行任何操作。 您可以看到它的存在,仅此而已。 对于输出文件描述符,当您可以向其中写入某些内容但不能更改记录时,它们为您提供了机会,也就是说,您无法取消所做的更改。

那么,您还能担心启动
沙箱吗? 我考虑文件描述符的状态。 还有其他事吗? 我认为在
Unix上,这些是文件描述符和内存。
另一件事是,这些人担心在您的地址空间中可能会更早分配机密数据。 您将在沙箱中隔离的进程可以读取所有可用内存。 因此,如果您之前检查过某种密码,即用户登录时尚未清除内存,那么此过程将能够读取它并做一些“有趣的事情”。
他们以这种方式解决了这个问题:在
lch_start中,您必须运行一个“新鲜”程序。 您将程序打包,并将所有参数,要提供给它的所有文件描述符打包到其中。 然后,您开始一个新进程或开始整个虚拟内存空间的重新初始化操作。 毫无疑问,此过程不会获得任何其他特权来影响机密数据集。 就二进制名称,参数和程序功能而言,这正是您传递给
lch_start函数的内容。
受众:如果您启动的进程包含二进制
setuid = 0会发生什么?
教授:我认为这些人在功能模式下不使用
setuid “二进制文件”来避免可能出现的奇怪交互。 它们执行此规则:您可以有一个
setuid程序,该程序从
setuid二进制文件中获取其特权,然后可以调用
cap_enter或
lch_start 。 但是一旦进入功能模式,就无法恢复其他首选项。
原则上,这可以工作,但是这很奇怪。 因为,如果您还记得,在功能模式下
UID唯一重要的事情就是打开目录中的文件。 因此,目前尚不清楚这是否真的是获得额外特权的绝佳计划,还是其中存在缺陷。
观众:前面,我们讨论了为什么图书馆实际上并不能真正支持两个安全因素之间的严格分离。 但是我们不必使用
lch_start吗?
教授:是的。 假设您有
tcpdump或
gzip之类的东西-这是他们处理的另一件事。 您假设该应用程序可能没有受到破坏,并且该应用程序具有一些基本功能,并且您在乎它在沙箱中的行为。 对于
tcpdump,这是对来自网络的数据包的解析,对于
gzip,则是对文件进行解包。 在一定程度上,您假设该过程做的一切正确,并且不会存在任何漏洞。 因此,您信任他运行
lch_start,并相信他将正确创建映像,正确配置所有功能,然后限制自己进入功能模式之外的任何其他系统调用。
然后您发射危险的东西。 但是到那时,安装是正确的,您还没有办法摆脱这个沙箱。 因此,我认为您需要了解如何在沙盒应用程序中实际使用功能模式。
因此,我们谈论了一些有关
tcpdump的问题 。 您如何隔离此过程? 另一个有趣的示例是
gzip程序,它可以压缩和解压缩文件。 那么为什么他们担心沙盒呢? 我认为他们担心解压缩代码可能存在问题,或者在解压缩过程中内存管理,缓冲区管理等方面可能存在错误。

另一个有趣的问题是,为什么
gzip的更改似乎比
tcpdump的更改复杂得多? 我认为这是由于应用程序内部结构的原因,对吗? 因此,如果您的应用程序仅压缩了一个文件或解压缩了一个文件,则通常只需启动它而不在功能模式下进行更改即可。 您只需为它提供一个用于解压缩某些内容的新标准,该标准就会在输出处提供解压缩的数据,这样就可以正常工作。
由于这种沙盒方法几乎总是发生问题,因此该应用程序实际上具有更为复杂的过程逻辑。 例如,
gzip可以一次压缩多个文件,依此类推。 在这种情况下,您可以在应用程序的开头进行某种引导,实际上它具有打开多个文件,打包等的附加权限。 而且核心逻辑通常需要成为另一个支持过程。 对于
gzip,该应用程序未进行结构化,因此压缩和解压缩充当单独的进程。 因此,他们必须更改
gzip内核的实现以及应用程序本身的某些结构,以便除了仅将数据传递给解压缩功能之外,还可以通过
RPC调用发送它们,或者实际上将它们写入某种几乎是文件描述符的文件。 这是为了防止发生第三方问题,并且在没有特权的情况下解压缩。
gzip唯一可以做的同时就是将解压缩后的数据返回给调用它的进程。
另一件事是您如何在
OKWS中实际使用
Capsicum ? 您如何看待? 有帮助吗?
OKWS会因为使用起来容易得多
而乐于升级到
FreeBSD吗? 您将如何在
FreeBSD上使用
Capsicum ?
受众:人们可以摆脱一些严格的限制。
教授:是的,我们可以使用存在文件描述符和功能的目录完全替换它们。 您无需设置令人困惑的
chroot 。 不必将
chroot用于很多其他事情,而是可以仔细设置权限。 您可以打开所需的确切文件。 因此,这似乎是一大优势。
接下来,在
OKWS中 ,您具有
OK启动服务,该服务应启动所有父进程。 它们死后,信号返回
okld以重新开始“死”过程。 而且这件事必须运行
root ,因为它必须隔离沙箱中的进程。 但是
OKWS中的许多事情都可以通过
Capsicum进行改进。
例如,您可以为
okld提供更少的特权。 因为,例如,要获取端口80,您需要root特权。 但是之后,您可以放心地将其他所有内容放到沙箱中,因为不再需要root权限。 所以这很酷。 也许您甚至可以委派该进程以响应其他人的请求的权限,例如,一个系统监视进程仅具有该进程描述符或子进程的进程描述符,并且每当此类进程崩溃时,它就会启动一个新的进程。 因此,我认为创建没有root特权的沙箱的功能非常有用。
受众:您可以为每个进程提供文件描述符,该文件描述符仅允许您向日志添加条目。
教授:是的,这很酷。 就像我们上次说的那样,
oklogd可以“
混淆 ”日志文件。 谁知道拥有日志文件本身的文件描述符的内核将允许他做什么。 但是,我们可以通过给它一个日志文件并指示它只能写但不能搜索任何内容来更准确地确定文件描述符的功能。 因此,如果您只是该文件的“编写者”,我们将获得仅附加函数。 非常方便。 您可以授予进程写入文件的权限,但不能读取文件,仅使用
Unix权限很难做到这一点。
Capsicum ?
: , , , . , , , .
: , .
Capsicum , , . .
: , , okld . , .
: , . . , ,
Capability , . , , , , , .
,
OKWS . . , , , . .
, , «». , . , , , , . .
: «» , , ?
: ,
FreeBSD . , - , .
FreeBSD Casper , ,
Capability . , «».
- , , , - , ,
Casper .

, «» . . , , ,
Casper - .
, , - . ,
Unix FD . , . , , .
,
FreeBSD ,
DNS .
DNS -, «». ,
tcpdump . tcpdump , IP-. , ,
DNS -.
, , DNS- DNS-, .
Casper , DNS-.
, , , Capsicum? ? ? , , .
Capsicum , ?
tcpdump
GZIP , , . ?
: , , , . ,
Capability .
: , .
Capsicum , , . , , . , , , ,
Capsicum , .
, «». ,
TCP — helper , , , , . , , , .
: , .
: , . . , .
lth_start , . , , , - .
, , Capsicum . , , , . Unix - , .
, . , . , , . , .
, Chrome . , , , Unix, -,
Unix .
, ?
: .
: . . , . , , , , .
Unix , . , . , . . , .
.
Linux ,
setcall , , . ,
Capsicum , ,
Capsicum , .
Linux setcall , . , ,
Linux .
, — , , , , . , - , «//», .
Capsicum 您可以在其中针对特定文件而不是整个主目录启动该过程。该课程的完整版本可在此处获得。感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的资料吗? 通过下订单或将其推荐给您的朋友来支持我们,为我们为您开发
的入门级服务器的独特模拟,为Habr用户提供
30%的折扣: 关于VPS(KVM)E5-2650 v4(6核)的全部真相10GB DDR4 240GB SSD 1Gbps从$ 20还是如何划分服务器? (RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。
购买六个月的新Dell R630 可免费获得3个月-2个Intel Deca-Core Xeon E5-2630 v4 / 128GB DDR4 / 4x1TB HDD或2x240GB SSD / 1Gbps 10 TB-每月99.33美元起,仅直到8月底,订购可以在这里。戴尔R730xd便宜2倍? 仅
在荷兰和美国,我们有
2台Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100电视(249美元起) ! 阅读有关
如何构建基础架构大厦的信息。 使用价格为9000欧元的Dell R730xd E5-2650 v4服务器的上等课程?