为什么TLS心跳扩展允许用户提供数据?

时间:2014-04-11 17:18:15

标签: ssl heartbleed-bug

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

就像ICMP Ping一样,我们的想法是确保您可以将收到的“pong”心跳响应与您所做的“ping”心跳请求相匹配。有些数据包可能会丢失或无法到达,如果您发送请求的速度足够快且所有响应内容都相同,则无法确定哪些请求得到了解答。

有人可能会想,“谁关注?我刚收到回复;因此,另一方活得很好,准备好做我的竞标:D!”但是,如果响应实际上是10分钟前的心跳请求怎么办(极端情况,可能是由于服务器超载)?如果您几秒钟之前刚刚发送了另一个心跳请求,并且预期的响应对所有人都是相同的(“固定消息”),那么您将无法区分它们。

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

  

...经过多次重传后没有   收到相应的 HeartbeatResponse消息   预期的有效载荷,DTLS连接应该终止。

通过允许请求者指定返回有效负载(并假设请求者始终生成唯一的有效负载),请求者可以将心跳响应与特定的心跳请求进行匹配,从而能够计算往返时间,如果适当,使连接失效。

当然,如果您使用TLS而非UDP而不是TCP等非可靠协议,这当然才有意义。


那么为什么允许请求者指定有效负载的长度?难道不能推断出来吗?

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

  

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

     

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

简而言之,,它可能已经存在,但为了与现有格式保持一致并进行将来的校对,会指定大小以便其他数据可以遵循相同的消息。< / p>