IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

TCP SYN-Cookie背后的人和事 - 续

kernelchina blogs 2012-07-27 14:22:49 累计浏览 3,860 次
本机暂存

    以前写过一篇“TCP SYN-Cookie背后的人和事”,今天讨论一下发现我的理解也没有到位。看来工程中没有看过code或者调试过,对于一个事物就无法透彻的理解。本来的理解是SynCookie不会保存Session信息,取而代之的是要保存一个32bits的Cookie。一个依据就是:如果本机没有保存任何秘密,如何验证正常的Session呢?如果不用秘密攻击者就可以制造出对应的第三个ACK,可以等待一段时间发送第三个ACK造成实际的攻击。

    现在有了更多的理解,看起来SynCookie不用本地缓存任何内容,包括不会生成的32bits的cookie。

    Wiki之中介绍了Syn Cookiehttp://en.wikipedia.org/wiki/SYN_cookies

    Sync-Cookie的使用是有前提的,仅仅适用于伪造IP地址的连接建立请求,对于基于正常的连接建立的DDos攻击不起作用。对于伪造原始IP,攻击者无法知道box产生的S2C的ISN,这个就是最基本的Secret,即使没有SynCookie的存在,第三个伪造报文也无法构造成功。剩余的需求就是SynCookie如何根据正常连接的第三个报文验证ACK报文并且构建Session了。

    Syn-Cookie feature的前提有以下几个:

  • 不会建立session
  • 不会queue SYN报文而是丢弃它
  • 不在本地保存任何Session相关信息或checksum
  •     要完成的事情是在第三个报文到来之后做以下两件事:

  • 检验是否这个ACK的前两个报文确实来过
  • 根据第三个报文重构整个Session的信息。
  •     SynCookie通过精心构造Syn-Ack中的ISN来实现上述功能:

        let t = A slowly incrementing timestamp (typically time() logically right-shifted 6 positions, which gives a 64 second resolution)

        let m = The maximum segment size (MSS) value that the server would have stored in the SYN queue entry

        let s = The result of a cryptographic secret function computed over the server IP address and port number, the client IP address and port number, and the value t. The returned value s must be a 24-bit value.

        The initial TCP sequence number, i.e. the SYN cookie, is computed as follows:

  • First 5 bits: t mod 32
  • Next 3 bits: an encoded value representing m
  • Final 24 bits: s
  •     首先,验证ACK报文是否属于先前的Session

        1.将ACK的Seq-1得到原始的ISN。验证t字段同当前的系统time比较,表明是否收到的内容超时,例如30秒才收到ACK。

        2.是否m字段和本地MSS比较有效,m值应该是一个index,本地保存8个固定的M值,否则无法回复连接的MSS字段。

        3.计算s,看看是否相等,这里的t是box产生的,也应该算是secret了。

        然后,是Session的恢复

        1.five-tuple自然可以从报文中读取

        2.Sequence Number从报文直接读取就可以了

        3.MSS的恢复

            这里面必须要有的字段是m,也就是需要重建MSS,因为头两个报文都没有缓存,因此MSS无法恢复,SynCookie这里应该使用全局仅有的8个MSS。

        4.其他TCP Options

           没办法恢复,这个在Wiki之中提到了,属于limitation。

        对于这个算法有如下思考:

        1.只有m字段这里是必须的,其他的属于锦上添花。

        2.对于s的计算使用全局的key就可以了,不用每个SYN不同。

        Syn看似和SynProxy不同实际有类似之处,SynCookie实际上伪造了S2C的Sequence Number,对于后继的traffic和Proxy一样都要对于报文的Sequence Number进行重写。

        这回看起更清楚的理解了这个功能微笑

    同分类推荐文章

    1. 绿盟科技《APT组织研究年鉴》(2026 版)正式发布 (2026-06-16 20:21:10)
    2. 【已复现】Linux内核Fragnesia权限提升漏洞(CVE-2026-46300) (2026-06-15 10:53:58)
    3. 企业文档安全最佳实践(二):给文档上“身份证”——手动标密与智能自动标密 (2026-06-12 17:18:33)

    查看更多 安全 文章 →

    建议继续学习

    1. gen_tcp发送进程被挂起起因分析及对策 (累计阅读 37,821)
    2. TCP 的那些事儿(上) (累计阅读 22,696)
    3. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,933)
    4. 自建DNS以防止GFW干扰 (累计阅读 13,125)
    5. 彻底屏蔽优酷广告 (累计阅读 12,976)
    6. 浅谈TCP优化 (累计阅读 11,082)
    7. 推荐一些socket工具,TCP、UDP调试、抓包工具 (累计阅读 10,845)
    8. SSL证书的分类(按功能) (累计阅读 10,272)
    9. 查看 Apache并发请求数及其TCP连接状态 (累计阅读 10,068)
    10. 推荐一些socket工具,TCP、UDP调试、抓包工具 (累计阅读 8,840)