麻省理工学院的课程“计算机系统安全”。 讲座12:网络安全,第3部分

麻省理工学院。 讲座课程#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部分
讲座8:“网络安全模型” 第1 部分 / 第2 部分 / 第3部分
讲座9:“ Web应用程序安全性” 第1 部分 / 第2 部分 / 第3部分
讲座10:“符号执行” 第1 部分 / 第2 部分 / 第3部分
第11课:“ Ur / Web编程语言” 第1 部分 / 第2 部分 / 第3部分
讲座12:网络安全性第1 部分 / 第2 部分 / 第3部分

学生:对于不存在的顶级域,是否有任何类型的签名?

教授:我认为是。 点域只是另一个域,它实现了相同的机制。 因此,“ dot”和“ dot.com”域现在使用DNS SEC,并且所有这些记录都表明,例如,.in是存在的域名,而名称“ dot”也存在他们之间没有其他东西了。 因此,所有这些东西都在顶级域中存在。



学生:除了DoS攻击的危险之外,为什么我们还要特别关注mit.edu中域名的重复?

教授:我不确定。 无论如何,AFS有一个列出所有这些MIT域名的文本文件。 但我认为,总的来说,有些公司在这种意义上有点尴尬,因为它们通常具有内部名称,这些内部名称在DNS中,并且不能提供给外部人员。 我认为,实际上,这是一个尚未正式化的模糊领域,不能确切解释DNS用户所提供的保证。 通常,人们认为如果存在一个机密名称,那么在DNS中将不会公开它。

我认为这是该系统在应提供或不应该提供的内容方面没有明确规范的另一个地方。

学生:是否可以通过突出显示签名来设置签名的有效期?

教授:这些东西都有到期日期,例如,您可以签名说明该组名称有效期为一周,然后客户端(如果它们具有同步时钟)可以拒绝旧的签名消息。

因此,我们可以假设我们通过猜测TCP SYN序列号来讨论攻击。 关于TCP的另一个有趣的问题是DDoS攻击,它利用服务器处于某种状态这一事实。 如果看一下以前在板上绘制的握手,您会看到,当客户端建立与服务器的连接时,服务器必须记住SNc客户端的序列号。 因此,服务器必须在单独的块中支持某些数据结构,这表明此序列号用于此连接。



这是一种表,其中存储了SN序列号,并且客户端-服务器连接具有SNc序列号。 服务器保留此表的原因是因为服务器需要弄清楚以后应该使用正确的SNc序列号,例如SNc + 1。 此外,服务器还需要存储SN号,这非常重要,因为它们向服务器显示与“正确的人”建立了连接。

问题在于该表没有实际边界。 这样,您甚至可以从某台计算机上获取数据包,而无需知道是谁发送的。 您仅会得到一个看起来像C-> S的数据包,其源地址声称是C。要潜在地从该IP地址接受此连接,必须在表中创建一个条目。 此外,这些记录存在很长一段时间,因为也许有人从很远的地方与您建立了联系,而同时又丢失了许多数据包。 在最坏的情况下,例如,可能需要一分钟才能完成某人的TCP握手。 因此,您必须将该状态在TCP堆栈上保留相对较长的时间,并且无法猜测它是否有效。

因此,人们想到的针对大多数TCP堆栈的最常见的DoS攻击是简单传输大量数据包。 如果我是攻击者,我只是将大量的SYN数据包发送到特定的服务器,并导致该表溢出。

问题在于,攻击者充其量只能使用相同的源IP地址。 在这种情况下,您可以简单地说每个客户端仅允许两个条目或类似的条目。 然后,攻击者最多可以在表中使用2个两个条目。

当然,问题在于攻击者可以伪造客户端的IP地址并使它们看起来是随机的。 这样,服务器将很难区分谁在尝试与之建立连接-服务器从未听说过的攻击者或某些客户端。

