为什么OpenSSL可以将接收/写入的数据保存在内存中?

为什么OpenSSL可以将接收/写入的数据保存在内存中?,openssl,sensitive-data,Openssl,Sensitive Data,我试图确保敏感数据(密码,…)不会以明文形式保存在进程内存中,我发现发送到OpenSSL或从OpenSSL接收到的所有数据都保存在内存中 这是一个问题,因为从SSL连接发送或接收的数据可能包含我们不希望保存在进程内存中的敏感信息 注: 只有在使用SSLv3或TLSv1时才会出现这种情况。使用SSLv2时,数据不会保存在内存中 我使用的是UbuntuLucid的0.9.8k-7ubuntu8.6版本。如果这与安全修复有关,我认为它是最新的 复制很容易: 使用“openssl客户端-tls1-

我试图确保敏感数据(密码,…)不会以明文形式保存在进程内存中,我发现发送到OpenSSL或从OpenSSL接收到的所有数据都保存在内存中

这是一个问题,因为从SSL连接发送或接收的数据可能包含我们不希望保存在进程内存中的敏感信息

注:

  • 只有在使用SSLv3或TLSv1时才会出现这种情况。使用SSLv2时,数据不会保存在内存中
  • 我使用的是UbuntuLucid的0.9.8k-7ubuntu8.6版本。如果这与安全修复有关,我认为它是最新的
复制很容易:

  • 使用“
    openssl客户端-tls1-connect主机名:443
    ”连接到SSL服务器
  • 在TLS连接中发送数据
  • 强制生成核心文件(例如,
    kill-SEGV
  • 检查核心文件,将显示接收和发送的数据

OpenSSL需要保留这些数据的原因是什么?有没有一个选项可以改变它的行为?

它仍然在内存中,因为你从来没有特别重写过内存内容。它没有理由自动这样做(其他人都会抱怨它使用了不必要的循环)


你必须自己清除记忆内容。该功能不会通过命令行程序公开。

它仍在内存中,因为您从未专门重写内存内容。它没有理由自动这样做(其他人都会抱怨它使用了不必要的循环)


你必须自己清除记忆内容。该功能不会通过命令行程序公开。

命令行“客户端”工具仅用于测试。它不是为了提供实际的安全性或适合实际使用。它的许多特性使它非常不适合任何类型的其他用途,例如,您不能发送“R”,因为这会触发重新协商。

命令行“客户端”工具仅用于测试。它不是为了提供实际的安全性或适合实际使用。它有许多特性,使得它非常不适合任何其他用途,例如,您不能发送“R”,因为这会触发重新协商。

注意:在找到我想要的解释后,我正在回答我自己的问题

如果在连接上启用了压缩,则数据将保存在zlib缓冲区中。这就是为什么在某些配置/服务器中没有观察到它。zlib当然需要正确压缩流

如果您不需要压缩,也不希望未加密的数据在进程内存中停留很长时间,那么可以禁用OpenSSL压缩

STACK_OF(SSL_COMP)* cm = SSL_COMP_get_compression_methods();
sk_SSL_COMP_zero(cm);
注意:在找到我想要的解释后,我正在回答我自己的问题

如果在连接上启用了压缩,则数据将保存在zlib缓冲区中。这就是为什么在某些配置/服务器中没有观察到它。zlib当然需要正确压缩流

如果您不需要压缩,也不希望未加密的数据在进程内存中停留很长时间,那么可以禁用OpenSSL压缩

STACK_OF(SSL_COMP)* cm = SSL_COMP_get_compression_methods();
sk_SSL_COMP_zero(cm);

这可能与使用的不同密码的操作有关。您可以使用
-ciphers
选项控制客户端显示的密码列表。通过这种方式,您可以尝试强制openssl将SSLv2中可用的较弱密码之一用于SSLv3/TLSv1连接,并查看在这种情况下是否得到一致的结果。只要进程内存中的敏感数据不能被分页,它就可能不是一个大问题:即使内存中没有数据本身,冷启动攻击也可以工作;如果你不能信任root,你就完蛋了。谢谢你的反馈。我尝试了与SSLv2相同的密码,得到了相同的结果。您还希望数据存储在哪里?它必须缓冲至少一个SSL记录,直到该记录准备好写入。在这样的问题中,您必须确切地知道什么是安全方面可以接受的。我关心的不是数据临时存储在内存中,而是数据可以在分配的缓冲区中保存很长时间。如果启用了压缩,我将问题追溯到zlib缓冲区。这可能与使用的不同密码的操作有关。您可以使用
-ciphers
选项控制客户端显示的密码列表。通过这种方式,您可以尝试强制openssl将SSLv2中可用的较弱密码之一用于SSLv3/TLSv1连接,并查看在这种情况下是否得到一致的结果。只要进程内存中的敏感数据不能被分页,它就可能不是一个大问题:即使内存中没有数据本身,冷启动攻击也可以工作;如果你不能信任root,你就完蛋了。谢谢你的反馈。我尝试了与SSLv2相同的密码,得到了相同的结果。您还希望数据存储在哪里?它必须缓冲至少一个SSL记录,直到该记录准备好写入。在这样的问题中,您必须确切地知道什么是安全方面可以接受的。我关心的不是数据临时存储在内存中,而是数据可以在分配的缓冲区中保存很长时间。如果启用了压缩,我将问题追溯到zlib缓冲区。