OpenSSL再曝CCS注入漏洞-心伤未愈又成筛子

太戏剧了,昨晚看了佳片有约,还不错,2012版的《完美回顾》,像我这样的人依旧选择用电视或者去影院看电影,在没有中间插播广告的时候,体验憋尿得过程中,总是能突然有非常多的想法,这是用电脑或者手机看电影所体会不到的。看完以后已经12点半了,突然想再看一遍《黑客帝国》,这下不用电脑不行了,因为电视上没得播...结果正在缓冲的时候,突然看到了旁边的小公告:“OpenSSL再爆严重安全漏洞--CCS注入”,完了,电影看不成了,不是说不想看了,突然感觉自己比神还无耻,怎么人家曝出漏洞会这么高兴啊,关掉已经缓冲完毕的电影,就想看一下OpenSSL的笑话,同一时候心里还极度扭曲地想,我不近期在搞基于OpenSSL的一个改动么,向OpenSSL这样的代码,就我这样的垃圾coder配得上它,因为我的垃圾代码和它非常般配...
       当我看了一篇博客《How I discovered CCS Injection Vulnerability (CVE-2014-0224)》后,我认为我错怪OpenSSL了,这次或许真的不是OpenSSL的错,而是RFC的错,即这次的这个漏洞不是实现问题,很多其它的是协议本身的设计问题。假设你还没有读过上面我提到的那篇博客,一定要看一下,假设看过了,我们就接着往下走,看看这个漏洞的一些细节。
       我们知道,OpenSSL协议分了两个层次,一个是记录协议层,一个是数据协议层,后者包括了握手协议,告警协议,CCS协议等,注意这个“等”字,搞知道国密标准的应该知道这个等字的含义,不知道国密标准的人奉劝永远都不要知道,这次的CCS漏洞本质上就和这个“等”字有关。言归正传,SSL/TLS的安全通道通过握手协议建立,安全通道上通行的数据显然是加密的,而在握手过程中,在密钥等安全參数没有协商完毕之前,数据都是明文的,那么在握手状态机中就肯定有那么一个点,在该点之前数据是明文的,而在该点之后数据是加密的,这个点就是接收到ChangeCipherSpec消息,问题是,这个消息在握手状态机中交换,可是却不在握手协议中定义,它被定义为一个单独的协议,不属于握手协议。这样做的理由,依照漏洞发现者Masashi Kikuchi在RFC挖掘出的理由那就是:

Note:          To help avoid pipeline stalls, ChangeCipherSpec is
                 an independent SSL Protocol content type, and is not
                 actually an SSL handshake message.
这是一个什么理由?显然没有考虑安全因素。那么问题就来了,既然CCS独立于握手状态机,那么它便能够在握手过程中的不论什么一点收发,在协议层面并没有强制CCS必需要在master keys在握手协议中已经完备的情况下才干发送,假设那样强制,就是两个协议之间的交叠。其实,依照规范而言,SSL/TLS的握手中,CCS的位置是被严格规定的,即master keys准备好之后,Finish消息之前,那么安全机制就必须由实现者自己负责。稍有不慎,关于握手协议和CCS之间的关系就会处理不好造成能够利用的漏洞。在一篇文章《Early ChangeCipherSpec Attack 》中,作者披露了OpenSSL1.0.1h是怎样解决问题的,实际上加了不多的几行代码,当中之中的一个就是ssl3_do_change_cipher_spec函数中的一个推断:
if (s->session == NULL || s->session->master_key_length == 0){/* might happen if dtls1_read_bytes() calls this */SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC,SSL_R_CCS_RECEIVED_EARLY);return (0);}

在之前的漏洞影响的版本号中,并没有确认master_key_length不为0,这就意味着即便master key还没有准备好,也是能够发送CCS的,而这样的话,所谓的密钥也没有秘密可言了。CCS的发送时间并没有强制要求,可是要求master keys必须准备好!以下是一个基于中间人攻击的漏洞利用场景,中间人在作为server的时候,在ServerHelloDone完毕后即发送一个CCS,注意此时还没有生成master keys,因此使用一个空值取代,因为OpenSSL在收到CCS的时候并没有检查自己的握手状态机处于哪一步骤,因此会无条件接收,此时它也没有master key,后面的事情就是使用不是密钥的密钥对数据进行加密,注意,因为OpenSSL的实现原因,仅仅要已经经过了key的计算,在一个session中以后就不会再次计算,因此以下的代码(相同处于ssl3_do_change_cipher_spec中)其实助长了漏洞:
if (s->s3->tmp.key_block == NULL){if (s->session == NULL){/* might happen if dtls1_read_bytes() calls this */SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC,SSL_R_CCS_RECEIVED_EARLY);return (0);}s->session->cipher=s->s3->tmp.new_cipher;if (!s->method->ssl3_enc->setup_key_block(s)) return(0);}

    关于SSL/TLS规范中将CCS设计成独立的一个数据协议,我在《TCP/IP协议族》这本经典教材中找到了更真切的理由,那就是它将发送方和接收方切割成了两个状态,依照分权原则,这个事不能在握手协议本身完毕。
    漏洞发现者Masashi Kikuchi所述,仅仅要保证几点就可以,非常easy:

