代码之家  ›  专栏  ›  技术社区  ›  sjsam

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

  •  5
  • sjsam  · 技术社区  · 12 年前

    生成初始序列号(ISN)的步骤是什么 在LINUX tcp/ip协议中。我知道中生成ISN的过程 在第7和第8页中描述的LINUX内核2.4至2.6;第8页,共8页 Embedding Covert Channels into TCP/IP .我搜索过类似的 后来内核中的程序,但令我沮丧的是,我找不到任何程序。我理解,由于与安全相关的明显原因,可能无法获得许多细节。当我正在验证在稍后的Linux内核中实现类似隐写术方案(如链接中所述)的可能性时,我非常需要一些信息。感谢您的帮助。

    3 回复  |  直到 12 年前
        1
  •  4
  •   Community CDub    7 年前

    请在此处阅读我的答案: Most efficient way to manipulate ISN numbers in TCP headers

    此算法用于最新的内核TCP堆栈( 3.5 )。

    编辑 :请参阅下图以查看所有相关的内核版本 enter image description here

    编辑2 :有关函数的旧版本,请参阅内核的源代码 secure_tcp_sequence_number 以下为:

    Kernel 2.4.22

    Kernel 2.6.30

    Kernel 2.6.39

    Kernel 3.0

    Kernel 3.1 :(MD5已取代一半MD4)

        2
  •  2
  •   sjsam    12 年前

    经过更仔细的阅读 RFC6528 RFC1948 我得出的结论是,RFC1948中规定的生成初始序列号(ISN)的算法:

           ISN = M + F(LocalIP, LocalPort, RemoteIP, RemotePort, Secretkey)
    

    没有改变。相反,Bellovin S.M在RFC1948中提出的算法被正式指定并纳入标准轨道(根据 RFC2119 )在Bellovin S.M和Gont。F.由于现在已经过时的RFC1948不能在任何文件中使用,RFC6528已经取代了它。

    但正如在回答我最初的问题时所指出的,MD5已经取代了half-MD4作为内核3.1中的哈希函数。RFC6528完全证明了这一点,因为它确实提供了更改伪随机函数F()的灵活性。 (请查看链接以了解更多详细信息)。

        3
  •  2
  •   Oleksandr Karaberov    5 年前

    更新到以前的答案,以便表示当前状态(2019和Linux内核5.1.3),因为算法要生成 ISN 内核中的s被再次更改以更加安全。

    secure_tcp_seq 现在使用 SipHash (addrotatexor)函数用于根据初始密钥、源和目标IP地址和端口生成ISN。我认为此更改与导致 hash flooding 攻击。