麻省理工学院。 讲座课程#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部分 学生:也许您仍然存在利益冲突问题,因为您可以使用32位作为对等地址,并且每个地址都有许多端口。 您可能对所有这些连接的序列号有冲突?
教授:事实证明,这些序列号特定于源/目标对的IP地址和端口号。 因此,如果这些端口不同,则它们根本不会相互干扰。 具体来说,端口的序列号较低。
学生:如果序列号是全局的,那么攻击者可以进入其他客户端之间的连接吗?
教授:是的,这是一个好点。 实际上,如果服务器将序列号(例如,每次连接增加64k),则连接到服务器,然后再有5个人连接到服务器,在这里您可以组织攻击。 因此,在某种程度上,您是对的,这有点麻烦。 另一方面,您可以这样做,以便将S-> A的最后一行中的程序包在C-> S的第一行中紧接在该程序包之前交付。 如果您一个接一个地发送数据包,则很有可能它们也将一一到达。
服务器将接收到S-> A,并以该序列号(SN)进行响应。 它与第二行中的(SN)不同,但是紧随其后的是序列号。 然后,您将确切知道应该在序列的第三个数据包中包括哪些序列号(SN)。
因此,我认为这不是连接服务器的可靠方法,它是基于假设的。 但是,如果您以正确的方式仔细安排包裹,则可以轻松地猜测顺序。 也许您会尝试几次,但您会很幸运。
学生:即使数字是偶然生成的,您也需要猜测40亿个可能的数字之一。 这不是太多吧? 我认为您可能会在一年之内闯入这个网络。
教授:是的,您绝对正确。 在安全性方面,您不应该过分依赖TCP。 因为你是对的,所以只有40亿个猜测。 如果连接速度较快,则白天可能会发送大量数据包。
因此,这里我们有一个关于TCP不可靠性的有趣论点,因为我们只有32位。 我们无法以任何方式保护他。 但是我认为许多充分依赖此协议的应用程序根本没有考虑安全性,这确实成为一个问题。
但是你绝对正确。 在实践中,由于使用长度超过32位的加密密钥,因此除了要更严格地保证没有人伪造数据之外,还希望使用某种加密方法。 在大多数情况下,这在防止篡改TCP连接方面仍然有效。
现在,让我们看看为什么人们可以伪造来自任意地址的TCP连接,这是多么糟糕?
这种情况不好的原因之一是,当服务器检查请求来自哪个地址时,它会影响基于IP地址的授权。 如果服务器根据IP地址决定是允许还是拒绝连接,对于从任意源地址伪造连接的攻击者来说,这可能是个问题。
因此,存在问题(今天已基本解决)的一个示例是使用r命令家族(如rlogin)。 过去,您可以在athena.dialup.mit.edu上为计算机运行诸如rlogin之类的东西。 如果您的连接来自MIT主机,那么如果您说:“是的,我是该计算机上的Alice用户,请允许我以Alice的用户身份登录到另一台计算机。”此rlogin命令将成功。 由于mit.edu网络上的所有计算机都值得信赖,因此可以执行此操作。
我不得不说拨号从未遇到过这个问题。 该化合物从一开始就使用Cerberus。 但是其他系统当然也有这样的问题。 这是当系统检查呼叫服务器的客户端是否可信任时,在连接身份验证机制中使用IP地址的示例。 因此,过去的问题不再是问题。 但是依靠IP似乎仍然是一个坏计划。

现在,rlogin不再使用,最近已被安全的SSH shell取代,这是一种出色的网络层协议。 另一方面,还有许多其他协议示例依赖于基于IP地址的授权。 SMTP是其中之一。 发送电子邮件时,您可以使用SMTP与某些邮件服务器对话以发送消息。 为了防止垃圾邮件,许多SMTP服务器仅接受来自特定源IP地址的传入邮件。 例如,Comcast邮件服务器仅接受来自Comcast IP地址的邮件。 MIT邮件服务器也是如此-它们仅接受来自MIT IP地址的邮件。 但是我们至少有一台使用IP身份验证的服务器无法正常工作。
这里的一切还不错。 在最坏的情况下,您将通过邮件服务器发送一些垃圾邮件。 因此,这可能就是为什么他们仍在使用rlogin的原因,而允许您登录到任意帐户的操作已停止使用基于IP的身份验证。
那么,为什么这样的身份验证机制是一个坏计划呢? 作为假设,假设某些服务器使用了rlogin。 你会怎么做? 会发生什么不好的事情?
学生:攻击者可以简单地进入您的计算机,用您的用户名伪造要进入网络的用户,并获得对该网络的访问权限。
教授:是的,基本上,攻击者会接管计算机。 它合成看起来像一组有效的rlogin命令的数据,这些命令说:“以该用户身份登录并在我的Unix shell中执行此命令”。
您可以合成此数据数据(SNc + 1),进行整个攻击,然后像合法用户与rlogin客户端进行交互一样发送此数据,然后就可以继续。

