关于OpenSSL“心脏出血”漏洞的分析
2014-04-09 09:23
274 查看
0x00 背景
原作者:Sean Cassidy 原作者Twitter:@ex509 原作者博客:http://blog.existentialize.com 来源:http://blog.existentialize.com/diagnosis-of-the-openssl-heartbleed-bug.html当我分析GnuTLS的漏洞的时候,我曾经说过,那不会是我们看到的最后一个TLS栈上的严重bug。然而我没想到这次OpenSSL的bug会如此严重。OpenSSL“心脏出血”漏洞是一个非常严重的问题。这个漏洞使攻击者能够从内存中读取多达64 KB的数据。一些安全研究员表示:无需任何特权信息或身份验证,我们就可以从我们自己的(测试机上)偷来X.509证书的私钥、用户名与密码、聊天工具的消息、电子邮件以及重要的商业文档和通信等数据。这一切是如何发生的呢?让我们一起从代码中一探究竟吧。0x01 Bug
请看ssl/dl_both.c,漏洞的补丁从这行语句开始:0x01a 用户可以控制变量payload和pl
如果用户并没有在心跳包中提供足够多的数据,会导致什么问题?比如pl指向的数据实际上只有一个字节,那么memcpy会把这条SSLv3记录之后的数据——无论那些数据是什么——都复制出来。很明显,SSLv3记录附近有不少东西。说实话,我对发现了OpenSSL“心脏出血”漏洞的那些人的声明感到吃惊。当我听到他们的声明时,我认为64 KB数据根本不足以推算出像私钥一类的数据。至少在x86上,堆是向高地址增长的,所以我认为对指针pl的读取只能读到新分配的内存区域,例如指针bp指向的区域。存储私钥和其它信息的内存区域的分配早于对指针pl指向的内存区域的分配,所以攻击者是无法读到那些敏感数据的。当然,考虑到现代malloc的各种神奇实现,我的推断并不总是成立的。当然,你也没办法读取其它进程的数据,所以“重要的商业文档”必须位于当前进程的内存区域中、小于64 KB,并且刚好位于指针pl指向的内存块附近。研究者声称他们成功恢复了密钥,我希望能看到PoC。如果你找到了PoC,请联系我。0x01b 漏洞修补
修复代码中最重要的一部分如下:0x02 前车之鉴
我们能从这个漏洞中学到什么呢?我是C的粉丝。这是我最早接触的编程语言,也是我在工作中使用的第一门得心应手的语言。但是和之前相比,现在我更清楚地看到了C语言的局限性。从GnuTLS漏洞和这个漏洞出发,我认为我们应当做到下面三条:花钱请人对像OpenSSL这样的关键安全基础设施进行安全审计; 为这些库写大量的单元测试和综合测试; 开始在更安全的语言中编写替代品。考虑到使用C语言进行安全编程的困难性,我不认为还有什么其他的解决方案。我会试着做这些,你呢?作者简介:Sean是一位关于如何把事儿干好的软件工程师。现在他在Squadron工作。Squadron是一个专为SaaS应用程序准备的配置与发布管理工具。测试版本的结果以及检测工具:
OpenSSL 1.0.1 through 1.0.1f (inclusive) are vulnerable OpenSSL 1.0.1g is NOT vulnerable OpenSSL 1.0.0 branch is NOT vulnerable OpenSSL 0.9.8 branch is NOT vulnerable
0x00 背景
原作者:Sean Cassidy 原作者Twitter:@ex509 原作者博客:http://blog.existentialize.com 来源:http://blog.existentialize.com/diagnosis-of-the-openssl-heartbleed-bug.html当我分析GnuTLS的漏洞的时候,我曾经说过,那不会是我们看到的最后一个TLS栈上的严重bug。然而我没想到这次OpenSSL的bug会如此严重。OpenSSL“心脏出血”漏洞是一个非常严重的问题。这个漏洞使攻击者能够从内存中读取多达64 KB的数据。一些安全研究员表示:无需任何特权信息或身份验证,我们就可以从我们自己的(测试机上)偷来X.509证书的私钥、用户名与密码、聊天工具的消息、电子邮件以及重要的商业文档和通信等数据。这一切是如何发生的呢?让我们一起从代码中一探究竟吧。0x01 Bug
请看ssl/dl_both.c,漏洞的补丁从这行语句开始:0x01a 用户可以控制变量payload和pl
如果用户并没有在心跳包中提供足够多的数据,会导致什么问题?比如pl指向的数据实际上只有一个字节,那么memcpy会把这条SSLv3记录之后的数据——无论那些数据是什么——都复制出来。很明显,SSLv3记录附近有不少东西。说实话,我对发现了OpenSSL“心脏出血”漏洞的那些人的声明感到吃惊。当我听到他们的声明时,我认为64 KB数据根本不足以推算出像私钥一类的数据。至少在x86上,堆是向高地址增长的,所以我认为对指针pl的读取只能读到新分配的内存区域,例如指针bp指向的区域。存储私钥和其它信息的内存区域的分配早于对指针pl指向的内存区域的分配,所以攻击者是无法读到那些敏感数据的。当然,考虑到现代malloc的各种神奇实现,我的推断并不总是成立的。当然,你也没办法读取其它进程的数据,所以“重要的商业文档”必须位于当前进程的内存区域中、小于64 KB,并且刚好位于指针pl指向的内存块附近。研究者声称他们成功恢复了密钥,我希望能看到PoC。如果你找到了PoC,请联系我。0x01b 漏洞修补
修复代码中最重要的一部分如下:0x02 前车之鉴
我们能从这个漏洞中学到什么呢?我是C的粉丝。这是我最早接触的编程语言,也是我在工作中使用的第一门得心应手的语言。但是和之前相比,现在我更清楚地看到了C语言的局限性。从GnuTLS漏洞和这个漏洞出发,我认为我们应当做到下面三条:花钱请人对像OpenSSL这样的关键安全基础设施进行安全审计; 为这些库写大量的单元测试和综合测试; 开始在更安全的语言中编写替代品。考虑到使用C语言进行安全编程的困难性,我不认为还有什么其他的解决方案。我会试着做这些,你呢?作者简介:Sean是一位关于如何把事儿干好的软件工程师。现在他在Squadron工作。Squadron是一个专为SaaS应用程序准备的配置与发布管理工具。测试版本的结果以及检测工具:
OpenSSL 1.0.1 through 1.0.1f (inclusive) are vulnerable OpenSSL 1.0.1g is NOT vulnerable OpenSSL 1.0.0 branch is NOT vulnerable OpenSSL 0.9.8 branch is NOT vulnerable
相关文章推荐
- 关于OpenSSL“心脏出血”漏洞的分析
- 关于OpenSSL“心脏出血”漏洞的分析
- 关于OpenSSL“心脏出血”漏洞的分析
- 关于OpenSSL“心脏出血”漏洞的分析
- 关于OpenSSL“心脏出血”漏洞的分析
- 关于OpenSSL“心脏出血”漏洞的分析
- 关于OpenSSL“心脏出血”漏洞的分析
- Heartbleed第三篇:关于OpenSSL“心脏出血”漏洞的分析
- 漏洞分析---关于OpenSSL“心脏出血”漏洞的分析
- Openssl“心脏出血”漏洞分析及其利用
- Openssl“心脏出血”漏洞分析及其利用
- U-Mail邮件系统客户无需担心OpenSSL心脏出血漏洞
- OpenSSL“心脏出血”漏洞
- TurboMail邮件系统,完美修复OpenSSL心脏出血漏洞
- 一个检测OpenSSL心脏出血漏洞的Python脚本分享
- 3.漏洞验证系列--openssl heartbeat(心脏出血)
- 解析OpenSSL程序概念及震惊业界的“心脏出血”漏洞
- 关于“心脏出血”漏洞(heartbleed)的理解
- 升级openssl包,修复心脏出血漏洞 推荐
- openssl心脏出血漏洞修复