因此,如果您查看某个应该接受来自世界任何地方的连接的站点,这将是一个大问题。 因为您要么拒绝访问所有人,要么应该能够存储大多数伪造连接尝试的状态。

因此,对于TCP和大多数允许某种类型的连接初始化的协议(服务器必须保存状态)而言,这都是一个问题。 但是,我们稍后将讨论TCP中实现的一些修复,它们将尝试解决此问题,这称为TCP中的SYN Flooding。



通常,这是您应该意识到的问题,并应避免在正在开发的任何协议中使用。 您必须指定服务器在可以进行身份​​验证和标识客户端之前,不应保存状态。 因为只有在客户端身份验证之后才能决定是否允许连接,例如仅一次,因此在这种情况下,服务器不需要保存此连接的状态。

问题在于,即使您不知道谁与您建立连接,您也可以保证状态的保留。 让我们看看如何应对SYN Flooding泛洪攻击,即服务器正在累积过多状态。

您可以再次更改TCP,例如,使用密码学或其他方法很容易地修复它,或者更改负责保存某些状态的内容。 但是事实是我们需要按原样使用TCP。 我们能在不修改现有TCP协议的情况下解决这个问题吗?

同样,这是一个练习,目的是试图弄清楚我们可以执行哪些技巧,或更确切地说,是我们可以抛弃哪些假设,并且在使用它们时仍然遵循现有的TCP标头格式。

诀窍是找到一种制造无状态服务器的聪明方法,这样它就不必将此表存储在内存中。 这可以通过仔细选择SN来完成,也就是说,我们将以完全不同的方式选择序列号,而不是我们之前考虑的公式以及必须添加此功能的地方。 我将给您确切的公式,然后我们将讨论为什么它真的很有趣以及它具有什么良好的性能。

如果服务器检测到正在遭受这种攻击,它将进入模式,该模式使用具有与我们之前考虑的函数F相同的公式来选择SN。



此功能具有源IP地址,目标IP地址以及与以前相同的内容-源端口,目标端口,时间戳和密钥。 我们将把此功能与一个时间戳结合起来,而不是“粗粒度”的几分钟。 标头的这两部分之间有一个分隔,即函数和时间戳,不需要很多位。 我忘记了该协议在实际计算机上的工作原理,但是您可以想象时间戳记占用8位,而其余的序列号公式为24位。

那么,为什么这是个好计划呢? 这是怎么回事 为什么需要这个奇怪的公式? 您必须记住我们试图从序列号中得到什么。 这里发生两件事。

首先是防止重复数据包。 板上还保留了带有此老式序列号的电路,我们在其中添加了一项功能,以防止与以前的连接重复封装。



事实证明,除了使用此操作计划(在某些情况下效果很好)之外,人们找不到更好的方法来保护自己免受SYN Flooding等攻击。 这是一个计划,但另一个计划是一个带有时间戳的函数,我们放弃了旧样式的这一部分。 相反,我们将集中精力确保如果有人响应该数据包向我们提供此ACK序列号(SN),则该人将是“正确的”客户端。

您还记得为了防止IP欺骗攻击,我们有点依赖于此值(SN)。 毕竟,如果服务器在第二步中将此SNs值发送给客户端,我们希望只有该客户端才能在第三步中向我们发送更正后的SNs值,从而完成连接。

这就是为什么您必须将此序列号存储在表中的原因,否则,您怎么知道这是真实答案还是假的? 使用此F函数的原因是现在我们无法将该表保存在内存中。

相反,当显示了第一步中显示的连接尝试时,在第二步中,我们使用此公式计算SN,然后将其简单地发送回想要与我们联系的客户,然后就忽略了此连接。



然后,当第三个数据包到达并且其值(SN)与我们期望看到的相对应时,这意味着有人在第二步中收到了我们的答案,最后将其发送给我们。 最后,在第三步之后,我们可以将该TCP连接的实际记录放入内存中。 这是一种将服务器的持久性推迟到客户端发送序列号的确切值之前的方法。 这种结构的构造使得可以验证客户端是否向服务器发送了准确的期望值,而不是某个任意值。

