OpenSSL再曝CCS注入漏洞-心伤未愈又成筛子
当我看了一篇博客《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
OpenSSL再曝CCS注入漏洞-心伤未愈又成筛子的更多相关文章
- OpenSSL再爆多处高危漏洞
OpenSSL团队于北京时间6月5号晚8点左右发布了5个安全补丁,这次的更新涉及多处高危漏洞,连接:http://www.openssl.org/news/ 受影响的版本包括: OpenSSL 1.0 ...
- zabbix再爆高危SQL注入漏洞,可获系统权限
漏洞概述 zabbix是一个开源的企业级性能监控解决方案.近日,zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系统 ...
- WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案(转)
对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避 ...
- WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案
对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避 ...
- 利用SQL注入漏洞登录后台的实现方法
利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...
- 预处理prepareStatement是怎么防止sql注入漏洞的?
序,目前在对数据库进行操作之前,使用prepareStatement预编译,然后再根据通配符进行数据填值,是比较常见的做法,好处是提高执行效率,而且保证排除SQL注入漏洞. 一.prepareStat ...
- 利用SQL注入漏洞登录后台的实现方法 。。。。转载
一.SQL注入的步骤 a) 寻找注入点(如:登录界面.留言板等) b) 用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c) 将sql语句发送给数据库管理系统(DBMS) d) DBMS ...
- sqlmap查找SQL注入漏洞入门
1.安装sqlmap sqlmap是一款非常强大的开源sql自动化注入工具,可以用来检测和利用sql注入漏洞.注意:sqlmap只是用来检测和利用sql注入点的,使用前请先使用扫描工具扫出sql注入点 ...
- Drupal 7.31版本爆严重SQL注入漏洞
今早有国外安全研究人员在Twitter上曝出了Drupal 7.31版本的最新SQL注入漏洞,并给出了利用测试的EXP代码. 在本地搭建Drupal7.31的环境,经过测试,发现该利用代码可成功执行并 ...
随机推荐
- Web前端开发最佳实践(2):前端代码重构
前言 代码重构是业内经常讨论的一个热门话题,重构指的是在不改变代码外部行为的情况下进行源代码修改,所以重构之前需要考虑的是重构后如何才能保证外部行为不改变.对于后端代码来说,可以通过大量的自动化测试来 ...
- Linux与其它类Unix内核的比较
单块结构的内核:由几个逻辑上独立的成分构成,单块结构,大多数据商用Unix变体也是单块结构: 编译并静态连接的传统Unix内核:Linux能自动按需动态地装载和卸载部分内核代码(模块),而传统Unix ...
- 湖南大学ACM程序设计新生杯大赛(同步赛)G - The heap of socks
题目描述 BSD is a lazy boy. He doesn't want to wash his socks, but he will have a data structure called ...
- 洛谷P2731 骑马修栅栏 [欧拉回路]
题目传送门 骑马修栅栏 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经 ...
- scrapy抓取拉勾网职位信息(七)——实现分布式
上篇我们实现了数据的存储,包括把数据存储到MongoDB,Mysql以及本地文件,本篇说下分布式. 我们目前实现的是一个单机爬虫,也就是只在一个机器上运行,想象一下,如果同时有多台机器同时运行这个爬虫 ...
- Kylin的垃圾清理
在Kylin运行一段时间之后,有很多数据因为不再使用而变成了垃圾数据,这些数据占据着大量HDFS.HBASE等资源,当积累到一定规模时会对集群性能产生影响.这些垃圾数据主要包括: Purge之后原Cu ...
- 使用ApplicationContext
ApplicationContext覆盖了BeanFactory的所有功能,并提供了更多的特,容器创建时就创建了singleton Bean 相对BeanFactory而言,ApplicationCo ...
- Ubuntu下查看软件版本及安装位置
查看软件版本: XXX --version 或 aptitude show xxx 也可用apt-show-versions (要先安装sudo apt-get install apt-show-ve ...
- Hat's Fibonacci hdu 1250
Problem Description A Fibonacci sequence is calculated by adding the previous two members the sequen ...
- 【BZOJ 4710】 4710: [Jsoi2011]分特产 (容斥原理)
4710: [Jsoi2011]分特产 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 99 Solved: 65 Description JYY 带 ...