一、介绍

TCP[RFC0793]是当今Internet上用于数据通信的最常见、最可靠的端到端传输协议。然而,20多年前它标准化时,互联网环境和现在相比有很大区别(缺少许多现在常见的威胁)。如今互联网上常见的off-path TCP欺骗攻击就是这样一种威胁。

在TCP欺骗攻击中,off-path攻击者通过伪造IP源和目标地址以及源和目标端口(称为4元组值)来伪造TCP数据包。然后,目标TCP主机会将这样的数据包当作其已有的某个的TCP连接的数据包进行处理。需要注意的是,猜测这个4元组值对于攻击者来说有时是十分困难的。但是有一些应用程序(例如BGP[RFC4271])倾向于在连接两端上使用相同的端口集,这使得正确猜测4元组值的几率大大提高。当攻击者成功猜出4元组值时,可能会对长期连接发起三种类型的注入攻击之一:

  • RST:攻击者通过注入RST段来导致连接中断。”RST段”这里是指RST标志位置位的TCP段。
  • SYN:攻击者注入SYN段来使得接收方相信连接的另一方已重新启动,从而中断连接状态。”SYN段“指SYN标志位置位的TCP段。
  • DATA:攻击者试图注入数据段来破坏传输内容。”这里的“数据段”是指任何包含数据的TCP段。

1.1 Applicability Statement

本文讨论了一些已知的in-window攻击以及针对这些攻击的适当防御措施。本文档中建议的缓解措施应在定期需要维护最易受本文档所述攻击影响的TCP连接的设备中实施。这类TCP连接指那些倾向于长期的连接,并且无法部署诸如TCP MD5[RFC2385]之类的辅助反欺骗保护机制。

1.2 Basic Attack Methodology

以RST攻击为例,对于此攻击,攻击者的目标是使连接的两个端点之一错误地中断连接状态,从而有效地中止连接。需要注意的重要事项之一是,要使攻击成功,RST必须位于有效的接收窗口中。还需要强调的是,接收窗口独立于TCP连接的当前拥塞窗口。攻击者会试图伪造许多RST段,通过在每个可能的窗口中放一个数据包来覆盖可能的窗口空间。要做到这一点,攻击者需要掌握或猜测几条信息,即:

  • 包含连接两端的IP地址和TCP端口号的四元组值。对于一方(通常是服务器),猜测端口号很简单。客户端可能很容易被攻击者猜到,也可能不容易被攻击者猜到,这取决于许多因素,尤其是所涉及的操作系统和应用程序。
  • 将在RST段中使用的序列号。此序列号将是一系列猜测的起点,最终实现让连接的另一端接收这个RST段。任何随机值都可以用来猜测起始序列号。
  • 两个端点正在使用的窗口大小。此值不必是确切的窗口大小,因为使用较小的值来代替正确的值只会导致攻击者在成功进行之前测试更多的段。大多数现代操作系统都有一个默认窗口大小,通常应用于大多数连接。但是,有些应用程序可能会更改窗口大小以更好地满足应用程序的需要。通常情况下,攻击者在某型情况(知道受到攻击的应用程序)下,可以得出与连接上使用的实际窗口大小非常接近的近似值。

在获取了上述信息之后,攻击者开始发送RST段(这些段带有猜测性的sequence number)。每次发送一个新的RST段时,序列号猜测值将递增窗口大小。该方法的可行性首次在[SITW]中进行了阐述。这是因为[RFC0793]指定当前窗口中的任何RST都是可接受的。此外,[RFC4953]还讨论了不同窗口大小和带宽的攻击成功的概率。

对TCP的段处理规则稍加改进,就可以对这种攻击进行有效阻断。如果接收方检查传入的RST段并验证序列号是否与下一个预期的序列号完全匹配,那么这时攻击将比[SITW]中概述的要困难得多。本文档将详细讨论TCP的段处理规则中需要更改的内容,以减轻所有三种类型的攻击(RST、SYN和DATA)。

1.3 Attack probabilities

每个应用都有着许多能决定一次欺骗性攻击是否成功的关键元素,这些元素包括:

  • Window Size:通常由应用程序设定,但是大多数时候默认为32768或65535,这取决于操作系统 (see Figure 6 of [Medina05]).
  • Server Port number:这个值通常是一个固定的值,因为这样客户端才知道在哪里连接到这个节点。
  • Client Port number:这个值可能是一个暂时性的随机值,如果是这样的,欺骗性攻击会变难。但有一些客户端会选择一个固定端口号或者很容易猜到的端口号,对这些客户端的攻击就简单了很多。