IMHO, this sentence is the very cause of the vulnerability. According to it, the reason that CCS is assigned an independent record type is to avoid a stall. This is the point where the most complex synchronization is required in TLS/SSL handshake. First, you need to wait until the handshake proceeds to the proper phase. Then, you need to check whether the handshake receives CCS before Finish.

More precisely, when accepting CCS, you must verify the following three conditions (*):

    the handshake proceeds to the proper phase, i.e., just before to receive Finished,
    no fragments from the handshake remains,
    and, the next message is Finished.

Being more careful, you should also check

    no Alert fragment remains (they can be rejected in the first place),
    and, no Heartbeat fragment remains

事实非常easy,保证CCS发送的时候,master keys真的已经准备好了,这实际上就是CCS本身的意思,假设我能跟我的三岁的小小讲清楚这个,她肯定会说她的口头禅:难道不是吗?
       一个独立的CCS协议,独立于握手协议的CCS协议,在SSL/TLS中必定不可能是全然独立的,协议封装上是独立的,语义却不可能是独立的,否则,我在ClientHello后发送一个CCS,可否?唉,心病还未痊愈,CCS又来捣乱,假设说心脏出血是OpenSSL的问题的话(它实际上是一个低级的代码级错误),CCS漏洞则是一个协议层面的问题,这个问题可不低级!我相信不止OpenSSL的实现会有这个问题。

       我不再吐嘈了,可是我想澄清互联网时代系统两种死法的不同之处,对于安全而已,死法也仅仅有两种,我举一个现实中的样例,一种是生病或中毒而死,一种是外力置死,比方车祸,地震,或者被砍死,这两种本质是不同的,第一种是你自身出了问题,另外一种则是外部原因导致。映射到互联网,对于password被破解,CCS漏洞之类的,这就是第一类的,这类问题一般都是系统本身的设计问题,而对于像栈溢出,Heartbleed,堆溢出之类的,则属于第二类,这类问题一旦碰到,非常公平,可是不属于系统设计的问题,仅仅是实现问题。再说一下现实世界,即便吃再安全的食品,也怕菜刀,可是能够请保镖,武夫之流能挡刀,可是终于可能会因为吃了太多的不健康的油而致癌...

       做个广告,最好的筛子:OpenSSL



转载于:https://www.cnblogs.com/hrhguanli/p/3788316.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何从JavaScript数组中获取多个随机唯一元素?

The JavaScript is a very versatile language and it has a function almost everything that you want. JavaScript是一种非常通用的语言,它几乎具有您想要的所有功能。 Here, we will show you how to generate random unique elements from an array in JavaSc…

用SQL语句添加删除修改字段