学生: SNc仅持续有限的时间吗?

教授:是的,服务器不会永久存储SNc值,这不太好。 我没有在图中显示此信息,但是在第三行的末尾有一个字段,该字段显示该数据包没有数据,但是仅包含SNc序列号,因为它具有此字段。



因此,服务器可以恢复SNc的值,因为无论如何客户端都会将其包含在此程序包中。 以前,这没关系,但是现在好像是相关的。 我们在这里不做任何检查,但是存在这样一个字段本身就是一件好事。 但是,这会带来一些可悲的后果。 例如,如果您使用一些可能在这里被滥用的复杂事物。 但是,这还不如客户端请求导致服务器内存溢出那样糟糕。

因为让我们唯一担心的是释放该表的存储空间,并确保与真实客户端建立连接的信心。 如果该客户与我建立了百万联系,我将停止接受他的请求,这很简单。 问题在于,假地址很难与真正的客户地址区分开。

学生:我需要保留时间戳吗?

教授:是的,有一件聪明的事! 当在第三步中获得SN的值时,我们需要弄清楚如何计算该函数F的输入数据,以验证该值是否正确。 因此,我们将时间戳记放在包的末尾,并使用它在函数内部进行计算。 我们可以还原的所有其他内容。 我们知道谁刚发送给我们第三步和程序包,我们拥有所有这些字段和我们的密钥(仍然是秘密的)以及序列中最后8位的时间戳。 在这种情况下,可能发生的情况是,我们仅通过禁止旧的连接来排除太旧的时间戳。

学生:我相信您在受到攻击时会使用此密码,仅是因为您失去了8位安全性,还是出于其他原因?

教授:是的,这不是很好,它具有许多不良特性。 在某种程度上,我们确实失去了8位安全性。 因为现在无可争辩的部分只有24位而不是32位。

另一个问题是,如果您丢失某些包裹会怎样? 在TCP中,通常认为,如果第三个数据包丢失,则客户端可能什么也没有等待。 或者,对不起,也许我们在此TCP连接上运行的协议是假定服务器最初打算说些什么的协议,因此我连接到该服务器并只听了答案。 以SMTP为例,服务器应通过协议向我发送诸如问候语之类的信息。 假设我连接到SMTP服务器,发送了第三个数据包,我想我已经做了所有事情,只是等待服务器回答我,例如:

“嗨,这是SMTP服务器,请给我发送您的电子邮件!”

因此,这第三包可能会丢失。 在真实的TCP中,服务器记得在第二步中它对客户端做出了响应,但从未收到过来自客户端的第三个响应数据包。 因此,服务器将再次向客户端发送第二个数据包以重新启动第三个数据包。 当然,如果服务器不存储任何状态,则不知道发送什么。 这使得建立连接有些问题,因为双方都期望彼此采取对等的步骤。 服务器甚至不知道客户端正在等待来自客户端的响应,并且客户端正在等待服务器的响应,尽管由于它不存储状态,所以它不准备回答。 因此,这是为什么您不经常使用服务器的生产模式的另一个原因。

学生:如果您在一台主机之间紧接建立两个非常短命的连接,那么您也可能会丢失数据。

教授:当然可以。 另一件事是,我们拒绝使用这种旧式的ISN序列号,这增加了这些多个连接在短时间内彼此之间的独立性。 我认为这里有很多折衷方案,我们只讨论了其中三个,因此还有更多值得关注的原因。

如果我们能从头开始开发一个协议,追求最好,那么我们可以为F函数单独准备一个好的64位卷,为时间戳设置一个64位卷,然后我们就可以不断使用它而不会放弃所有这些美好的事物。

学生:第二步和第三步中的SN是否应该相同?

