欢迎来到天天文库
浏览记录
ID:22376488
大小:61.50 KB
页数:9页
时间:2018-10-28
《syncookie在linux内核中的实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、SYNCookie在Linux内核中的实现~教育资源库 概述 在目前以IPv4为支撑的网络协议上搭建的网络环境中,SYNFlood是一种非常危险而常见的DoS攻击方式。到目前为止,能够有效防范SYNFlood攻击的手段并不多,而SYNCookie就是其中最著名的一种。SYNCookie原理由D.J.Bernstain和EricSchenk发明。在很多操作系统上都有各种各样的实现。其中包括Linux。本文就分别介绍一下SYNFlood攻击和SYNCookie的原理,更重要的是介绍Linux内核中实现SYNCookie的方式。最后,本文
2、给出一种增强目前Linux中SYNCookie功能的想法。 一、SYNFlood攻击 SYNFlood攻击是一种典型的拒绝服务型(DenialofService)攻击。所谓拒绝服务型攻击就是通过进行攻击,使受害主机或网络不能够良好的提供服务,从而间接达到攻击的目的。 SYNFlood攻击利用的是IPv4中TCP协议的三次握手(Three-ASK(((__u32)1<<COOKIEBITS)-1) COOKIEBITS表示cookie的比特长度;COOKIEMASK是一个COOKIEBITS长的比特串,所有比特都是1。
3、 还有两个比特串,被定义成一个__u32的二维数组 static__u32 syncookie_secret[2][16-3+HASH_BUFFER_SIZE]; 其中所有的比特值在secure_tcp_syn_cookie中被随机的赋予,用get_random_bytes函数。它们成为制作cookie的密钥。这两个被随机产生的比特串是整个SYNCookie实现方案的关键。另外还有一个开关syncookie_init控制对这两个密钥的改动。 还需要指出,在文件syncookies.c中定义有一个__u16组成的表static__
4、u16constmsstab[],这个表中保存的是一些可能的MSS(MaximumSegmentSize)值。 secure_tcp_syn_cookie函数的返回值就是计算得到的ISN值,即cookie。为了描述方便,我们给出如下定义:tmp1:=saddr+daddr+((sport<<16)+dport)+syncookie_secret[0]123下一页友情提醒:,特别!tmp2:=saddr+daddr+((sport<<16)+dport)+syncookie_secret[1]tmp11:=HAS
5、H_TRANSFORM(tmp1[16],tmp1)tmp22:=HASH_TRANSFORM(tmp2[16],tmp2)A:=tmp11[0][17]B:=tmp22[1][17]sseq:=ntohl(skb->h.th->seq)这里的skb是携带TCPSYN的那个skbcount1:=jiffies/(HZ*60)当前时间的分钟值data1:=msstab 从前往后最后一个小于skb中携带的MSS值的值的索引(值得注意的是两个密钥在第一次被初始化后,就不会再有改动,直到系统重新启动。因此可以认为它是一个常值。)
6、 有了上面的定义我们可以得到cookie等于 isn:=A+sseq+(count1<<COOKIEBITS)+(B+data1)COOKIEMASK 这个isn被赋予返回的TCPSYN+ACK包中,作为其中的ISN值。这就是cookie的产生过程。在这个过程中,没有在本地为这个连接请求分配任何存储空间。 在TCP服务器收到TCPACK包时,相应的要进行SYNCookie的检查。这个检查过程在函数tcp_v4_hnd_req中的cookie_v4_check函数开始。cookie_v4_check调用cookie_ch
7、eck函数,cookie_check函数调用check_tcp_syn_cookie函数。 check_tcp_syn_cookie函数在random.c中定义,是与前面介绍的 secure_tcp_syn_cookie函数对应的函数,检查从TCPACK中提取出的ISN值。 在check_tcp_syn_cookie中假定ISN的值如下 isn:=A+sseq+(count2<<COOKIEBITS)+(B+data2)COOKIEMASK 这里的A、B都是根据当前这个skb中的地址信息和syncookie_sec
8、ret算出来的;sseq是根据这个skb中的seq值算出的。 有了上面这些值,TCP服务器就可以反算出count2和data2。理论上来说,只要这个isn是原来那个isn,应该有 count2==cou
此文档下载收益归作者所有