在后面的介绍中假设攻击者已经获取了四元组。此时我们仅需要关注窗口大小对攻击者必须生成的欺骗性包数量的影响。但是这个假设在实际情况中是不现实的,因为至少客户端的端口号会提供一些随机性(取决于操作系统)

为了为了成功注入一个欺骗性的包(RST、SYN或DATA),在没有进行此强化改动时,攻击者平均需要猜测1/2∗(232/window)1/2 * (2^{32}/window)1/2∗(232/window)次就能成功执行攻击。

利用数字替换上面的公式,这就代表着如果窗口大小为32768,那么攻击者在成功前平均需要猜测65536个包。如果窗口大小为65535,那么包的数量会降低为32768个。在现在的带宽条件下,这种大小的攻击是可行的。并且随着家庭和办公带宽的不断提高,默认窗口大小的值会不断提高,因此可以预见这种攻击带来的威胁会不断提高。

从上述的讨论可以看出这种漏洞带来的隐患。此外还有一个影响因素,这个因素是TCP连接的持续时间,对于网络来说,大多数情况下一个TCP通常只会持续几个包,这种情况并不是这种攻击的目标。然而,还有一些应用,例如BGP [RFC4271],很容易受到这种vulnerability的影响。BGP依赖于BGP节点间的持续性的TCP。 Resetting the connection can result in term-medium unavailability due to the need to rebuild routing tables and route flapping; see [NISCC] for further details.

对于可以使用TCP MD5选项[RFC2385]的应用程序(如BGP),该选项使得本文中描述的攻击实际上不可能发生。但是,一些应用程序或implementation实现该选项的成本很高。

对于本文所述的威胁,还有其他保护措施。有关攻击和现有技术的更多详细信息,请参阅[RFC4953]。还需要强调的是,正如在[TSVWG-PORT]和[RFC1948]中所建议的那样,端口随机化和初始序列号(ISN)随机化将有助于提高TCP连接对路径外攻击的鲁棒性。

三、Blind Reset Attack Using the RST Bit

3.1 对攻击的描述

如同介绍中所述,攻击者可以通过猜测位于有效窗口内的sequence number来生成一个TCP接收方将会接收的RST段。RFC 793中有着如下的陈述:

在所有除了SYN-SENT的状态外,所有的RST段都通过检查SEQ域(sequence number)来进行验证。RST段中的sequence number如果位于接收窗口内,那么它就是有效的。在SYN-SENT状态时(此时的过程是发送初始SYN后接收到了一个RST作为回应),此时这个RST如果ACK域acknowledge了SYN,那么是有效的。

3.2 Mitigation

[RFC0793]对位于synchronized状态的TCP如何处理到来的RST标志位置位的段的规定如下:

  1. 如果RST标志位置位并且sequence number在当前接收窗口外 (SEG.SEQ <= RCV.NXT || SEG.SEQ > RCV.NXT+ RCV.WND),那么直接丢弃这个段
  2. 如果RST标志位置位并且sequence number可接受,即RCV.NXT <= SEG.SEQ < RCV.NXT+RCV.WND,那么重置这个连接

本文建议进行对上述进行如下的修改:

  1. 如果RST标志位置位并且sequence number在当前接收窗口外,直接丢掉这个段
  2. 如果RST标志位置位并且sequence number正好匹配下一个需要的sequence number (RCV.NXT),这时TCP MUST重置这个连接
  3. 如果RST标志位置位并且sequence number并不严格匹配期望接收的sequence number,但是在当前的接收窗口内 (RCV.NXT < SEG.SEQ < RCV.NXT+RCV.WND),那么TCP MUST 发送一个acknowledgment信息 (challenge ACK):<SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK>
    在发送这个challenge ACK后,TCP MUST丢弃这个不可接受的段,并继续处理将要到达的段。

注意在SYN-SENT状态时(这时会收到一个RST来回应刚发送的SYN),如果这个RST的ACK域acknowledge了这个SYN,那么RST有效。否则接收方MUST丢弃这个段。

在对初始TCP进行上述改动后,对攻击者而言生成一个有效RST段变得困难了许多。

