每当在服务器上使用密码等敏感数据时,它都会在内存中短时间驻留。鉴于存在诸如 heartbleed 之类的安全漏洞,它们能够为其内容“流血”内存,在零日之前针对此类攻击存在哪些先发制人的防御措施?
是否有在使用后擦除“敏感”内存的方法,例如密码不会在可能的缓冲区溢出可以访问的内存区域中逗留(甚至被释放)?
每当在服务器上使用密码等敏感数据时,它都会在内存中短时间驻留。鉴于存在诸如 heartbleed 之类的安全漏洞,它们能够为其内容“流血”内存,在零日之前针对此类攻击存在哪些先发制人的防御措施?
是否有在使用后擦除“敏感”内存的方法,例如密码不会在可能的缓冲区溢出可以访问的内存区域中逗留(甚至被释放)?
heartbleed 的主要问题不是仍在内存中的未使用的秘密数据,而是内存中包含正在使用的秘密数据。这些是来自并行请求的数据,但更重要的是建立 SSL 握手所需的证书私钥。
用于防止此类攻击的典型技术是权限分离。在 SSL 握手的情况下,这可能是使用可以加密/签名但永远不会使密钥可访问的HSM 。它可以是例如 OpenSSH 采用的进程级分离。或者,关键计算甚至可以由另一方控制的另一台计算机系统发出,就像使用Cloudflare Keyless SSL一样。
绝对地。几十年来,擦除关键数据的内存在 C/C++ 中很常见。.NET 甚至提供了一个SecureString类,记录为:
表示应保密的文本,例如在不再需要时将其从计算机内存中删除。
但是数据通常需要在某个时间点以明文形式保存在内存中,因此没有完美的解决方案。
非常安全的 ftp使用的方法是通过 API 处理字符串和缓冲区的使用。它并不完全擦除数据(您的问题建议的选项),但它是解决问题的一种方法。