Linux TCP协议栈中的初始序列号生成

5
在Linux TCP/IP协议中,生成初始序列号(ISN)的过程是怎样的?我了解Linux内核2.4至2.6版本中的ISN生成过程,可以在Embedding Covert Channels into TCP/IP第7和第8页中找到。然而,在后续的内核版本中,我搜索了类似的过程,但很遗憾没有找到。由于与安全相关的明显原因,可能无法获得太多细节信息。因为我正在验证在后续的Linux内核版本中实现类似隐写术方案(如链接所述)的可能性,所以我非常需要一些信息。感谢任何帮助。
3个回答

4

谢谢。您能告诉我RFC1948中描述的ISN生成方法最新应用于哪个内核版本吗? - sjsam
@sjsam:请查看图片以查看版本。 - TOC
我搞不清楚。 你是指旧算法(RFC1948)在内核版本3.4之前使用吗? (我看到3.5的字体比其他版本都亮) 还是说直到2.6.33(箭头所指)才使用旧算法?再次感谢你的帮助。 - sjsam
2
@sjsam:我认为新算法(RFC 6528 - 2012年2月)从内核3.1开始使用。在此之前,我认为使用的是另一种算法(RFC1948)。 - TOC
在公式中给出了M是一个四微秒计时器。它到底是什么?我猜M是四个字节,在开始时初始化为零。对于第一个ISN,MD5哈希的修改后的第二个单词恰好是ISN。从第二个ISN开始,应该每4微秒增加1位的计时器应该被添加。这是一个合理的解释吗? - sjsam
如果没有引用一些相关的文本,这真的不是一个答案。 - user207421

2

更新之前的答案以反映当前状态(2019 年和 Linux 内核 5.1.3),因为生成内核中的 ISN 的算法再次更改以提高安全性。

secure_tcp_seq 现在使用 SipHash (add–rotate–xor) 函数根据初始密钥、源 IP 地址、目标 IP 地址和端口生成 ISN。我认为这个变化与哈希冲突漏洞有关,导致 hash flooding 攻击。


你能详细说明这与哈希洪泛有何关联吗?用户无法影响序列号。 - undefined

2
经过更仔细地阅读RFC6528RFC1948,我得出了这样的结论:根据RFC1948中规定的生成初始序列号(ISNs)的算法:
       ISN = M + F(LocalIP, LocalPort, RemoteIP, RemotePort, Secretkey)

“没有改变。相反,由Bellovin S.M在RFC1948中提出的算法已经被正式规定并采用标准轨迹(根据RFC2119)在RFC6528中,该文档是由Bellovin S.M和Gont. F.共同撰写的。由于现在已经过时的RFC1948不能用于任何文档,因此RFC6528已经取代了它。”
“但是,正如对我最初的问题的回答所指出的那样,在内核3.1中,MD5已经取代了half-MD4作为哈希函数。这完全可以通过RFC6528来证明,因为它确实给了更改F()即伪随机函数的灵活性。(请查看链接获取更多详细信息)。 ”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接