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

时间:2014-04-11 20:36:22

标签: stack-overflow heartbleed-bug

将Heartbleed错误称为堆栈溢出是否准确?根据我的理解,这是一个非常典型的例子。这在技术上是否正确?

3 个答案:

答案 0 :(得分:4)

heartbleed错误不是stack overflow错误,而是一种buffer overrun错误。程序用完堆栈空间时发生堆栈溢出错误。这通常会导致崩溃,并且无法直接利用。

答案 1 :(得分:3)

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

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

计算机中通常有一定量的内存专用于此运行时堆栈,甚至通常是每个程序运行的堆栈和一些用于操作系统的内存等。如果子程序调用得到如此“深度”的金额分配的堆栈空间不会保存发生调用所需的所有信息,即堆栈溢出错误。

这不是问题的核心问题。它允许一个exertnal程序设置一个返回给它的缓冲区空间量,并返回发生在内存中的任何内容,超出了这个外部程序发送的一点点数据。

所以问题的真正答案是“不”,我无法想象谁会认为这是一个典型的例子。

答案 2 :(得分:-2)

技术上,是的。但不是在传统的溢出意义上,你试图粉碎堆栈并摆弄返回值并尝试执行代码。这纯粹是一个泄密私人数据"问题

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

错误是客户端基本上发送了两位数据:

size_of_heartbeat(呈现心跳数据大小的16位整数)    heartbeat_data(最多64k的数据)

恶意客户可以 LIE 了解其发送的数据,并说:

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

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

 -- 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,并最终能够提取像服务器这样的东西。 s SSL证书,来自以前通过加密层的用户的临时数据等......