1.增加字段 alter table docdsp add dspcodechar(200)2.删除字段 ALTER TABLE table_NAME DROP COLUMNcolumn_NAME3.修改字段类型 ALTER TABLE table_name ALTER COLUMNcolumn_name new_data_type4.sp_rename 改名 EXEC sp_rename [dbo].[Table_1].[fi…

通过命令修改wampserver的mysql密码

WAMP安装好后,mysql教程密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作。 首先,通过WAMP打开mysql控制台。 提示输入密码,因为现在是空,所以直…

DBNull

1、执行ExecuteScalar时,要进行Null判断,因为对Null进行操作会报:NullReferenceException 2、返回DBNull的情况,因为DBNull是用来表示数据库中Null的,所以如果数据中返回null,程序中就是DBNull&#xff0c…

什么是ACID理论(二阶段、三阶段提交、TCC)

目录二阶段提交协议TCC(Try-Confirm-Cancel)预留成功预留失败三阶段提交协议总结Some questionsreferenceACID理论时对事务特性的抽象和总结,想要实现ACID需要掌握二阶段提交协议以及TCC 这里是有关协议的论文PDF链接: CONCURRENC…

oracle安装后新建数据库实例及配置

ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法 (2011-01-20 13:50:37) 转载▼标签: it 分类: 技术早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务…

html5游戏开发--动静结合(二)-用地图块拼成大地图 初探lufylegend

一、前言 本次教程将向大家讲解如何用html5将小地图块拼成大地图,以及如何用现有的高级html5游戏开发库件lufylegend.js开发游戏。 首先让我们来了解了解如何用html5实现动画,毕竟“动静结合”是先有动再有静。看了上一章的内容,或许你就有了…

BASE理论(基本可用策略+ 最终一致性实现)

目录实现基本可用的几个策略1、流量削峰(不同地区售票时间错峰出售)2、延迟响应,异步处理(买票排队,基于队列先收到用户买票请求,排队异步处理,延迟响应)3、体验降级(看到…

一天一道算法题--6.15--卡特兰数

感谢微信平台---一天一道算法题---每天多一点进步- problem: 12个高矮不同的人 排成两排 每排必须是从矮到高排列 而且第二行比对应的第一排的人高 问排列方式有多少种? analyse: 据说 这题 是来自于 阿里巴巴的面试题 果然 很有分量 ~~ 我反正 胡思乱想了好多 没搞…

现有一些开源ESB总线的比較

现有的开源ESB总线中,自从2003年第一个开源总线Mule出现后,如今已经是百花争鸣的景象了。如今我就对现有的各种开源ESB总线根据性能、可扩展性、资料文档完整程度以及整合难易程度等方面展开。 一.CXF CXF的定位不是ESB总线,而是一…

Paxos算法(Basic Paxos 与 Multi-Paxos思想)

目录Basic Paxos三个角色达成共识的方法对于Basic Paxos的总结Multi-Paxos领导者优化 Basic Paxos 执行referencePaxos 算法包含 2 个部分: 1、Basic Paxos : 描述多节点之间如何就某个值达成共识 2、Multi-Paxos : 描述执行多个Basic Paxos实…

vs2012下调试mvc4源代码

当前流行的应该是mvc3才对。然后在研究mvc3的源代码时候,Html这个属性下的扩展方法Partial()都没有。IntelliSense不会提示该方法,找了半天的资料也问了一些博友,没看到好的解决棒法。最后没辙另辟蹊跷,就开始着手研究mvc4的源代码…

JAVA UDP网络编程学习笔记

一、UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路…

firefox 插件开发

IDE,你可以尝试下NetBeans foxbeans这个插件。转载于:https://www.cnblogs.com/sode/archive/2013/01/25/2876562.html

13种负载均衡算法

目录前言(1)轮转调度(Round-Robin Scheduling)算法(2)加权轮转调度(Weighted Round-Robin Scheduling)算法(3)随机均衡调度(Random Scheduling&am…

对于shell脚本参数获取时的一点小技巧

问题如下: 根据脚本参数的个数$#进行一个循环,在依次输出每个参数$1 $2 $3...... 我有一个循环变量i $i 取到这时的i为1,我想使用这个1再去调用$1,也是就是打印出第一个参数 就是$($i)的意思来取到第几个参数,当然$($i)是不好用的…

(转)页游安全攻与防,SWF加密和隐藏密匙

原文链接:http://netsecurity.51cto.com/art/201211/364775.htm 页游,最最核心的就是客户端(swf)与服务端的游戏通信了。游戏通信产生的封包,内容是否可识别,可篡改,可重放,处理逻辑…

C++自动类型推导 : auto 与 decltype 用法

基本用法与区别 auto 总是推导出“值类型”,绝不会是“引用”,如果有引用,auto会把引用去掉,推导出值类型; auto 可以附加上 const、volatile、*、& 这样的类型修饰符,得到新的类型。 auto x 10L; // auto推导为…

C++智能指针使用指南 part1:基本使用

加粗样式>TOC 智能指针是代理模式的具体应用,它使用 RAII 技术代理了裸指针,能够自动释放内存, 无需程序员干预,所以被称为“智能指针”。 智能指针不是指针,而是一个对象,所以不要对其调用delete&…

AS3.0 BitmapData类介绍

注:文中的Bitmapdata和BMD均为同一意思BitmapData,BMD为其缩写一,概括: Bitmapdata继承Object对象,实现IBitmapDrawable接口,这个接口有什么用,你可以理解为Drawable,能被画。官方介绍是:IBitma…