TCP的FIN/RST Cookie51CTO博客 - 千亿集团

TCP的FIN/RST Cookie51CTO博客

2019年03月04日10时10分53秒 | 作者: 小名 | 标签: 一个,衔接,能够 | 浏览: 1893

写在前面TCP在网络年代的古代被规划出来,在中世纪被许多铺开,那是一个绅士的年代,几乎不存在网络安全问题。TCP的许多问题都是年代的遗毒。现在年代变了,TCP/IP技能也不再由绅士们独占,任何小朋友都能够运用现代技能在古代的城堡上轰出一个口儿,和保护文物不同,现在TCP仍然在运用中,因而咱们需求做的不是靠方针去保护,而是加固TCP!可是我并不对这种加固报有达观的情绪,唐吉坷德穿的铠甲归于重甲,挡得住矛却挡不住火枪,实在需求的是进化,协议的进化。
      在平常的作业和周末的探究中,我也一向在想怎样能让TCP更强健,即不是那么简略被干掉,说白了就是能够辨认一个FIN或许RST包的发送是假造的***行为仍是衔接中的正常行为。学习SSL协议以及TCP自身的SYN cookie机制,我想象并开始完结了一个FIN/RST cookie,和以往的一向的思路相同,过后我要看看是不是现已有了更好的完结,发现了IETF现已处理了这个问题,叫做TCP Authentication option(RFC 5925),其整体思路和我的主意差不多,只是完结思路不同,以下是我和规范不同的当地:
1.我将一个TCP衔接分为了操控通道和数据通道,而且只在操控通道上作Authentication,这样能够大大提高功率;
2.我将Auth机制依照安全性需求的凹凸分了层次;
3.我在TCP状况机内部又完结了一个Auth DH状况机;
4.我由于太懒没有完结用户接口。
我的完结和RFC 5925相同的当地在于,它革除了许多既有的***作用,价值就是降低了功率!比方那些由于FIN/RST包而引进的技能全部都能够免去了,比方time-wait之类的。
一点谈论Fin Cookie?RST Cookie?承认没有拼写错误?是的,就是这两个cookie!假如我不小心把SYN cookie写成了FIN cookie,那么在更正的时分怎样也不至于改为RST cookie吧!说说什么是FIN/RST cookie吧,它其实是我个人的一些主意,并不是什么规范化的东西,假如RFC上能找到这个主张,我也不用写这篇文章了,这个cookie是仿制SYN cookie做的,为TCP的断开供给一种认证机制,即不能像平常那样简略地假造一个窗口内的FIN或许RST就能够断开一个健康的TCP衔接,以及更可贵的,旧的FIN把新的衔接断开等。我以为TCP的这个脆弱性本来不是它自身所形成的,而是TCP/IP网络的规划准则形成的,武功再高也怕菜刀,再健康的人也抵不住暴力。正确的做法应该是为TCP营建一个杰出的治安环境,而这正是网络安全的领域。可是假造的FIN/RST 看起来或许实在地,它就是归于一个它即将end掉的健康的TCP衔接的,这就不是网络安全的领域了,正所谓清官难断家务事啊!因而,正是TCP自身的机制形成了假造如此简略,事实上应该说,TCP自身就不是健康的,或许说不是强健的。一个健康的TCP衔接,听起来更像是一个没有并发症的癌症病人相同。
原因TCP的操控流缺少认证机制,只是靠4-tuple将TCP数据包相关到一个衔接,然后靠序列号和窗口机制判别是否接纳并处理。TCP对待操控流和数据流的方法是共同的。TCP重要的操控流包含初始化衔接的3次握手和断开衔接的4次挥手。这种缺少认证的带内操控通道导致一个TCP衔接特别简略被绑架,绑架者只需满意几个很简略满意的要求即可,包含序列号落在窗口内,4-tuple契合等,而跟着网络越来越好,速度越来越快,TCP的窗口会越来越大,导致完结TCP绑架会越来越简略。
数据通道和操控通道由于TCP完结的是带内操控,就是说数据和操控都是附着在一个衔接的,因而区别数据通道和操控通道的含义不是很大,可是依照网络通信的常规-严厉区别操控平面/数据平面/办理平面,仍是把带有特别TCP标志的TCP数据包看作是操控平面的包,而只要数据和ACK的看作是数据平面的包。
      能够想见,数据通道的包咱们不用理睬,自有上层协议确保其安全性,咱们关怀的是操控通道的包。或许你会问,假如TCP衔接只是数据通道被绑架,即***者没有绑架任何带有标志位的数据包,只是在一边等着,然后瞄准窗口中的某个方位,发送捣乱的数据,这样岂不是实在的端主机就无法发送数据了吗?的确是,可是这不是TCP层面的问题,用户socket发现数据迟迟发不到对端能够自行断开衔接,接下来,它能够测验躲到IP地道里边...数据通道的安全性总是能够经过上层协议或许动作来确保,比方能够运用SSL衔接或许运用***地道等。可是操控通道自身却不能这么做,由于许多的操控数据流是不会展示在上层的。
    以RST为例,当TCP栈处理了RST之后,衔接就拆除了,留给上层的只是一个错误码,关于FIN来讲也是这样,即便是运用SSL,这些数据包也会使SSL衔接断开,总的原因有二:榜首,用户的使用直接和传输层接口,没有自己的会话坚持机制;第二,即便是socket和会话层接口,其VFS文件操作方法也不足以操控网络这种很难映射到文件的IO类型。
