由于缓冲区溢出总是让恶意黑客在缓冲区之外写入并覆盖指向恶意黑客可以放置的 shellcode 的返回指针,这是否意味着成功利用堆栈缓冲区溢出总是意味着如果以正确的方式调用 shell 的能力? 至少在理论上,如果您假设 DEP 和 ASLR 没有到位。
缓冲区溢出漏洞是否总是意味着代码执行漏洞?
信息安全
缓冲区溢出
堆栈溢出
2021-08-15 15:56:34
3个回答
不,缓冲区溢出可能:
- 反对堆上的缓冲区而不是堆栈。这可能仍会导致代码执行,但利用起来会更加复杂。
- 大小受到限制,因此无法覆盖返回指针。(例如,只能写入缓冲区之外的 1 个字节)
- 限制可以写入的字节,防止写入合适的指针。
- 覆盖堆栈cookie,在使用返回地址之前检测到。除非 cookie 被泄露,否则漏洞利用会在绝大多数情况下使进程崩溃,而不是导致代码执行。
- 位于向上增长的堆栈上,因此无法覆盖返回地址。漏洞利用可能仍然能够覆盖其他局部变量,或者缓冲区可能会传递给另一个函数,但不会像向下堆栈那样可靠地执行代码。
其中一些可能仍会导致代码执行,但其他实例可能无法利用。
但是,一旦您发现发生缓冲区溢出的位置,通常要修复它比证明它不能被利用要容易得多。
道格拉斯给出了正确的答案。并非所有缓冲区溢出都会执行代码。但是,我觉得它缺少一个非常重要的警告。
即使缓冲区溢出不允许任意代码执行,但这并不意味着它是安全的。
写入缓冲区溢出允许您写入不应该写入的数据。作为函数地址的数据只是一个特例。例如,假设我有一个包含名称和权限字段的用户结构。很容易想象将我的名字设置为“JosiahhasaverylongnameAdmin”如何利用一个严重的漏洞,而无需执行任何任意代码。
对于另一个现实世界的例子,如果你还记得 Heartbleed,那就是缓冲区溢出。这只是读溢出而不是写溢出。那里没有执行代码的机会,但即便如此,也是对机密性的破坏性破坏。
简单的答案是否定的,并非所有缓冲区溢出都保证会导致代码执行。溢出可能太小而无法覆盖所需的指针/值,无法控制溢出部分以覆盖事物,或者可能太大而可能会杀死堆栈 cookie/canaries 等。
其它你可能感兴趣的问题