当远端节点的确生成了一个RST,但是没有正好匹配sequence number时,此时challenge ACK被发送回来,但是远端节点已经没有了和这个连接相对应的transmission control block(TCB)。 hence as per [RFC0793], the remote peer will send a second RST back. The sequence number of the second RST is derived from the acknowledgment number of the incoming ACK. This second RST, if it reaches the sender, will cause the connection to be aborted since the sequence number would now be an exact match.

A valid RST received out of order would still generate a challenge ACK in response. If this RST happens to be a genuine one, the other end would send an RST with an exact sequence number match that would cause the connection to be dropped.

Note that the above mitigation may cause a non-amplification ACK exchange. This concern is discussed in Section 10.

四、Blind Reset Attack Using the SYN Bit

4.1 对攻击的描述

The analysis of the reset attack using the RST bit highlights another possible avenue for a blind attacker using a similar set of sequence number guessing. Instead of using the RST bit, an attacker can use the SYN bit with the exact same semantics to tear down a connection.

4.2 减轻

RFC 793中规定了处于synchronized状态时收到SYN置位的段时进行的处理:

  1. 如果SYN标志位置位并且sequence number位于期望窗口外,那么向发送者发送回一个ACK
  2. 如果SYN标志位置位并且sequence number是可以接收的,即RCV.NXT≤SEG.SEQ≤RCV.NXT+RCV.WNDRCV.NXT\le SEG.SEQ\le RCV.NXT+RCV.WNDRCV.NXT≤SEG.SEQ≤RCV.NXT+RCV.WND,那么向发送方发送回一个RST段

Instead, the handling of the SYN in the synchronized state SHOULD be performed as follows:

  1. 如果SYN标志位置位,那么不考虑sequence number,TCP必须向remote peer发送回一个ACK(也被称为challenge ACK):<SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK>
    在发送了这个acknowledgment后,TCP必须丢弃这个unacceptable segment and stop processing further.

通过发送ACK的机制,remote peer需要验证自己对于先前连接的丢失以及重新启动一个新的连接的请求。一个合法的peer在重启后已经没有了之前处于synchronized状态下的TCB。因此,当ACK到达时,这个peer应当发送回一个RST段,这个段中包含从到达ACK中获取到的sequence number。

这个RST会证实remote peer确实已经关闭了先前的连接。当收到了这个有效的RST后,本地TCP MUST关闭这个自己的连接。本地TCP接下来需要重新经过三次握手来重新建立连接。

一个欺骗性的SYN,
A spoofed SYN, on the other hand, will then have generated an additional ACK that the peer will discard as a duplicate ACK and will not affect the established connection.

Note that this mitigation does leave one corner case un-handled, which will prevent the reset of a connection when it should be reset (i.e., it is a non-spoofed SYN wherein a peer really did restart). This problem occurs when the restarting host chooses the exact same IP address and port number that it was using prior to its restart. By chance, the restarted host must also choose an initial sequence number of exactly (RCV.NXT - 1) of the remote peer that is still in the established state. Such a case would cause the receiver to generate a “challenge” ACK as described above. But since the ACK
would be within the outgoing connections window, the inbound ACK would be acceptable, and the sender of the SYN will do nothing with the response ACK. This sequence will continue as the SYN sender continually times out and retransmits the SYN until such time as the connection attempt fails.

This corner case is a result of the [RFC0793] specification and is not introduced by these new requirements.

Note that the above mitigation may cause a non-amplification ACK exchange. This concern is discussed in Section 10.

参考:
https://datatracker.ietf.org/doc/html/rfc5961