引进一个cookie一个cookie就像一个柔软的垫片,任何***都有必要打破这个垫片,而这个垫片的破损就指示了***现已发作这件令人遗憾的事,需求做的就是铺好这个垫片,然后在要害操作前查看这个垫片是否被损坏,该技能现在现已用于避免栈溢出,避免半衔接Dos***,SSL握手协议的Finished音讯,关于这些技能就不再多说了。相似的,TCP在处理FIN/RST的时分也能够引进相似的机制,即只要确保这个cookie没有被损坏才持续处理,不然就以为是第三方假造的***包,需求留意的是,该cookie机制的引进并没有对TCP规范协议头进行任何更改,只是添加了一个选项以及在更严厉的景象下,添加了一个处于TCP规范状况机转化之上的内部DH状况机。
等级一:不安全的cookie虽说是不安全的cookie,可是也是能够供给安全保护,最不安满是相对最安全来讲的。该cookie是一个摘要值,核算方法如下:
value=摘要算法(client-ISN, server-ISN, 伪IP头校验和, FIN/RST包的SEQ, FIN包的ACK)
其间,除了终究的两个字段,其它的字段在3次握手之后就保存在TCP衔接的协议操控结构体中了,两头的值无疑是共同的,在保存了这些值之后,为该TCP衔接的协议操控结构设置一个标志,标明有必要认证FIN和RST。在发送FIN的时分,将上述的value保存在option中,传给对端,对端接纳后,从本衔接的协议操控结构体中取出前三个字段,从该packet中取出后两个字段,依照相同的算法核算value2,比较value和value2,若不同,则不触发FIN/RST序列,若相同,进入规范处理流程。
      说一下关于RST的处理,本cookie机制只是针对处在ESTABLISHED状况的TCP衔接,假如3次握手还没有完结,则对RST包进行正常处理。这就需求在两头一同引进一个timeout机制,在一端的ESTABLISHED状况的TCP衔接进程crash掉之后,,在该timeout时限没有过期时,保存TCP的的两个方向的ISN以及伪IP头的校验和等字段,超时后,进入规范的RST处理形式,重要的是,应该在每收到一个ACK时,重置该定时器,阐明对端还活着,最少在RTT时刻前还活着。当然,这个超时机制是能够优化的。
      说它不安全意思是说,假如嗅探者嗅探到了3次握手的进程,那么***照样能够进行。别的,针对摘要算法的伪IP头参数,也有争议,由于它会影响NAT设备的完结,因而这个字段不要也罢,毕竟能猜出两个ISN的几率很小。
等级二:安全的cookie假如说等级一的cookie是添加了***的难度的话,那么等级二的cookie就彻底确保了安全,由于它是依托自身加密机制确保的。固然,需求洽谈一个密钥,还需求清晰该密钥用来加密什么东西,剩余的问题就是完结问题了。假如说被***者嗅探到ISN是一件很可怕的事的话,那么引进一个字段,该字段历来不再网络上明文传输,然后根据该字段做摘要,那不就处理问题了?PPP的CHAP就是根据这种思维规划的。意图很清晰,其间一个比较简略的完结仍是认证一个value:
value=摘要算法(对端的random, 本端的random, 其它任何你想引进的...)
现在的问题是两个random怎样从本端传给对端呢?答案当然是加密传输,密钥是什么?可选计划当然是主动洽谈,用DH?能够!那么DH洽谈进程怎样和TCP兼容?答案就是将其藏在TCP的option中,和TCP的SYN握手一同建议的,还能够有一个DH进程,或许杂乱的其它密钥洽谈进程,这些进程也能够不好SYN一同建议,乃至能够在任何时分从头建议,TCP规范的3次握手完结之后,上述的额定的洽谈能够持续,它不会对TCP规范的状况机转化进程有任何影响,只是额定叠加了一个状况机在option里边。事实上,以DH为例,彻底能够在SYN和SYN/ACK中2次握手完结。
关于RFC 5925我的完结当然没有RFC 5925那么齐备。要知道规划一个协议或许只是一个协议元素是一件很难的作业,你要考虑到的作业不知一面。一般人们喜爱固化一些东西以革除主动化带来的困惑,可是这是不契合Internet规划准则的,固化的东西其适应性对错常有限的,充其量在你自己的环境中功能杰出,能够不是一个普遍化的东西。我这儿完结的这个FIN/RST cookie就是固化的东西。
关于TCP/IP与进化传统TCP/IP-肉身必定是沉重的
神相同的存在必定期望脱节沉重的肉身!可是恰恰是这个沉重的肉身却是一切的根底。崇尚SDN的一同也模糊感觉到网络的君主年代现已快要降临,SDN就像路易十四那样将世人戏弄于股掌。君主年代的独裁阻止着进化的发作,进化是逐渐的修补,是带着沉重肉身的苦楚踉跄。
      操控平面有必要和数据平面呆在一同,以人体为例,咱们的内脏占有了许多的空间,其作业消耗着许多的能量,这个肉身是沉重的,可是就算是最巨大的人也不能奢求一个仅有的大脑存在,假如说思维是精化,那么一切的内脏,包含大脑自身都是沉重的,都是担负,咱们要吃饭,要睡觉,要做太多的保护作业,全部都是为了所谓的思维,可是将内脏,大脑独立于思维之外,相似SDN那样却是万万不能的。
      可是,操控平面和数据平面的一体化的确约束了单个个别的规划,导致有必要铺开来许多个别,经过协作的方法扩展规划。以摩天大楼为例,实在的摩天大楼是不可能存在的,由于电梯会占有许多的空间。楼越高,电梯空间越大,由于每添加一层的高度,底层就要扩展必定的电梯空间,终究的摩天大楼会变成金字塔型的,低下无限大,顶上无限高。或许自然界的高山最能阐明问题,群山总是能带来美感,瘦而不豺,高而不愣。


版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章