【问题标题】:Why does the TLS heartbeat extension allow user supplied data?为什么 TLS 心跳扩展允许用户提供数据?
【发布时间】:2014-04-11 17:18:15
【问题描述】:

心跳协议要求另一端回复发送给它的相同数据,以知道另一端是活着的。发送某个固定消息不是更简单吗?是为了防止某种攻击吗?

【问题讨论】:

    标签: ssl heartbleed-bug


    【解决方案1】:

    至少数据包的大小似乎是相关的,因为根据 RFC6520,5.1 心跳消息将与 DTLS(例如 UDP 上的 TLS)一起用于 PMTU 发现 - 在这种情况下,它需要不同大小的消息。除此之外,它可能只是在 ICMP ping 之后建模,您还可以在其中无缘无故地指定有效负载内容。

    【讨论】:

    • 但是即使对于dtls,只要消息大小足够小以容纳数据报包,就不会成为问题吧?
    • PMTU 发现的想法是,您发送不同大小的数据包,以了解在数据包被丢弃或碎片之前您可以放入多少有效负载,例如找出可以有多大仍然“小到适合”。当然,您总是可以发送只有 563 字节有效负载的数据包(576 最小保证大小,没有分段负 13 字节 DTLS 帧),但这将是一种浪费。
    【解决方案2】:

    就像使用 ICMP Ping 一样,其想法是确保您可以将收到的“pong”心跳响应与您发出的任何“ping”心跳请求相匹配。有些数据包可能会丢失或乱序到达,如果您发送请求的速度足够快并且所有响应内容都相同,则无法判断您的哪些请求得到了响应。

    有人可能会想,“谁在乎?我刚刚得到了回应;因此,另一方还活着,准备好了接受我的命令:D!”但是,如果响应实际上是针对 10 分钟前的心跳请求(极端情况,可能是由于服务器过载)呢?如果您在几秒钟前刚刚发送了另一个心跳请求,并且预期的响应对所有人都是相同的(“固定消息”),那么您将无法区分。

    及时响应对于确定连接的健康状况很重要。来自RFC6520第3页:

    ...在多次重传后没有 接收 相应的 HeartbeatResponse 消息,该消息具有 预期的负载,DTLS 连接应该被终止。

    通过允许请求者指定返回负载(并假设请求者始终生成唯一的负载),请求者可以将心跳响应与发出的特定心跳请求相匹配,因此能够计算往返时间,如果合适,使连接到期。

    这当然只有在您使用 TLS 而不是 TCP 等不可靠协议时才有意义。


    那么为什么要让请求者指定有效载荷的长度呢?不能推断吗?

    看到这个出色的答案:https://security.stackexchange.com/a/55608/44094

    ... 似乎是通用性和连贯性尝试的一部分。在 SSL/TLS 标准中,所有消息都遵循常规编码规则,使用特定的表示语言。协议的任何部分都没有从记录长度“推断”长度。

    不从外部结构推断长度的一个好处是它可以更容易地在之后包含可选扩展。例如,这是通过 ClientHello 消息完成的。

    简而言之,是的,它本来可以,但是为了与现有格式保持一致以及为了将来的校对,指定大小以便其他数据可以遵循相同的消息。

    【讨论】:

      猜你喜欢
      • 2014-09-14
      • 1970-01-01
      • 2010-11-01
      • 2017-06-15
      • 2020-11-03
      • 2011-09-22
      • 2017-02-11
      相关资源
      最近更新 更多