转自 http://www.myhack58.com/Article/60/63/2014/44763.htm
Heartbleed漏洞
自从Heartbleed漏洞曝光以来,网上能看到很多相关的文章,但大部分都是写的云里雾里,本文尝试直观明了的对漏洞原理进行说明及模拟。
OpenSSL是SSL协议以及一系列加密算法的开源实现,使用C语言编写。OpenSSL采用Apache开源协议,可以免费用于商业用途,在很多linux发行版和服务器中得到广泛应用。OpenSSL出现漏洞造成的影响是巨大的,Heartbleed漏洞被称作“历史上最为严重的网络安全漏洞”。
Heartbleed漏洞最先由国际网络安全研究和一位Google研发人员在4月3日独立发现。但直到4月7日,OpenSSL1.0.1g版本发布修复这个漏洞,漏洞信息才得以公开。这也是防止补丁发布之前大批黑客得知这个漏洞并进行攻击。而自2011年12月31日,漏洞就已经存在,已经有报道表明漏洞消息发布之前曾有黑客利用Heartbleed进行攻击。
漏洞原理
TLS位于传输层和应用层之间,提供数据安全加密。TLS心跳指的是用户向服务器发送数据包,服务器返回一个相同的数据包以确定彼此在线,以支持持续通信功能。
用户向服务器发送的心跳数据中用两个字节表明有效负载数据长度,而服务器端OpenSSL将根据这个有效负载长度构造一个新的数据包会送给对端。
简单的说,服务器端得到数据包,数据包长度为plen_real,而数据包中包含一个字节表明有效负载数据长度plen_fake,数据包剩下的部分是有效负载数据,长度为plen_real-1。整个数据包存储在一个char型数组之中。而服务器端构造新数据包时,先分配一段plen_fake+1的内存空间,前两个字节存放plen_fake,之后使用memcpy从收到的数据包有效负载数据起始位置向新数据包拷贝plen_fake字节数据。正常情况下plen_fake = plen_real-1,当用户有意设置plen_fake大于实际有效负载长度plen_real-1时,服务器就会发送plen_fake长度的数据,其中包括plen_fake - plen_real-1长度的数据,这些数据可能是一些用户密码或者密钥。
#include<malloc.h> #include<stdio.h> #include<string.h> #define plen_real 5 //获得的数据包长度 int main(){ char other1[100] ;memset(other1,'E',100); char package_send[plen_real ] = {0xF,'d','a','t','a'};//获得的数据包 char other2[100] ;memset(other2,'E',100); char* pdata = package_send+1; int plen_fake = package_send[0]; char* package_return = (char*)malloc(plen_fake +1 );//新数据包 memcpy(package_return+1, pdata, plen_fake); printf("package data send:\n"); for(int i = 1;i<plen_real;i++) printf("%c",package_send[i]); printf("\n"); printf("package data send back:\n"); for(int i = 1;i<plen_fake +1;i++) printf("%c",package_return[i]); printf("\n"); return 0; }使用 ideone.com 在线编译器,选择c99标准,输出结果为:
package data send:
data
package data send back:
dataEEEEEEEEEEE
可以看到服务器返回了不当信息,可能包括用户密码、密钥等敏感信息。
上述描述为了简化,省去了数据包中的padding、type等字段信息,但原理是一样的。而有效负载数据长度plen_fake其实是用两个字节表示的,2^16 = 64k,这也是为什么最多会64kB泄露数据。
漏洞修复
修复方法很简单,只要在生成返回数据包之前检查plen_fake是否正确即可。
OpenSSL补丁采用的方式是如果plen_fake大小不对,默认此数据包为黑客发起的攻击,直接return不做回应。例如:
#include<malloc.h> #include<stdio.h> #include<string.h> #define plen_real 5 int main(){ char other1[100] ;memset(other1,'E',100); char package_send[plen_real ] = {0xF,'d','a','t','a'}; char other2[100] ;memset(other2,'E',100); char* pdata = package_send+1; int plen_fake = package_send[0]; //出错则认为用户恶意操作,不做应答 if(1 > plen_real ) return 1; if(1 + plen_fake > plen_real ) return 1; char* package_return = (char*)malloc(plen_fake +1 ); memcpy(package_return+1, pdata, plen_fake); printf("package data send:\n"); for(int i = 1;i<plen_real;i++) printf("%c",package_send[i]); printf("\n"); printf("package data send back:\n"); for(int i = 1;i<plen_fake +1;i++) printf("%c",package_return[i]); printf("\n"); return 0; }
OpenSSL补丁代码修改在这里。
SSL参考链接:
2、SSL协议详解
相关推荐
基于OpenSSL 1.0.1e源码的OpenSSL Heartbleed漏洞分析,赵凯,龙海旭,OpenSSL出现了名为Heartbleed的缓冲区溢出漏洞。OpenSSL是一套开放源代码的安全套接字层密码库,可实现基本的传输层数据加密功能。涉及金
分析了OpenSSL中心跳机制的源代码,在代码层次总结了HeartBleed漏洞产生的原因。采用Python语言实现了漏洞检测脚本工具,通过发送心跳信息长度与长度字段不一致的心跳数据包,并根据响应数据包的类型和响应数据的...
openssl-1.0.1g 的源码,已经修复了2014-4-8曝光的heartbleed(心脏出血)漏洞。
针对 Node.js 的 openssl Heartbleed 错误检查 检查结果 {"code":0,"data":"1803021003020ff0d8030253435b909d9b720bbc0cbc2b92a84897cfbd3904cc160a8503909..."} code: 0易受攻击。 (存在漏洞) code: 1不易受...
heartbleeder, OpenSSL CVE 2014 0160 Heartbleed漏洞测试 Heartbleeder为你的服务器测试 OpenSSL CVE-2014-0160 aka aka Heartbleed 。警告:不保证结果的准确性,你应该通过检查你的OpenSSL构建来独立检查它们。...
OpenSSL Heartbleed模块存在一个BUG,问题存在于ssl/dl_both.c文件中的心跳部分,当攻击者构造一个特殊的数据包,满足用户心跳包中无法提供足够多的数据会导致memcpy函数把SSLv3记录之后的数据直接输出,该漏洞导致...
OpenSSL "heartbleed" 的安全漏洞.在 heartbleed 的官网上有关于 CVE-2014-0160 漏洞的详细信息,这是关于 OpenSSL 的信息泄漏漏洞导致的安全问题。改 Heartbleed bug 可以让互联网的任何人读取系统保护内存,这种...
Openssl心血漏洞扫描工具
OpenSSL Heartbleed 漏洞影响版本分布 OpenSSL 高危漏洞分布(CVSS >= 9) 问题远不只OpenSSL 供应链问题远比想象的更复杂 标准、惯例带来的漏洞 2015 年:BadBarcode 2017 年:“应用克隆” 2018 年:“残迹重用” ...
使用 OpenSSL 漏洞提取服务器私钥。 注意:在大多数国家/地区将此工具指向其他人的服务器是非法的。 如何使用 $ npm install -g heartbleed.js $ heartbleed Options: --host [required] --port [default: 443] ...
最近放开了https服务,安全组扫描出新的漏洞,现对原OpenSSL 1.0.1g版本升级到OpenSSL 1.1.0k,同时重新编译OpenSSH及nginx,在此提供升级脚本,仅供参考
OpenSSL v1.0.1到1.0.1f的密码算法库中发现了一个非常严重bug(CVE-2014-0160),该bug允许攻击者...这个漏洞被认为是heartbleed,心脏流血,针对 “OpenSSL被曝存年度最严重安全漏洞” OpenSSL已经发布了1.0.1g修正bug。
openssl 心血漏洞测试和利用工具,安装python 2.7就可以世界运行了。修改bat运行命令就行了。不会的话给我留言或者去我博客看看
由于SSL协议是网络加密登陆认证、网络交易等的主流安全协议,而OpenSSL又是主流的SSL搭建平台...因此这些称呼好不为过,建议各网络服务提供者、管理机构和用户高度注意本漏洞的处理情况,希望广大用户做出相应的对策。
OpenSSL漏洞不仅影响以https开头的网站,黑客还可利用此漏洞直接对个人电脑发起"心脏出血"(Heartbleed)攻击。据分析,Windows上有大量软件使用了存在漏洞的OpenSSL代码库,可能被黑客攻击抓取用户电脑上的内存数据。
2.测试heartbleed漏洞的python文件:heartbleed CVE-2014-0160.rar 3.带ssl的apache安装文件:httpd-2.2.25-win32-x86-openssl-0.9.8y.msi官方网站上下载的 4.Win32_OpenSSL_v1.0.1b.exe这个是从google下载的(博文...
RHEL5.4下可成功将 openSSH 4.3 + openssl 0.98e 升级至 ...有效防止heartbleed漏洞攻击,无需更高的linux系统版本,已通过测试。 包内附所需要的安装包. configure过程中报错,请检查依赖包完整性。
CVE-2014-0160 OpenSSL数组越界访问漏洞(Heartbleed心脏滴血)
一夜之间,OpenSSL安全漏洞似乎人人自危。“本年度最严重的安全漏洞”、“互联网的心脏在流血”等等恐怖的字眼看起来吓人,而且到处充斥了流血的心脏的图片,仿佛互联网到了快要灭亡和崩溃的边缘。