OpenSSL然后暴露CCS注射没有愈合受损的心
核心提示:剧情,昨晚看的不错,嗯,2012版的《完美回忆》话剧,昨晚看的不错,不错,2012版的《完美回忆》看完后是12:30,突然想再看一遍《黑客帝国》。
当我读到了一篇叫我是如何发现CCS注入漏洞(CVE-2014-0224)如果你还没有读过我上面提到的博客,我们必须看到它。如果我们看到了,让我们下去看看泄漏的一些细节。
我们知道,OpenSSL协议分为两个层次,一是记录层,数据层,后者包括握手协议、报警协议,协议CCS,和的注意;字,知道国家秘密的标准应该知道这个词的意思,知道在密集的标准人建议不知道CCS上的漏洞和其他相关的词的本质不;,通过SSL / TLS握手协议建立安全通道,交通安全通道数据显然是加密的,但在握手过程中,没有在关键安全参数协商之前的数据是明确的完成,那么就必须在握手的状态机的一个点,数据前矿石的点表示,这一点之后的数据是加密的,问题是,ChangeCipherSpec消息接收,问题是,交换新闻的状态机在手,但不要在握手协议定义,它被定义为一个单独的协议,不属于握手协议。这的原因,Masashi Kikuchi之所以在RFC的挖掘漏洞的发现者,是:
注意:为了避免流水线停顿,ChangeCipherSpec
独立的SSL协议内容类型,而不是
实际上是一个SSL握手消息。
这是什么原因很显然,安全因素不考虑。所以问题是,由于CCS是独立的握手的状态机,它可以发送和接收任何点在握手过程中,协议层没有执行CCS必须在钥匙握手协议的主人完美的情况下发送,如果是被迫的,两个协议之间的重叠。事实上,根据规范,CCS的位置是在SSL / TLS握手,这是严格规定的,在万能钥匙准备好,然后安全机制必须由实施者本身负责。稍一疏忽,握手协议和CCS之间的关系没有处理好,可利用的漏洞在一篇文章早期ChangeCipherSpec攻击
如果(S ->会话的会话->空-> master_key_length | | = = = = 0)
{
可能会发生,如果(dtls1_read_bytes) / *电话*
sslerr(ssl_f_ssl3_do_change_cipher_spec,ssl_r_ccs_received_early);
返回(0);
}
在以前版本的漏洞,它没有确认master_key_length不是0,这意味着即使掌握关键是没有准备好,它也可能给CCS,所谓关键没有秘密。CCS的发送时间是不是强制性的,但它需要主钥匙准备!以下是一个基于场景中间,中间的漏洞攻击服务器,在serverhellodone送CCS,注意主密钥的产生,所以空的利用价值,相反,由于OpenSSL在接收CCS没有握手检查哪一步他们的状态机,它将接收到的无条件的,在这个时候它不是万能钥匙,在没有密钥的数据有什么用,值得注意的是,由于OpenSSL的原因,只要经历了一次关键的计算,它会重新计算,因此下面的代码(在同一ssl3_do_change_cipher_spec)事实上促成了漏洞:
如果(S -> S3 -> tmp.key_block = null)
{
如果(s =会话= NULL)
{
可能会发生,如果(dtls1_read_bytes) / *电话*
sslerr(ssl_f_ssl3_do_change_cipher_spec,ssl_r_ccs_received_early);
返回(0);
}
S ->会话->密码= S -> -> tmp.new_cipher S3;
如果(!S ->方法-> ssl3_enc -> setup_key_block(S))返回(0);
}
一个数据协议规范的SSL/TLS/CCS将作为一个独立的设计,我发现了真正的原因在TCP/IP协议的经典教科书,它是发送者和接收者分为两种状态,按照权力下放的原则,这件事不能在握手协议本身完成。
该漏洞的发现者,Masashi Kikuchi,很简单,只要你保证几点:
恕我直言,这句话是脆弱性的原因。据认为,CCS被指定为独立记录类型的原因是为了避免失速。这是最简单的同步需要在TLS / SSL握手。首先,你需要等到握手继续到适当的阶段。然后,您需要检查握手是否在完成前接收CCS。
更确切地说,当接受CCS时,您必须验证以下三个条件(*):
握手继续到适当的阶段,也就是在收到之前,
握手没有留下碎片,
然后,下一个消息完成了。
小心些,你也应该检查一下。
没有警报碎片(它们可能首先被拒绝),
而且,没有心跳碎片
事实很简单,当CCS被发送时,主密钥确实已经准备好了,这实际上就是CCS本身的意思。如果我能告诉我三岁的小女孩,她一定会说出她的口头禅:不是吗
独立的CCS协议,独立于握手协议的CCS协议,在SSL / TLS中不能完全独立。协议封装是独立的,但语义不能独立。否则,我送一个CCS的ClientHello之后,我可以吗唉,心还没有愈合。CCS将再次制造麻烦。如果心脏出血是OpenSSL的问题,它实际上是一个低级别的代码级错误。CCS漏洞是协议级别的问题。这个问题不是低级的,我相信OpenSSL的实施会有这个问题。
我不奇怪,但我想澄清的两个不同的模具,网络系统安全的时代,死亡是仅有的两个,我给一个生病的或一个真实的例子,一个是中毒死亡,死亡的外力,如事故、地震、或砍死两种不同的是,第一个是你自己出了问题,二是外因。映射到互联网,密码破解,CCS漏洞一样,这是第一种,这类问题一般是系统本身的设计问题,但对于像Heartbleed,堆栈溢出,堆溢出等,是这一类的问题,第二型一旦遇到的,是公平的,而不是设计问题是实现F系统问题。又真实的世界,甚至吃安全的食品,也怕菜刀,但请保镖,贝奥武夫流可以挡刀,但最终可能是由于吃太多不健康的致癌油…
做广告,最好的筛子:OpenSSL