嗯,这就是您不希望猜测TCP序列号的原因之一。 另一个问题是这些重置攻击会重置攻击。 以与发送SYN数据包相同的方式,如果我们知道某人的序列号,则可以以相同的方式发送重置数据包。
我们简要提到了一个合法客户端,该客户端发送攻击者已建立的虚假连接重置数据包。 如果攻击者以某种方式知道您的序列号在该连接中,那么它也可能会尝试发送丢弃数据包。 实际上,尚不清楚此问题有多大。
在某种程度上,您应该假定在任何情况下都可以断开所有TCP连接,也就是说,网络看起来并不可靠。 因此,也许您应该期望断开连接。
在路由器彼此“交谈”的情况下,此假设尤其重要。 如果您有许多路由器使用某些路由协议相互通信,则它们之间存在一些物理连接。 但是,除了这些物理连接之外,它们还通过可在TCP上运行的网络协议进行通信。 实际上,在路由器用来交换路由信息的每个物理连接中,都会启动TCP会话。 此处使用BGP协议,我们将在后面讨论。
此BGP协议使用以下事实:如果TCP连接处于活动状态,则物理连接也处于活动状态。 因此,如果TCP连接断开,则路由器认为该连接断开,并开始重新计算其所有路由表。

因此,如果对手想要安排某种DoS拒绝服务攻击,他可以尝试猜测这些路由器的序列号并丢弃这些会话。 如果两个路由器之间的TCP会话关闭,则两个路由器都认为该连接已死,因此它们应该重新计算所有路由表,这将导致路由更改。 之后,攻击者可以重置另一个连接,依此类推。
因此,这是一个令人震惊的攻击,并不是因为它侵犯了他人的机密等等(至少不是直接侵犯了此类信息),而是因为它确实给系统的其他用户造成了很多访问问题。
学生:如果您是攻击者,并且想针对特定用户组织有针对性的攻击,您是否可以继续发送代表其IP地址的连接到服务器的请求,并强迫他重置与服务器的连接?
教授:假设我使用Gmail,并且您想阻止我接收来自Gmail的任何信息,所以只需将数据包发送到我的计算机,假装来自Gmail服务器。 在这种情况下,您必须猜测正确的源和目标端口号。
目标端口号可能是443,因为我使用HTTPS。 但是源端口号将是一些随机的16位数据。 此外,序列号会有所不同。 因此,如果您猜不到我的TCP窗口中的序列号是几十千字节,那么您将不会成功。
因此,您必须猜测很多事情。 这里没有Oracle访问权限。 您不能只问服务器这个人的序列号。 这就是为什么这也不起作用的原因。
因此,许多问题已得到解决,包括基于RST的问题,尤其是对于BGP路由器。 实际上有两个有趣的修复程序。 一件事确实显示了您如何利用现有事物或使用它们来解决特定问题。 它使用以下属性:这些路由器仅相互通信,而不与网络上的任何其他人通信。 结果,如果数据包不是从位于连接另一端的路由器到达的,则该数据包将被丢弃。
这些协议的开发人员的成功实施是称为“生存期”或TTL的软件包中的一个绝妙领域。 这是一个8位字段,每个路由器都会对此字段进行递减,以确保数据包不会以无限循环结尾。 TTL的最大值是255,并且会进一步减小。
那么我在做什么这些智能协议呢? 它们会丢弃任何TTL值不等于255的数据包。因为如果数据包的值为255,则它只能来自此连接另一端的路由器。 而且,如果对手试图将任何其他数据包注入到现有的BGP连接中,则其TTL值将小于255,因为该值将被位于路由路径上的其他路由器(包括该路由器)减小。 因此,该包裹将被接收者简单拒绝。
因此,这是解决此特定问题的向后兼容技术的巧妙组合的一个示例。
学生:右下角的路由器是否发送TTL为255的东西?
教授:这是一台物理路由器。 而且他知道这些是单独的连接,因此他既查看了TTL,又查看了数据包的来源。 因此,如果数据包来自左上角路由器,它将不接受该数据包与右上角路由器之间的TCP连接。
在大多数情况下,这些路由器信任其直接邻居,可以使用“自动平移”多路径路由机制来控制此过程。
BGP的其他修复方法是实现某种形式的身份验证标头,包括MD5身份验证标头。 但实际上,开发人员专注于此特定应用程序,对此重置攻击尤为关键。
这个问题今天仍然存在。 如果存在任何长期连接,而我想中断它,则只需要发送大量RST数据包,大约数十万个,但可能不超过40亿个。 因为服务器实际上很容易受到服务器接受重置的序列号的影响。
它可以是特定窗口中的任何软件包。 在这种情况下,攻击者无需费力即可断开此连接。 这仍然是一个没有真正好的解决方案的问题。
由于序列号的可预测性,可能发生的最后一件坏事是将数据注入到现有连接中。 假设我们有一个类似于rlogin的假设协议,该协议实际上并未执行基于IP的身份验证,因此您必须输入密码才能登录。
问题在于,一旦您输入密码,您的TCP连接就可能被简单建立并且可以接受任意数据。 因此,攻击者只需要等到其中一个人通过输入密码登录计算机即可。
攻击者不知道密码是什么,但是一旦建立TCP连接,攻击者将立即尝试猜测您的序列号并将一些数据输入到您现有的连接中。 因此,如果我可以正确猜出您的序列号,那么我就可以假装它不是我,但是您在使用密码正确验证后输入了一些命令。

