LWN: 利用TCP SACK机制让远端Linux崩溃

从 TCP/IP 协议谈 Linux 内核参数优化 在硬件资源有限的情况下,最大的压榨服务器性能,提高服务器的并发处理能力,是很多技术人员思考的问题,除了优化Nginx/PHP-FPM/Mysql/Redis这类服务软件配置外,还可以通过修改Linux的内核相关TCP参数,来最大的提高服务器性能。 在Linux内核参数优化之前,我们需要先搞懂TCP/IP协议,这是我们实施优化的理论依据。 TCP/IP协议 TCP/IP协议是十分复杂的协议,完... 阅读详情
640点击上方蓝色字关注我们~



The TCP SACK panic

By Jake Edge
June 19, 2019

Selective acknowledgment (SACK) 是TCP里面用到的一个机制,帮助减少丢包重传导致的拥塞。网络的这一端点就可以利用这个机制,来告诉对端自己收到了哪部分数据,然后对端就知道只需要传送缺失的这部分数据即可。不过,最近在Linux的SACK实现里面发现了一个bu,可能会被远程攻击者利用,通过发送特制的SACK信息而让接收方的Linux进入panic状态。


TCP发送的数据都是被分割为很多个片段(根据网络对端或流经节点里所支持的maximum segment size, MSS,最大分片长度)。这些数据包成功到达对端之后,对方会恢复acknowledge包来确认说收到这些数据了。


以前,这些acknowledgement包(ACKs)只包含有限信息,如果碰到数据丢失(例如由于拥塞控制而丢弃)的话,哪怕收到后续的数据,也只会ack到第一个丢失的数据包为止。发送方就只能重发从这个包开始的所有数据(事实上跳过丢失的包之后的数据在接收方已经收到了)。这样发送方需要重新传送很多对方其实已经收到的数据包,因为发送方不知道后续这些包对方已经收到了,因此只能盲目重传。


举个简化的例子,发送方A可能发送了序号20~50的数据包,而23和37这两个包在中途就被丢弃了。接收方B只能对20~22这几个包进行ACK,所以A需要重新发送23~50这些包。


很容易想到的一点,如果链路本身拥塞很严重导致丢包,那么又重复发送了这么多数据包肯定会加剧拥塞。


Selective acknowledgment就是创建出来消除这些重复的网络数据的。它诞生于1996年,RFC 2018号。这里的核心想法就是接收端B能够ACK 20~22, 24~36,38~50,这样A只需要重发第23和37这两个包。这里应该很容易理解,就像某个人读了一个30个字的一段话给你听,但是你没有听清第三个字,那你肯定不会让对方从第三个字开始把后面所有的字都再念一遍。


为了实现这个机制,网络子系统的代码里面需要做一些记录工作,本文所提到的bug就是出现在这里。


