对 tcp out-of-window 的安全建议

TCP 收到一个 out of window 报文后会立即回复一个 ack,这是 RFC793 中 SEGMENT ARRIVES 段的要求。但这是为什么?难道不是默默丢弃才对吗?

对 oow 报文回复 ack,岂不是把正确的 ack 号回过去了吗,这样攻击者盲打一番就能拿到正确的 seq(至少 in-order) 实施数据劫持篡改。所以为 oow 报文回复 ack 目的是什么?

别扯 Keepalive,原始 TCP 规范没有 Keepalive。Keepalive 本身非标,它或许歪打正着利用了 TCP 的该原始漏洞:为 oow 报文回复 ack。

如果一开始 TCP 规范根本不对 oow 报文回复 ack,Keepalive 就必须想别的办法了,再也无法以 seq = max_seq - 1 作为序列号了。

无论如何,安全考虑,不与陌生人说话。

说完针对 receiver 的恶意 oow 报文,再看针对 sender 的恶意 in-window 报文。如果 sender 收到一个恶意 in-window 报文,该报文 ack > snd.una 会怎样?sender 会清理掉 ack - snd.una 之间的数据,如果这部分数据有丢失,丢失的数据将永远无法被重传。

如果 sender 只是单向发送,从不接收数据,通告一个 zero window 是高尚的。又或者 sender 只是接收少量数据,不 care 吞吐,就别通告太大的窗口。家里阳台越大,被烟花误窜的概率越大。

下面详细解释该 case。

oow(out-of-window) 不更新 receiver 的 una,这保护了 receiver 的 send queue 不会被 blind attacker 轻易篡改推进,而我们知道,una 被篡改推进会导致丢失的数据永远不会被重传。

但反过来呢?in window 但 out-of-order 岂不是可以随意更新 una?是的。但这会带来下面的问题:
在这里插入图片描述
不想同时作为 receiver 的 sender 如果打开一个过大的 rwin,就更容易被 blind attacker 构造的 in window 报文篡改推进 una,造成丢失的数据无法被重传,最终 receiver 的 hole 永远不会被填充,耗尽 rwin,跌入 zero window 万劫不复,一条连接就这样被打死。

如果不想接收数据,一定注意将 rwin 缩小甚至关闭。

TCP 是全双工连接,但 ack 方向可统一在反向 data 报头被捎带,两个方向之间的影响不容忽视。

无论如何,安全考虑,别把大门敞太大。

总之,对于 receiver,抵制随意的 out-of-window 报文,保护 rcv queue 数据,对于 sender,抵制随意的 in-window 报文,保护 rtx queue 数据。

再提一下 Keepalive,如果 TCP 可扩展,Keepalive 何必使用这种 max_seq - 1 如此怪异的 oow 报文来探测,单独一个 probe request flag 更自然,receiver 只需立即回复携带 probe response flag 但不设置 A flag 的 ack 报文。

标准并不一定一开始就正确,但标准在无伤大雅的情况下很难发生变化。

此类安全问题到底应不应该由 TCP 负责?在我看来数据篡改问题不是 TCP 的职责,应用程序发觉后直接报错断开即可,但 una 被篡改造成丢包不能重传就是 TCP 的问题了,它足以形成一种新的 DDoS,并且对于应用程序,在发现这种情况之前,浪费了很多时间。

此外,状态防火墙要是丢掉 oow,Keepalive 就用不了。Linux nf_conntrack 采用另一种宽松的方式判定 tcp_in_window 足以支持 Keepalive,挺好。

周中帮忙看了一个关于 Keepalive 的问题,其实我是一直觉得 Keepalive 本就是恰巧擦边生效的机制,若不是对 oow 报文回复一个不合理的 ack,Keepalive 根本就不会得到回应。而从 Linux 4.x 开始,对于 oow 报文的 ack 就是可回可不回的,取决于 oow 报文到达的 rate,这意味着对标准理解的松动,在我看来,与其不 care,不如 MUST NOT,不要对 oow 报文进行任何响应,连计数器都不更新!这篇短文给出相关的安全建议。