教授:当然,因为否则服务器将无法得出此客户已收到我们包裹的结论。 如果服务器未验证此SN是否具有与以前相同的含义,则情况可能更糟-因为我可以在第一步中伪造来自任意IP地址的连接,然后在第二步中获得此答案。 否则我什至没有得到这个答案,因为它是指向另一个IP地址的。 然后,在第三步中,我从另一个IP地址建立连接。 在这种情况下,服务器将支持已建立的连接,等待我发送数据,依此类推。



学生:但是时间戳会有所不同,对吗? 如果服务器不存储状态,服务器如何使用新的时间戳记帐?

教授:正如我所说,这些时间戳是“粗粒度的”,并且以分钟为单位进行评分。 如果您在同一分钟进行连接,那么一切都井井有条,如果您在分钟的边界进行连接-这太糟糕了。

该电路的另一个问题是,它在许多方面都不完美。 但是大多数工作系统(包括Linux)都具有检测此表中太多条目的方法。 当发生溢出威胁时,系统将切换到另一种方案。

学生:如果攻击者控制了许多IP地址并执行了您所说的,即使您进行了切换,...

教授:是的,你真的做不到。 该计划之所以如此重要,是因为我们想过滤掉或以某种方式区分攻击者和“好人”。 如果攻击者拥有的IP地址比善良的人更多,并且仅控制更多的计算机,那么他就可以连接到我们的服务器,请求多个网页或保持联系。

这样,服务器将很难确定是从合法客户端接收到请求,还是仅是绑定服务器资源的攻击者。 所以你绝对正确。 该方案仅在攻击者的IP地址数量较少并且想要实现效果时才有效。

这令人担忧,因为今天,某些攻击者控制着普通用户的大量黑客入侵计算机。 这样一来,他们就可以使用遍布全球的一系列机器来创建DoS,并且很难防御它。

我想提一件事,有趣的是-拒绝DoS服务本身是不好的,但如果协议本身助长了这种攻击,那就更糟了。 攻击者知道这一点,主要攻击带有DNS之类协议的系统。 DNS协议包括客户端向服务器发送请求,服务器将响应发送回客户端。 而且在许多情况下,以字节为单位的响应大小远大于请求量。



您询问了mit.edu服务器。 , , mit.edu — , mit.edu, , DNS SEC, .

100 , — 1000 . , «» - . , DNS- . 100 - DNS-, , , 1000 .

, . , TCP SYN Flooding, DNS- , . , , « ».

DNS. . , DNS-. , . .

: DNS- …

: , DNS- , - .

: , ?

: , DNS-, . DNS-, . 10 DNS-, , , , , . . , , DNS-, .

, DNS , , , . , .

, , , – , , , . , , . .

DNS- , . , , .

, : «, , »! , , DNS- .

, . - -, . DoS , . , , , , .



, , . , , , .

, , . .

, DHCP, . , , IP-. , , MIT DHCP, , , , IP-, , DNS-, , .

, DHCP DHCP-, , DHCP-. , , . , DHCP IP-, : «, DNS- »! DNS .

, . , BGP, IP-, . , , BGP, : «, IP-!», : „, , “.



, , , IP- . IP- , , IP- . IP- , . , . , , , IP-. , , .

DNS SEC. , , DNS, , . , , , , DNS SEC.

, , , . : , , , , , DoS — . .

因此,您应努力避免诸如SYN Flooding攻击和RST攻击之类的事情,这些攻击使您可以断开任意网络用户的连接。这些东西从低层次来看确实是有害的,而从高层次上很难解决。但是或多或少使用加密来确保数据的完整性和机密性。在下一次有关Cerberus的演讲中,我们将讨论如何执行此操作。


该课程的完整版本可在此处获得

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

VPS(KVM)E5-2650 v4(6核)10GB DDR4 240GB SSD 1Gbps至12月免费,在六个月内付款时,您可以在此处订购。

戴尔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-CN427093/


All Articles