将Heartbleed错误称为堆栈溢出是否准确



将Heartbleed错误称为堆栈溢出是否准确?在我看来,这是一个很典型的例子。这在技术上正确吗?

检测信号错误不是堆栈溢出错误,而是一种缓冲区溢出错误。当程序的堆栈空间不足时,会发生堆栈溢出错误。这通常会导致崩溃,并且不可直接利用。

堆栈是以"后进先出"为主要特征的数据结构。它允许调用者(程序的一部分)将信息"推送"到堆栈上,并"弹出"推送的最后一项。对于严格的堆栈,不允许执行其他操作。

当程序调用子程序时,堆栈用于程序(函数、方法、子例程都是子程序,它们在不同的上下文中有不同的名称)。当程序调用子程序时,需要保存一组信息,以便在子程序返回时可用。因此,这个"执行上下文"被推送到堆栈上,然后在返回时检索。这种操作对计算机至关重要,以至于计算机硬件直接支持它;换句话说,有机器指令可以做到这一点,这样就不必在软件中完成(速度较慢)。

计算机中通常有一定数量的内存专门用于此运行时堆栈,甚至通常用于运行的每个程序的一个堆栈和操作系统的一些堆栈,等等。如果子例程调用变得如此"深入",以至于分配的堆栈空间量无法容纳发生调用所需的所有信息,这就是stackerflow错误。

这不是心碎的问题。它允许外部程序设置要返回给它的缓冲区空间,并返回内存中除了该外部程序发送的一点点数据之外的任何数据。

因此,这个问题的真正答案是"不",我无法想象谁会想到这是一个典型的例子。

从技术上讲,是的。但不是在传统的溢出意义上,你试图打破堆栈,篡改返回值,并试图执行代码。这纯粹是一个"泄露私人数据"的问题。

OpenSSL规范要求客户端在其心跳数据包中发送一块随机数据。服务器需要将数据完全按原样传递给客户端。

错误在于客户端基本上发送两位数据:

size_of_theartbeat(表示心跳数据大小的16位整数)heartbeat_data(最多64k数据)

恶意客户端可以LIE关于其发送的数据,并说:

size_of_hearbeat = 64k
heartbeat_data = ''   (1 byte)

OpenSSL无法验证size_of_hearbeat==actual_size(heartbeat_data),并且会信任size_of_cheartbeat,所以基本上你会有:

 -- allocate as much memory as the client claims they sent to you
 -- copy the user's heartbeat packet into the response packet.

由于用户声称他们向您发送了64k,OpenSSL正确地分配了64k缓冲区,但随后执行了无限制的memcpy(),并很乐意将多达64k的ram复制到客户端心跳数据实际发生的位置。

如果有足够的尝试,您可以建立一个相当完整的服务器内存图片,一次64k,并最终能够提取服务器的SSL证书、通过加密层的以前用户的临时数据等。

最新更新