所有这些都说明了为什么您真的不想在安全性上依赖这些32位序列号。 但是,让我们看看现代的TCP堆栈实际上在缓解这个问题方面做了些什么。 我们将在接下来的两节讲座中介绍的解决该问题的方法之一是在应用程序级别实现一定程度的安全性。 在此级别上,我们将使用加密技术来对消息进行身份验证,加密,签名和验证,而无需太多的TCP参与。
一些现有的应用程序还可以帮助解决安全性问题,或者至少使攻击者更难以利用这些问题。 人们今天在Linux和Windows上将其付诸实践,例如,为每个源/目标对维护不同的初始序号。
因此,大多数TCP SYN实现仍以与以前相同的方式计算此初始ISN序列号。 这么说,这是一种旧的ISN样式。 为了实际为任何特定连接生成序列号,我们向该旧式ISN添加了随机的32位偏移量。 也就是说,我们向其中添加了一个函数-类似于哈希函数或SHA-1,或者更好的东西。

此功能包括源IP地址,源端口号,目标IP地址,目标端口号和仅服务器知道的某些密钥。 因此,我们为任何特定的连接创造了一个很好的机会来确定源/目标对的IP地址和端口,同时保留了此旧样式序列号分配算法的所有良好属性。
但是,如果您具有来自不同来源/目标集的连接,则没有什么可以让您找出另一组连接的序列号的确切值。 实际上,您必须猜测该密钥才能计算该值。
我希望服务器操作系统的内核将此密钥存储在其内存中的某个位置,并且不要将其提供给任何人。 当今,这就是大多数TCP堆栈在通用32位序列号领域解决此特定问题的方式。 这不是太好,但是可以。
学生:你能再重复一遍吗? 关于密钥的唯一性...
教授:当我的计算机启动时,或任何计算机启动时,它会生成一个随机密钥。 每次您重新加载它时,它都会生成一个新密钥。 这意味着每次特定源/目标对的序列号以相同的偏移频率更改时。 因此,对于给定的源/目标对,功能参数是固定的。 因此,当数字根据新化合物的初始序列号变化并根据特定算法变化时,您可以遵循序列。 因此,提供了防止旧分组从先前的连接注入到新连接中的保护,以及防止分组的重新分配的保护。
我们唯一需要此旧样本序列号的方法是选择算法,以防止这些重复的数据包出现问题。 之前,我们认为如果获得一个连接的序列号A:A-> S:SYN(...),那么在此之后,您可以得出有关ACK(SN)连接的序列号的结论。

, 32- , F. , , .
: ?
: , . F, , F , , , .
: , …
: , F - -, . -, , . , , , , . , F .
, TCP, . , , - .
, . , TCP , DNS, . , DNS UDP – . UDP — , , . UDP . , , , . , , . DNS-. DNS?

, DNS- C: C53 -> S53 mit.edu, 53.
S: S53 -> C53 IP-, – .
, , , , . , mit.edu, .
, DNS- . IP-, , . IP- mit.edu IP-. , , , , . , .

, , . IP-. , , DNS- . , , IP- mit.edu.
: , , ?
: , . , , . DNS-, , . 2 . — , 16 . , 16 . ID, 16 , .
, , 32 . , , , , .

, , .
, DNS DNS . , , DNS . , DNS SEC, . , , , DNS- . , , .
origin. DNS , IP-, : „, “. , , , , , , . , , ?
, – DNS- , . , , . -, DNS-, . , DNS SEC, , , DNS- . DNS- , , , – , .
DNS SEC , NSEC. , . , NSEC , foo.mit.edu, goo.mit.edu, , .

, , , , , , „, “.
. , foo.mit.edu -> goo.mit.edu — >…. : » , , gooa.mit.edu". , , .
, DNS . NSEC3, – - , - .
52:00
麻省理工学院的课程“计算机系统安全”。 12: « », 3.
感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的资料吗? 通过下订单或将其推荐给您的朋友来支持我们,
为我们为您发明的入门级服务器的独特模拟,为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服务器的上等课程?