kernel有个名为struct sk_buff(通常叫做SKB)的数据结构,这就是用来存放各种类型的网络数据的,会用于transmit queue(发送队列),receive queue(接收队列),SACK queue(SACK队列)等等等等。可以读一下网络模块的代码维护者David Miller的一篇很好的综述文章(http://vger.kernel.org/~davem/skb_data.html  ),帮助理解SKB在kernel里是怎么使用的。TCP会把data stream分成32KB(powerPC上是64KB)的fragment,然后记录下来。而kernel在做fragment分割的代码,和SACK处理代码,这里合作时出现了问题。


struct tcp_skb_cb是一个control buffer(用于控制的缓存)结构,记录一个TCP packet的各种信息,包括它被分割成多少个segment/fragment。这个主要是用于general segmentation offload (GSO)功能,用来把packet的segmentation分段动作尽量放在网络协议栈的更低层级来做,甚至可能的话放到网络硬件(例如网卡)里去做。这里的segment的数据是存在tcp_gso_segs成员变量里的,这是一个2个byte大的ussigned int数。如果segment的数量不超过64K的话,肯定是足够了。


不过,如果网络传输双方都打开了SACK机制(网络连接建立时协商的结果)的话,可能就不够了。攻击者可以使用一个很小的MSS值(例如48 byte,这样真正的用户数据就只能用8 byte空间了),然后仔细选择ack哪些segment,从而让tcp_gso_segs值溢出。在kernel里,为何能更加高效的处理多段未被ack的数据segment,可能会选择对多个SKB进行拼接合并,这个动作就可能被恶意攻击者利用来让tcp_gso_segs溢出。


如果发生溢出的话,会触发tcp_shifted_skb()里的BUG_ON()调用,导致kernel panic。这是Jonathan Looney(来自Netflix)发现的SACK相关的bug里面最严重的一个了。同时还报告了其他两个Linux bug,同样都会导致SACK变慢,或者占用大量资源,从而利用来做拒绝服务攻击(DoS)。此外Looney还在FreeBSD 12,在用RACK TCP stack的时候,发现了一个类似的SACK拖慢系统的问题。RACK是一年前Netflix刚刚贡献给FreeBSD的。


这个SACK panic问题被命名为CVE-2019-11477,很明显,这是Linux的一个相当严重的问题。CVE-2019-11478是另外一个DoS攻击漏洞,就是通过特制的SACK序列来导致TCP传输队列数据进行分片fragmentation,从而占用大量资源。CVE-2019-11479里面则指出如果Linux的MSS设置为48,就会导致在发送很少的用户数据的时候就能占用大量的CPU, memory,以及bandwidth。针对性的解决方案,是提供了一个sysctl knob开关给系统管理员,允许设置kernel能接受的最小的MSS值,缺省值仍然配成是48,主要是出于兼容性考虑,不过管理员可以很轻松的改变这个配置了。


这个问题已经完全搞清楚了,Netflix的报告里也提供了修复问题的kernel patch,它们在6月17日被分别合入了Linux 5.1.11, 4.19.52, 4.14.127, 4.9.182, 4.4.182这几个stable update(稳定版kernel发布)里。多数的发行版里都已经更新了kernel,用户也请尽量更新。


目前无法更新的用户,还有一些其他方法来避免收到攻击。可以利用iptables来限制MSS的选值,等等其他方式。不过这些方法都需要关闭MTU probing(通过设置net.ipv4.tcp_mtu_probing为0),否则无法彻底避免CVE-2019-11477和CVE-2019-11478。当然这两个CVE攻击也可以通过关闭SACK来避免(设置/proc/sys/net/ipv4/tcp_sack为0)。为了避免CVE-2019-11479攻击,管理员只需要利用Netflix列出的几种方法来把MSS值太小的给过滤掉。Red Hat的vulnerability report也跟Netflix的报告一样,提供了很多细节信息。这样的远程kernel crash攻击确实是一个让人很不爽的漏洞,可能会有大范围的受害者。不过,只有在网络连接的端点会受影响,这样稍微限制了一下影响范围。至少服务器和桌面PC都能通过更新来解决,而网络链路的各个中间节点,就不是那么好解决了。


全文完

LWN文章遵循CC BY-SA 4.0许可协议。

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议上的修改再创作~


长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~


640?wx_fmt=jpeg

深入理解TCP选择性确认(SACK):优化网络传输的机制 TCP(传输控制协议)是互联网上使用最广泛的协议之一,用于在不可靠的网络环境中提供可靠的数据传输服务。然而,在某些情况下,如网络拥塞或丢包,TCP的默认重传机制可能会导致不必要的性能下降。为了解决这个问题,TCP引入了选择性确认(SACK)机制。本文将详细介绍SACK的概念、工作原理、实现方式以及它如何提高TCP传输的效率。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过序列号、确认应答、重传机制等确保数据的顺序、完整性和可靠性。 阅读详情

相关推荐

让Linux系统崩溃的命令

【代码】让Linux系统崩溃的命令。

小灰灰的博客 2161

Linux系统崩溃解决方案:处理方法详细解析

本文介绍了处理Linux系统崩溃的一些常见方法,包括检查硬件问题、分析日志文件、更新驱动程序和内核、检查并修复文件系统错误、检查并修复软件包依赖关系以及进行内存测试。通过采取适当的措施,我们可以解决Linux系统崩溃问题,并确保系统正常运行。常见的日志文件包括/var/log/syslog、/var/log/messages和/var/log/kern.log等。在进行系统运维时,Linux系统的崩溃是一种常见的问题。内存测试将帮助检测和诊断内存问题,如损坏的内存模块或错误的内存设置。

GnzhNetwork的博客 1440

原来几行代码就能让你的Linux系统崩溃

其实很简单: #include int main() { while(1) { fork(); } return 0; }实际上代码很简单,让你的系统不断的申请资源,创建进程,直到你的系统资源被耗尽,那么此时你的系统就会崩溃了~~~ 当然,一般会有防护措施,有设置可以运行的最大进程数,而不至于是系统崩溃,你可以试着

Chen_dSir的博客 4910

linux内核协议栈 TCP选项之SACK选项概述

目录 1SACK概述 1.1 SACK允许选项 1.2 SACK选项 2SACK允许选项的发送 2.1 SYN段发送 2.2 接收SYN段 2.2.1 struct tcp_options_received 2.2.2 tcp_parse_options() 2.3 发送SYN+ACK段 3D-SACK 1SACK概述 标准的TCP确认机制中,如果发送方发送了0-1000序号之间的数据,接收方收到了0-100、300-1000,那么接收方只能向发送方确认101,这时发送方会重...

2731

CentOS 7.9安装python3.11

CentOS 7.9安装python3.11

leafseelight的专栏 1342

Sack Panic漏洞TCP MSS机制(二)(together with myself)

没有一,哪有二? 其实已经有一了,不过不是我写的: Linux 内核 TCP MSS 机制详细分析 https://paper.seebug.org/966/ 作者原文几经update,终于上了点道,挺好的…我也就不喷了。 不过我写这篇文章就是等着大家来喷的,虽然这是个小众的优快云平台,但是但凡看到的仍然可以喷我。 我就是直言不讳,我说的难听,同样也不能阻止别人说话难听,难听点好,良药! 真正懂...

TCP/IP 3655

标准化降水指数介绍

Mckee et al.(1993)认为降水量的减少是导致干旱的主要因素,其他气候因子一般变化较小,对干旱产生的影响不大,因此SPI使用降水量作为唯一参数。SPI能较好表达因降水量的大小反映干旱状况,操作简单,所需资料仅为降水量,同时该干旱指数在各个地区和各个时段都具有良好的计算稳定性,是继PDSI之后另一种被广泛应用的干旱指数。𝐻(𝑥)是Γ分布求得的概率,并当𝐻(𝑥)>0.5时,S=1;式中,𝛼是形状参数,𝛽是尺度参数,𝑥是当月降水量,𝛤(𝛼)是Gamma函数,用极大似然估计法计算最佳的𝛼和𝛽,即。

weixin_44259522的博客 2857

异常包攻击类详解

异常包攻击,ping-of-death,Land-base,tear-drop,TCP 异常攻击

sdgdsczs的博客 1765

VHDL按键消抖(状态机版本)

检测下降沿:设置一个和,分别代表之前的之前和之前的信号状态,若两个信号key_in_d2=1,key_in_d1=0,他俩的not key_in_d2 and key_in_d1为1,则说明下降沿产生,把它设置为标志位key_flag。延时计数:50MHz的板子每次计数需要20ns,而抖动时间大约为5-10ms。所以取7ms,作为延时时间。可以看见当检测到下降沿时,开始计数计数计满再次检测,若为低电平则为按下按键,否则为抖动。通过检测下降沿来临,延时计数再次检测,如果为低电平则为按键按下。

qq_69639216的博客 1083

ROS小车定位实战:如何用rf2o_laser_odometry和robot_localization实现精准里程计(附避坑指南)

本文详细介绍了如何利用rf2o_laser_odometry和robot_localization在ROS中实现高精度小车定位。通过激光里程计与状态估计的黄金组合,解决室内移动机器人的定位难题,包括环境搭建、算法配置、多传感器融合策略及实战避坑指南,帮助开发者快速部署稳定可靠的定位系统。

weixin_29081703的博客 287

TCP重传机制详解——02SACK

场景触发条件dup ACK三次后会触发快速重传/proc/aya/net/ipv4/tcp_sack=1但不带SACK块信息dup ACK三次后会触发快速重传/proc/aya/net/ipv4/tcp_sack=1且携带SACK块信息SACK块个数三个后会触发快速重传。

m0_47104421的博客 2874

从转发时钟到嵌入式时钟:CDR、CTLE与DFE在高速串行链路中的协同演进

本文深入探讨了高速串行链路中CDR、CTLE与DFE技术的协同演进。从转发时钟到嵌入式时钟的转变,详细分析了CDR的工作原理与实现架构,以及CTLE和DFE在信道损耗补偿和ISI干扰消除中的关键作用。通过实战案例展示了这些技术在28Gbps至112Gbps SerDes设计中的优化策略与性能提升。

weixin_42539414的博客 294

TCP SACK panic漏洞的解释和思考

转载地址:https://blog.youkuaiyun.com/dog250/article/details/93397367 最近几天一直在和CVE-2019-11477 SACK panic漏洞进行纠缠,挺有意思的。 细节就不多说了,给出几个链接自己看吧:https://access.redhat.com/security/vulnerabilities/tcpsackhttps:...

认知 行动 坚持 3707

【深度学习】普通卷积、DWconv(逐深度卷积)与PWconv(逐点卷积)以及DSconv(深度可分离卷积)

深度可分离卷积(Depthwise Separable Convolution)通过将常规卷积分解为逐通道卷积(Depthwise)和逐点卷积(Pointwise)两步,显著减少了参数量和计算成本。常规卷积同时提取空间和通道特征,而深度可分离卷积先对每个通道单独进行空间卷积,再用1×1卷积调整通道数。以输入3通道、输出4通道的64×64图像为例,常规卷积需108个参数,而深度可分离卷积仅需39个参数,减少了约2/3。这种结构在轻量级网络(如MobileNet)中广泛应用,可在保持性能的同时降低计算资源需求。

猫天意的博客 4053

从零实战:模拟Soul/陌陌附近的人接口爬虫(设备指纹·加密逆向·动态代理全解)

在移动互联网流量见顶的今天,LBS(基于位置的服务)社交平台——尤其是Soul和陌陌——依然掌握着海量高活用户的地理位置画像、兴趣标签、在线活跃时段等敏感数据。对于市场调研、流量运营、甚至是城市热力分析而言,“附近的人”接口是一个极具价值的入口。然而,这两款App均采用全参数加密 + 设备指纹风控 + WAF动态防御的三重护城河。直接使用Requests库调用公开API无异于以卵击石。本文将从逆向工程视角出发,完整还原一套可用的附近人信息采集方案,涵盖:抓包与流量分析(绕过SSL Pinning)

2201_76125261的博客 210

浅析TCP之SACK(选择性确认)

参考教材:TCP-IP Guide 引入理由 在文章TCP-IP详解:超时重传机制中,有介绍到快速重传和超时重传都会面临到一个重传什么包的问题,因为发送端也不清楚丢失包后面传送的数据是否有成功的送到。主要原因还是对于TCP的确认系统,不是特别的好处理这种不连续确认的状况了,只有低于ACK number的片段都被收到才有进行ACK,out-of-order的片段只能是等待,同时,这个时间窗口是无法向右移动的。 举个例子: 1. 服务发送4个片段给客户端,seg1(seq=1,len=80),se.

流风回雪的博客 5289

RKNN 端侧部署必看:YOLOv11 Pose 姿态估计模型转换与性能优化实战

随着人工智能技术在边缘计算领域的快速发展,姿态估计作为计算机视觉的重要分支,在智能监控、人机交互、体感游戏等场景中展现出巨大的应用潜力。本文深入研究了YOLOv11 Pose模型在Rockchip RKNN平台上的部署方案,从理论基础、模型转换、平台优化到实际部署进行了全面阐述。通过详细的技术分析和实验验证,证明了RKNN平台能够有效提升YOLOv11 Pose的推理性能,在RK3588硬件平台上实现了高达100 FPS的实时姿态检测,为边缘计算场景下的姿态估计应用提供了高效的解决方案。

m0_71589036的博客 183

TCP的ACK原理和延迟确认机制

原文地址:https://blog.youkuaiyun.com/gamekit/article/details/53898802 一、ACK定义 TCP协议中,接收方成功接收到数据后,会回复一个ACK数据包,表示已经确认接收到ACK确认号前面的所有数据。 ACK字段长度为32位,能表示0~2^32-1之间的值。 二、ACK作用 发送方在一定时间内没有收到服务端的ACK确认包后,就会重新发送TCP数据包。发送方收到了ACK,表明接收方已经接收到数据,保证了数据的可靠达到。 三、ACK机制 接收方在接收到数

liujiayu2的专栏 2682

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

mysql centos7 内核参数_CentOS7 内核参数优化

# allow testing with buffers up to 128MBnet.core.rmem_max = 134217728net.core.wmem_max = 134217728# # increase Linux autotuning TCP buffer limit to 64MBnet.ipv4.tcp_rmem = 4096 87380 67108864net.ipv4....

weixin_31504783的博客 409

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Linux网络编程: TCP协议之SACK与D-SACK详解

TCP协议SACK与D-SACK详细分析与抓包

noevil的博客 4967

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

TCP-SCAK详解

由于本人才疏学浅,本文难免存在遗漏之处,欢迎大家留言指正,本人将感激不尽。 最近做QUIC相关的工作,QUIC中采用的是SACK的确认方式,比较好奇,TCP中SACK是如何工作的,于是网上找了一些资料,发现这篇文章讲的比较详细,供自己和读者学习。 参考 https://www.cnblogs.com/lshs/p/6038555.html 总结 在介绍之前,我先简单总结一下这篇文章给我带来的收获。...

nice_wen的博客 2145

TCP选项之SACK选项概述

标准的TCP确认机制中,如果发送方发送了0-1000序号之间的数据,接收方收到了0-100、300-1000,那么接收方只能向发送方确认101,这时发送方会重传所有101-1000之间的数据,实际上这是不必要的。为了优化这种情况,必须让发送方知道更多的接收信息,所以发展出了SACK选项,关于SACK的标准见RFC 2018。 SACK在实际使用中是比较普遍的一个选项,而且相关的内容也较多,准备用三...

九天小哥的专栏 2万+

【网络】Linux 内核优化实战 - net.ipv4.tcp_sack

是控制TCP SACK功能的核心参数,默认启用(值为1)。SACK通过让接收方明确告知发送方“已接收的非连续数据块”,避免了传统TCP的“盲目重传”,显著提升了丢包场景下的传输效率。在绝大多数情况下,保持默认启用(1)是最优选择;仅在极特殊的兼容或调试场景下,才考虑临时禁用(0)。

cuiwin的专栏 1381

Linux内核 TCP/IP、Socket参数调优

Doc1: /proc/sys/net目录   所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失),例如下面这些重要的参数: 参数(路径+文件) 描述 默认值 优化值 /proc/sys/net/core/rme

vc66vcc的博客 599

TCP的SACK选项功能

转自:http://blog.chinaunix.net/uid-13746440-id-3282565.html TCP通信时,如果发送序列中间某个数据包丢失,TCP会通过重传最后确认的包开始的后续包, 这样原先已经正确传输的包也可能重复发送,急剧降低了TCP性能。为改善这种情况,发展出 SACK(Selective Acknowledgment, 选择性确认)技术,使TCP只重新发送

nimei199的博客 1850
上一篇: LWN: 如何像kernel专家一样rebase & merge?
下一篇: LWN: Intel新增umwait指令来支持短时间的delay和event wait
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值