RFC 5961翻译相关推荐

  1. RFC 4904 翻译

    RFC4904 网络工作组                                         V. Gurbani RFC:  4904            Bell Laborato ...

  2. RFC 2132 的 DHCP Options

    DHCP介绍(RFC 2132 DHCP Options ) Dhcp Server options的格式 RFC 1497 Vendor Extensions 主机IP层参数 接口的链路层参数 TC ...

  3. 【RFC7414 传输控制协议 (TCP) 规范文档的路线图】(翻译)

    原文 rfc7414 (ietf.org)   A Roadmap for Transmission Control Protocol (TCP) Specification Documents  传 ...

  4. tcp假连接_ESTABLISHED状态的连接收到 SYN 会回复什么?

    通过阅读这篇文章,你会了解到这些知识 ESTABLISHED 状态的连接收到乱序包会回复什么 Challenge ACK 的概念 ACK 报文限速是什么鬼 SystemTap 工具在 linux 内核 ...

  5. lwIP 细节之三:TCP 回调函数是何时调用的

    使用 lwIP 协议栈进行 TCP 裸机编程,其本质就是编写协议栈指定的各种回调函数.将你的应用逻辑封装成函数,注册到协议栈,在适当的时候,由协议栈自动调用,所以称为回调. 注:除非特别说明,以下内容 ...

  6. Python挑战游戏( PythonChallenge)闯关之路Level- 1

    闯关过程 关卡入口地址: http://www.pythonchallenge.com/pc/def/map.html 打开页面是这样的: 在图中的你内容,可以看到 K->M O->Q E ...

  7. TCP旁路劫持,糟糕的RFC5961

    RFC5961 & CVE-2016-5696,哈哈,典型的拆了东墙补西墙,瘸子治成哑巴. 我一直坚信,信息安全的最高机密就是三缄其口,沉默是金.通俗点说就是不和陌生人说话,不和逼逼的人交谈. ...

  8. 修改TCP Timestamp优化传输性能

    TCP单边优化是CDN之大忌,但又不能不说.常规单边优化使能于作为发送端的CDN服务器,但对诸如客户端上传场景,此举便使不上力.怎么办? 可在接收端修改针对上传data之ack的时间戳,以减小发送端的 ...

  9. Vue 新 ref 语法糖提案引热议 尤雨溪回复

    近日,Vue 发明人尤雨溪在 Vue RFCs 下提交了一份新的 Ref 语法糖提案,该提案一经发布便引来了不少争议. 提案内容 这份提案就是在单文件组织(SFC)中引入一个新的script 标签写法 ...

  10. 12.3 拥塞控制流程

    12.3.1 TCP拥塞状态 TCP拥塞状态共有5个: 135 enum tcp_ca_state { 136 TCP_CA_Open = 0, 137 #define TCPF_CA_Open (1 ...

最新文章

  1. SPU表管理之保存SPU表数据
  2. 采集网站特殊文件Meta信息
  3. 七种在BIM实施过程中减少浪费的方法
  4. 广西大学计算机技术复试题库,2018年广西大学计算机与电子信息学院408计算机学科专业基础综合之计算机操作系统考研基础五套测试题...
  5. CodeForces - 894B Ralph And His Magic Field(组合数学+思维)
  6. 《吃土》读书笔记-笔记初稿
  7. 全栈测试:平衡单元测试和端到端测试
  8. 黑龙江省2021高考成绩排名查询,黑龙江高考排名对应学校-高考位次对应大学(2021年理科参考)...
  9. php mysql索引最左原则_MySQL 索引使用策略及优化
  10. IT程序猿常用编辑工具:UltraEdit for Mac v21.00.0.12中文版
  11. 各类曲线的参数方程_常见曲线的参数方程
  12. 通过Snap7与 LOGO!8PLC通信
  13. 信号及传播介质 综合布线系统
  14. 计算机如何分割硬盘,电脑硬盘怎么分区 电脑硬盘分区方法大全
  15. 【机器学习】机器学习笔记(吴恩达)
  16. 跨越生态裂谷 华为云Stack如何为企业智能化转型架桥铺路?
  17. SSM-Mybatis的Mapper.xml配置文件
  18. Could not find a declaration file for module ‘xxx‘. ‘xxx‘ implicitly has an ‘any‘ type.
  19. 亚马逊云科技帮助德比软件轻松应对爆发的增长
  20. jupyter添加快捷方式

热门文章

  1. java m e 获取公钥_Java如何生成公钥和私钥?
  2. 计算机网络技术期末应用试卷,中专学校2016年《计算机网络技术与应用》期末考试题(考试卷与答案)...
  3. unity 改变ui文字_如何在Unity中实现逐字打印UI中的Text文字
  4. 网易互娱基于 Flink 的支付环境全关联分析实践
  5. 基于 Flink 的典型 ETL 场景实现方案
  6. python创建gui界面_你要的 Python 创建 GUI 用户界面程序,来咯
  7. python 开发公众号sdk_「公众号开发」基于Serverless架构Python实现公众号图文搜索...
  8. python ip代理池维护_python3编写网络爬虫18-代理池的维护
  9. html调用rpst 源码_parseHTML 函数源码解析(四) AST 基本形成
  10. linux系统关闭指定服务的方式