浙江温州皮鞋湿,下雨进水不会胖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4848.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt在Ubuntu下如何进行桌面软件开发?

文章目录 0.引言1.新建项目2.编写第一个程序3.在Qt外部启动程序 0.引言 笔者研究的方向涉及在ubuntu中运行代码,早先是直接利用控制台运行代码文件,在控制台中虽然设法将代码精简到一个三个文件中,只需要在控制台运行这三个文件即可&#xff…

MySQL数据库增删改查及聚合查询SQL语句学习汇总

目录 数据库增删改查SQL语句 MySQL数据库指令 1.查询数据库 2.创建数据库 3.删除数据库 4.选择数据库 创建表table 查看所有表 创建表 查看指定表的结构 删除表 数据库命令进行注释 增删改查(CRUD)详细说明 增加 SQL库提供了关于时间的…

搞芯片怎么能不懂perl?

各位ICer在工作的过程中,无论是前端还是后端,都会使用各种常见的脚本语言,比如:shell,python,perl,tcl等等用于文件的处理,case测试,工具环境的调用和搭建,虽…

【压缩空气储能】非补燃压缩空气储能系统集成的零碳排放综合能源优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

MySQL环境搭建(Windows电脑)

MySQL环境搭建-Windows电脑篇 软件获取: 搜索gzh【李桥桉】,需要win电脑安装包,回复【win-MS】。 搜索gzh【李桥桉】,需要mac电脑安装包,回复【mac-MS】。 注意:确保电脑为64位系统(不是的话需要…

SpringSecurity(五):前后端分离认证总结案例。

前后端分离认证总结案例 前言难点分析Controller层eneity层RoleUser dao层service层config层LoginFilterSecurityConfig resourcesmapper propertiespom.xml结尾 前言 和上一篇一样,从上倒下复制粘贴,所有代码贴完再运行,代码没有问题&#…

Qt QLineEdit篇

QLineEdit篇 【1】QLineEdit简介【2】QLineEdit常用方法【3】QLineEdit使用举例UI设计界面效果头文件源文件 PC饱和了,跟我学Qt比较实在,哈哈哈 【1】QLineEdit简介 QLineEdit是Qt框架中的一个类,用于创建一个文本输入框,允许用…

Google 将为高端 Chromebook 推出独立品牌

说起 Chromebook,一般大家的第一印象就是价格便宜、配置不高、做工普通,所选的材料也都是以塑料为主,产品主打的市场也是学生和教育群体。在不少人看来,Chromebook 就是一个配备了功能齐全的浏览器,外加一定的文件管理…

react antd 样式修改

最近在做一个大数据的大屏ui更改,使用的是antd,需要根据ui稿调很多的antd组件样式 特做一个样式修改记录,也给需要的人一些帮助 我们修改的有以下样式: 如何改呢: /*修改 antd 组件样式 */// 仅 drop 下的下拉框改变样…

苹果手机ios设备管理软件iMazing 2.17.6官方版下载及常见问题解决

苹果手机ios设备管理软件iMazing 2.17.6官方版下载(ios设备管理软件)是一款管理苹果设备的软件, Windows / macos 系统上的一款帮助用户管理 IOS 手机的应用程序,软件功能非常强大,界面简洁明晰、操作方便快捷,设计得非常人性化。…

命令模式(Command)

别名 动作(Action)事务(Transaction) 定义 命令是一种行为设计模式,它可将请求转换为一个包含与请求相关的所有信息的独立对象。该转换让你能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中&#xff0c…

【PCB专题】Allegro如何设置电源电压属性,将飞线隐藏?

在PCB设计过程中,布局完成之后的布线的顺序一般是先走信号线,然后进行电源的处理、分割。因为电源往往在整个板子上是都有的,所以电源的飞线是非常多,在布线时特别影响其他信号线的布线,界面看着比较杂乱。 如下所示GND和1.8V都存在各种飞线,比较杂乱。 Allegro中有设置…