是否有任何 OpenBSD 保护措施可以减轻 Heartbleed 造成的损害?

信息安全 心血来潮 打开bsd
2021-08-25 07:27:20

OpenBSD 提供了一系列针对操作系统固有漏洞的实质性保护。大多数这些功能在其他操作系统中是找不到的,或者至少默认情况下没有打开。上面链接的 OpenBSD 网站的列表包括:

  • strlcpy() 和 strlcat()
  • 内存保护净化
    • W^X
    • .rodata 段
    • 保护页面
    • 随机 malloc()
    • 随机映射()
    • atexit() 和 stdio 保护
  • 特权分离
  • 特权撤销
  • Chroot 监禁
  • 新的 uid
  • 临警察
  • ... 和别的

OpenBSD 中的任何安全保护措施是否可以减轻 Heartbleed 攻击造成的数据泄露?

换句话说,使用 OpenSSL 的 Apache/nginx https 服务器是否会因为在 OpenBSD 上运行而更不容易受到 Heartbleed 攻击?

2个回答

不。

OpenBSD 有一些措施(特别是 malloc() 保护页面和清除已释放内存),这些措施本应将Heartbleed 变成崩溃或一大堆“0x0d”字节的泄漏。但是,正如此处的一篇博文中所述,OpenSSL 使用自己的自定义内存管理系统来阻止这些措施。

这里似乎对 OpenSSL 中的内存管理如何工作存在一些误解。

默认情况下,OPENSSL_malloc 和 OPENSSL_free 只调用系统 malloc 和 free(有一些间接性,因此应用程序可以根据需要重新定义这些函数,但 OpenSSL 本身不会这样做)。但是,对于某些数据结构,尤其是输入缓冲区,它会保留空闲列表中一些先前分配但未使用的项目,而不会实际释放它们。由于它不会在使用后清理缓冲区内容,因此如果从空闲列表中取出缓冲区并重新使用之前的内容可能仍然存在(即使系统空闲会删除它)。

然而,由于在大多数其他情况下,OpenSSL 实际上只是调用系统 malloc 和 free,缓解措施如保护页面(这将在 16K 输入缓冲区崩溃结束后进行读取)和清除释放的内存(这将停止人们看到的一些 bignum 数据泄漏)会有所帮助,即使使用 OpenSSL 当前的内存管理。他们不会帮助暴露以前的输入缓冲区内容或位于有效(未释放)堆位置的私有 bignum 数据(除非使用保护页面来防止发生过度读取)。