免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Au_Hank

[网络子系统] 我写的高性能,简化的SYNCOOKIE实现 [复制链接]

论坛徽章:
0
发表于 2007-09-15 08:17 |显示全部楼层
原帖由 Au_Hank 于 2007-9-15 06:24 发表


你说的对,我最担心的就是这个问题.希望有数学高手来分析一下这个算法是否很容易破解

这个算法很简单,所以非常高效. 主要是去猜测1024字节的密码应该非常困难吧?

因为你的函数是可逆的,所以根本不用猜,而是直接得出那个密码。或者只需要很少量的计算(也许小于1s)即可得出你那个1024位的密码。

[ 本帖最后由 csfrank 于 2007-9-15 08:18 编辑 ]

论坛徽章:
0
发表于 2007-09-15 09:31 |显示全部楼层
原帖由 csfrank 于 2007-9-15 08:17 发表

因为你的函数是可逆的,所以根本不用猜,而是直接得出那个密码。或者只需要很少量的计算(也许小于1s)即可得出你那个1024位的密码。


这里面不仅仅是算法可逆反的因素,还有一个因素是数组的值,这个值不是算出来的,是随机生成的,只能靠猜测...

论坛徽章:
0
发表于 2007-09-15 09:48 |显示全部楼层
new-isn=old-isn ^ secret[n]

在得知new-isn的情况下, 有 2**32 个 old-isn 和 secret[n]的组合...

这里做了15次 XOR, 穷举的话,就是要做 (2**32) **15次猜测, 不知道这是什么样的天文数字

[ 本帖最后由 Au_Hank 于 2007-9-15 09:50 编辑 ]

论坛徽章:
0
发表于 2007-09-15 10:08 |显示全部楼层
原帖由 Au_Hank 于 2007-9-15 09:31 发表


这里面不仅仅是算法可逆反的因素,还有一个因素是数组的值,这个值不是算出来的,是随机生成的,只能靠猜测...


你好像没明白我的意思,详细说来是这样的:

你的new_secure_tcp_syn_cookie函数用数学语言表示相当于:
isn=new_secure_tcp_syn_cookie(new_syncookie_secret,saddr, daddr, sport, dport, sseq)

因为saddr,daddr,sport,dport,sseq对于客户端和服务器端都是已知的,也就是说相当于常量,所以上述函数可以简化为:
isn=f(new_syncookie_secret)

正是因为可逆,所以该函数对应的反函数很容易求得,这里用 f' 表示,也就是:
new_syncookie_secret=f'(isn)
或罗嗦一些是
new_syncookie_secret=new_secure_tcp_syn_cookie'(isn,saddr, daddr, sport, dport, sseq)

现在客户端发送一个不伪造ip的包并得到了你的应答(含有isn),这样就相当于由客户端提供saddr, daddr, sport, dport, sseq参数、服务器提供new_syncookie_secret参数,带入new_secure_tcp_syn_cookie函数进行计算,并得到了结果isn

这样客户端将它得到的 saddr, daddr, sport, dport, sseq 和 isn 带入
new_secure_tcp_syn_cookie'(isn,saddr, daddr, sport, dport, sseq)
即可计算出new_syncookie_secret

不知道我说的是否足够清楚了?
所以关键是你的new_secure_tcp_syn_cookie函数一定不能可逆。

论坛徽章:
0
发表于 2007-09-15 10:12 |显示全部楼层
原帖由 Au_Hank 于 2007-9-15 09:48 发表
new-isn=old-isn ^ secret[n]

在得知new-isn的情况下, 有 2**32 个 old-isn 和 secret[n]的组合...

这里做了15次 XOR, 穷举的话,就是要做 (2**32) **15次猜测, 不知道这是什么样的天文数字

你误解我的意思了,我计算new_syncookie_secret不是通过多个不同的isn值进行比较/猜测/穷举,而是只通过一个你响应的isn进行反算。

论坛徽章:
0
发表于 2007-09-15 10:24 |显示全部楼层
其实你可以尝试着看看将
saddr=0.0.0.0
daddr=0.0.0.0
sport=0
dport=0
sseq=0
带入你的函数,也就是相当于将他们变成常量
看看它变成了什么样子,是不是可以写出反函数?

论坛徽章:
0
发表于 2007-09-15 10:42 |显示全部楼层
原帖由 csfrank 于 2007-9-15 10:24 发表
其实你可以尝试着看看将
saddr=0.0.0.0
daddr=0.0.0.0
sport=0
dport=0
sseq=0
带入你的函数,也就是相当于将他们变成常量
看看它变成了什么样子,是不是可以写出反函数?


是不可能很简单地通过一个公式反解出来的, 不信您可以尝试一下. 主要是因为经过了16轮的随机数的xor和伴随的随机选择数组元素..

论坛徽章:
0
发表于 2007-09-15 11:08 |显示全部楼层
因为这些客户端特性都给定了,所以就不随机了
在这种情况下真正随机的就只有sec[0]和sec[0^sec[0]]了
先简化一下:

static __u32 cookie(__u8* sec)
{
    __u32 isn=sec[0];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    isn=isn ^ sec[0 ^ sec[0]];
    return isn;
}

不知道这个对不对?先回家吃饭,下午再动动脑筋 你也帮着一起动动脑筋
好久不动脑筋了

[ 本帖最后由 csfrank 于 2007-9-15 11:15 编辑 ]

论坛徽章:
0
发表于 2007-09-15 12:32 |显示全部楼层
还有,我忽然想到另外一个问题:你是如何判定客户端的ack包是不是合法的?
如果new_syncookie_secret每几分钟就变化一次,那么在变化之前响应的syn+ack包,在变化之后收到客户端的ack应答,会不会有问题?

PS:已经看到你的第二贴了
2: 密码更新前没有收到ack的合法连接被丢弃

[ 本帖最后由 csfrank 于 2007-9-15 12:35 编辑 ]

论坛徽章:
0
发表于 2007-09-15 12:46 |显示全部楼层
原帖由 csfrank 于 2007-9-15 12:32 发表
还有,我忽然想到另外一个问题:你是如何判定客户端的ack包是不是合法的?
如果new_syncookie_secret每几分钟就变化一次,那么在变化之前响应的syn+ack包,在变化之后收到客户端的ack应答,会不会有问题?

...


我在6楼有说明其原理...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP