我断言 Heartbleed bug 是 C 缓冲区长度检查问题的表现是否正确?
Yes.
Heartbleed bug 是 C 语言中经典缓冲区溢出漏洞的表现吗?
不。“经典”缓冲区溢出是指您write写入堆栈分配的缓冲区的数据超出了其所能容纳的数量,其中写入的数据是由敌对代理提供的。恶意数据溢出缓冲区并覆盖当前方法的返回地址。当该方法结束时,它会返回到包含攻击者选择的代码的地址并开始执行它。
相比之下,心脏出血缺陷并不覆盖一个缓冲区,并且不execute任意代码,它只是reads内存中很可能存在敏感数据的代码超出范围。
为什么恶意使用尝试读取另一个应用程序的内存时没有导致分段错误?
它没有尝试读取另一个应用程序的内存。该漏洞利用读取当前进程的内存,而不是其他进程的内存。
为什么恶意使用尝试读取缓冲区越界内存时没有导致分段错误?
这是这个问题的重复:
为什么这不会给出分段违规错误? https://stackoverflow.com/questions/22994544/why-does-this-not-give-a-segmentation-violation-fault/22995901#22995901
分段错误意味着您触摸了该页面操作系统内存管理器还没有分配给你。这里的错误是你触碰了堆管理器尚未分配给您的有效页上的数据。只要页面有效,就不会出现段错误。通常,堆管理器会向操作系统请求一大块内存,然后将其分配给不同的分配。就操作系统而言,所有这些分配都位于有效的内存页面上。
取消引用 null 是一个段错误,因为操作系统永远不会使包含零指针的页面成为有效页面。
更一般地说:编译器和运行时不需要确保未定义的行为导致段错误; UB 可以导致任何行为,其中包括什么都不做。有关此问题的更多想法,请参阅:
局部变量的内存可以在其作用域之外访问吗? https://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope/6445794#6445794
对于我来说,UBshould始终相当于安全关键代码中的段错误,以及有关漏洞静态分析讨论的一些指示,请参阅今天的博客文章:
http://ericlippert.com/2014/04/15/heartbleed-and-static-analysis/ http://ericlippert.com/2014/04/15/heartbleed-and-static-analysis/
在写入内存之前将内存清零(然后随后从中读取)是否会导致分段错误?
不太可能。如果读越界不会导致段错误,那么写越界就不太可能导致。这是possible内存页是只读的,但在这种情况下似乎不太可能。
当然,later将各种不应该存在的内存归零的后果是整个节目中的段错误。如果您稍后取消引用的清零内存中存在一个指针,则取消引用 null 会产生段错误。
这在不同操作系统之间有不同吗?
问题很模糊。让我重新表述一下。
不同的操作系统和不同的 C/C++ 运行时库是否提供了不同的分配虚拟内存、分配堆内存以及识别内存访问越界的策略?
Yes; 不同的事情是不同的.
或者在其他一些环境因素之间?
Such as?
显然无法识别该错误的利用情况。是因为心跳函数调用时不记录日志吗?
Correct.
肯定任何对 ~64k 字符串的请求都可能是恶意的吗?
我不按照你的思路。使请求可能是恶意的原因是发送的字节与请求回显的字节之间不匹配,而不是要求回显的数据大小。