我知道基本的Heartbleed漏洞,这是后果和原因。 不过,我最近读到Heartbleed可能会导致服务器崩溃。 我想知道这个说法是否属实,如果是这样的话,为什么这样呢?
据我了解,Heartbleed只是发回客户请求的长度,并错过了检查这个长度是否真的如此。 所以我不明白如何通过读取数据来崩溃服务器?
这个问题的答案涉及到分页工作的一些背景。 在现代操作系统中,应用程序不访问物理内存地址,而是访问虚拟内存地址。 虚拟和物理内存之间的映射发生在称为页面的块中。 页面大小取决于硬件,最常见的一面是4KB。
当进程启动时,大部分的虚拟内存地址空间都是空的。 访问它将导致陷入OS内核,这可能会终止进程,并可能logging事件。
由于进程需要内存,它一次向操作系统请求一个或多个页面的内存。
这个令人心碎的错误将允许泄露高达64KB的数据。 这意味着它可以跨越16页的页面边界(换句话说,它可能跨越17页)。 这些页面中的第一个是存储合法数据的地方,以保证页面存在。 但是下面16页的虚拟地址空间可能还没有被分配。 如果发生这种情况,将不会有64KB的数据返回,操作系统内核将不得不处理这种情况。 如果没有定义恢复机制,这个过程将被终止。
根据服务器软件的devise,它可以通过简单地产生一个新的进程自动恢复。 我认为Apache会产生一个新的过程。 其他软件可能不会自动重生。 在那种情况下,心跳可能会导致服务器软件崩溃并停留下来。
操作系统完全崩溃是不可能的,因为心跳加速。 这将需要一个不同的错误来破坏操作系统。