【问题标题】:Initial Sequence Number generation in Linux TCP stackLinux TCP 堆栈中的初始序列号生成
【发布时间】:2019-05-21 20:31:45
【问题描述】:

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

【问题讨论】:

    标签: linux tcp linux-kernel


    【解决方案1】:

    在这里阅读我的答案: Most efficient way to manipulate ISN numbers in TCP headers

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

    编辑:查看下图查看所有相关内核版本

    EDIT2 : 查看内核源代码以获取旧版本的函数secure_tcp_sequence_number:

    Kernel 2.4.22

    Kernel 2.6.30

    Kernel 2.6.39

    Kernel 3.0

    Kernel 3.1 : (MD5 已经替换了半个 MD4)

    【讨论】:

    • 谢谢。你能告诉我哪个是最新的内核,其中实现了 RFC1948 中描述的 ISN 生成方法吗?
    • @sjsam : 请查看图片以查看版本。
    • 我想不通。您的意思是在 3.4 之前的内核中使用旧算法(RFC1948)吗? (我可以看到 3.5 比所有其他版本都写得更亮)还是直到 2.6.33(如箭头所示)才使用旧版本?再次感谢您的帮助..
    • @sjsam :我认为新算法(RFC 6528 - 2012 年 2 月)是从内核 3.1 开始使用的。在此之前,我认为使用了其他算法(RFC1948)。
    • 在公式中,M 是一个四微秒的计时器。它到底是什么?我猜,M 是在开始时初始化为零的四个字节。对于第一个 ISN,修改后的 MD5 散列的第二个字正是 ISN。从第二个 ISN 开始,应该添加每 4 微秒增加 1 位的计时器。这是一个合理的解释吗?
    【解决方案2】:

    在仔细阅读RFC6528RFC1948 之后,我得出的结论是,用于生成初始序列号(ISN)的算法在 RFC1948 中指定:

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

    没有改变。取而代之的是,Bellovin S.M 在 RFC1948 中提出的算法在 RFC6528 中被正式指定并纳入标准轨道(按照RFC2119),由 Bellovin S.M 和 Gont 共同编写。 F.. 由于现在已经过时的 RFC1948 不能在任何文档中使用,RFC6528 已经取代了它。

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

    【讨论】:

      【解决方案3】:

      更新到以前的答案以表示当前状态(2019 年和 Linux 内核 5.1.3),因为在内核中生成 ISNs 的算法再次更改为更安全。

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

      【讨论】:

        猜你喜欢
        • 2017-08-21
        • 2014-05-20
        • 2015-10-16
        • 2020-06-20
        • 2010-12-20
        • 1970-01-01
        • 1970-01-01
        • 2012-12-22
        • 1970-01-01
        相关资源
        最近更新 更多