大约两年前,在有人发现一个可用于读取进程内存的bug之后,OpenSSL引入了一个直到昨天您才使用过甚至听说过的新功能。
心碎
这个主心跳站点有相当多的信息,但没有详细的错误描述。为此,请阅读OpenSSL心跳错误的诊断。这里还有一个简短的伪版本,供参考。
结构 {
无符号的短透镜;烧焦有效载荷[];} *小包裹;小包裹=malloc公司(自动变速箱);阅读(秒,小包裹,自动变速箱);缓冲器=malloc公司(小包裹->伦恩);会员(缓冲器,小包裹->有效载荷,小包裹->伦恩);写(秒,缓冲器,小包裹->伦恩);
小包裹
位于堆中的某个位置,我们将从堆中复制一些用户指定数量的数据到回复缓冲区中。用户指定的长度是安全的,因为它只有16位,并且目标缓冲区总是足够大。危险来自这样一个事实,即输入缓冲区可能不够大,导致回复包含不应该包含的信息。如果数据包现在占用的内存中以前的内容是有趣的,那么回复也会很有趣。
缓解
如果前面的内容不有趣怎么办?例如,如果malloc公司
在重用之前覆盖内存的先前内容?就像在,到底是什么malloc.conf文件使用J型选项。然后攻击者将获得一个充满0xd0个
,这是决定性的无趣的.但是。。。
总是有一个but。除非libssl是用打开ssl_NO_BUF_FREELISTS
选项(事实并非如此),libssl将维护自己的freelist,使得malloc执行的任何可能的缓解策略都毫无用处。是的,OpenSSL包括它自己的内置漏洞缓解功能。当然,您可以使用该选项编译自己的libssl,但是。。。
当我在没有内部自由列表的情况下构建libssl时,与该库链接的nginx会偶尔不稳定地拒绝连接。Firefox(nss)和ftp(libssl)都会报告错误,例如:
1007048992:错误:1409442E:SSL例程:SSL3_READ_BYTES:tlsv1警报协议版本:libssl/src/SSL/s3_pkt.c:1255:SSL警报编号70
在这一点上,我放弃了。(而且。。。然后我才知道发生了什么.)
保护页还应防止复制超出输入数据包缓冲区的过多数据。点击未映射页面->繁荣。我没能触发这个;显然libssl中的缓冲区总是足够大?假设是这样,这意味着您只能读取以前释放的内存,而不能读取任何正在使用的内存。当然,即使是临时测试也会发现以前释放的内存中包含很多有趣的数据,比如http头和表单数据。(准确地确定libssl中输入数据包缓冲区的大小比我想钻研的更深。注意indagator。)