`

OpenSSL的Heartbleed漏洞原理及简单模拟

 
阅读更多

 

转自  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参考链接:
 
分享到:
评论

相关推荐

    论文研究-基于OpenSSL 1.0.1e源码的OpenSSL Heartbleed漏洞分析 .pdf

    基于OpenSSL 1.0.1e源码的OpenSSL Heartbleed漏洞分析,赵凯,龙海旭,OpenSSL出现了名为Heartbleed的缓冲区溢出漏洞。OpenSSL是一套开放源代码的安全套接字层密码库,可实现基本的传输层数据加密功能。涉及金

    openssl-1.0.1g heartbleed漏洞已经修复

    **OpenSSL 1.0.1g 与 Heartbleed 漏洞修复详解** OpenSSL 是一个开源的加密库,广泛应用于各种网络服务,包括 HTTPS、SMTPS 和 FTPS 等,为互联网提供了安全通信的基础。在2014年4月8日,一个重大的安全漏洞被曝光...

    heartbleed.js:openssl Heartbleed bug(CVE-2014-0160) 检查 Node.js

    针对 Node.js 的 openssl Heartbleed 错误检查 检查结果 {"code":0,"data":"1803021003020ff0d8030253435b909d9b720bbc0cbc2b92a84897cfbd3904cc160a8503909..."} code: 0易受攻击。 (存在漏洞) code: 1不易受...

    heartbleeder, OpenSSL CVE 2014 0160 Heartbleed漏洞测试.zip

    heartbleeder, OpenSSL CVE 2014 0160 Heartbleed漏洞测试 Heartbleeder为你的服务器测试 OpenSSL CVE-2014-0160 aka aka Heartbleed 。警告:不保证结果的准确性,你应该通过检查你的OpenSSL构建来独立检查它们。...

    OpenSSL_HeartBleed_POC_Pcap

    OpenSSL Heartbleed模块存在一个BUG,问题存在于ssl/dl_both.c文件中的心跳部分,当攻击者构造一个特殊的数据包,满足用户心跳包中无法提供足够多的数据会导致memcpy函数把SSLv3记录之后的数据直接输出,该漏洞导致...

    4月8日openssl漏洞补丁[heart-bleed][CentOS6][RedHat 6]

    OpenSSL "heartbleed" 的安全漏洞.在 heartbleed 的官网上有关于 CVE-2014-0160 漏洞的详细信息,这是关于 OpenSSL 的信息泄漏漏洞导致的安全问题。改 Heartbleed bug 可以让互联网的任何人读取系统保护内存,这种...

    OpenSSL漏洞简述与网络检测方法

    2014年4月7日,OpenSSL 发布了一个重要的安全公告,揭示了一个名为CVE-2014-0160的严重漏洞,后来被称为"心脏出血"(Heartbleed)漏洞。此漏洞存在于OpenSSL 1.0.1f和1.0.2-beta版本的Heartbeat扩展模块中,由于代码...

    Openssl心血漏洞扫描工具CSHeartbleedScanner

    **OpenSSL 心血漏洞(Heartbleed Bug)详解** OpenSSL 是一个强大的安全套接层(SSL/TLS)加密库,广泛应用于互联网服务器,确保数据传输的安全性。然而,在2014年,OpenSSL 发现了一个重大安全漏洞,被称为“心血...

    openssl 心血漏洞测试和利用工具(注意不是坑人的16K版本)

    然而,在2014年,一个名为“心脏滴血”(Heartbleed)的重大安全漏洞被公开,其正式编号为 CVE-2014-0160。这个漏洞是由于OpenSSL库中的一个编程错误导致的,影响了使用特定版本的 OpenSSL 的服务器和客户端。 **...

    heartbleed:Heartbleed 漏洞 | 免费翻译

    **Heartbleed漏洞原理** Heartbeat扩展允许双方(服务器和客户端)在TLS连接保持活跃时发送心跳消息,以验证对方是否仍然在线。在OpenSSL 1.0.1至1.0.1f版本中,一个缓冲区溢出问题导致了Heartbleed。当心跳响应...

    openssl 心血漏洞测试和利用工具

    然而,在其历史发展中,OpenSSL 曾出现过一些重大安全漏洞,其中之一便是被称为“心脏出血”(Heartbleed)的漏洞。 “心脏出血”漏洞是 OpenSSL 在 2014 年发现的一个严重安全问题,主要存在于 OpenSSL 的 TLS/...

    无人独善其身_——安全问题的行业化.pdf

    OpenSSL Heartbleed 漏洞影响版本分布 OpenSSL 高危漏洞分布(CVSS &gt;= 9) 问题远不只OpenSSL 供应链问题远比想象的更复杂 标准、惯例带来的漏洞 2015 年:BadBarcode 2017 年:“应用克隆” 2018 年:“残迹重用” ...

    heartbleed:使用 Heartbleed OpenSSL 漏洞提取服务器私钥

    使用 OpenSSL 漏洞提取服务器私钥。 注意:在大多数国家/地区将此工具指向其他人的服务器是非法的。 如何使用 $ npm install -g heartbleed.js $ heartbleed Options: --host [required] --port [default: 443] ...

    检测网站是否存在OpenSSL漏洞的测试脚本

    然而,OpenSSL 在其历史版本中曾出现过一些重要的安全漏洞,其中最著名的包括“心脏出血”(Heartbleed)漏洞。本测试脚本`openssl.py`就是为了检测网站是否受到这些OpenSSL漏洞的影响而设计的。 首先,我们要理解...

    OpenSSL漏洞修补方法

    OpenSSL v1.0.1到1.0.1f的密码算法库中发现了一个非常严重bug(CVE-2014-0160),该bug允许攻击者...这个漏洞被认为是heartbleed,心脏流血,针对 “OpenSSL被曝存年度最严重安全漏洞” OpenSSL已经发布了1.0.1g修正bug。

    解决OpenSSL "SSL-Death-Alert" 拒绝服务漏洞(CVE-2016-8610)安全漏洞,升级OpenSSL到OpenSSL 1.1.0k

    最近放开了https服务,安全组扫描出新的漏洞,现对原OpenSSL 1.0.1g版本升级到OpenSSL 1.1.0k,同时重新编译OpenSSH及nginx,在此提供升级脚本,仅供参考

    OpenSSL“心血”漏洞检测及修复指南

    ### OpenSSL“心血”漏洞检测及修复指南 #### 一、心血漏洞概述 心血漏洞(Heartbleed Bug)是2014年在广泛使用的开源安全软件库OpenSSL中发现的一个严重安全漏洞。该漏洞允许攻击者通过利用OpenSSL实现的心跳功能...

    Windows x64 的 Openssl 1.1.1 安装包msi

    OpenSSL漏洞不仅影响以https开头的网站,黑客还可利用此漏洞直接对个人电脑发起"心脏出血"(Heartbleed)攻击。据分析,Windows上有大量软件使用了存在漏洞的OpenSSL代码库,可能被黑客攻击抓取用户电脑上的内存数据。

Global site tag (gtag.js) - Google Analytics