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补丁代码修改在这里:链接。

转载请注明作者Focustc、出处(blog.csdn.net/caozhk/article/details/23738971)

OpenSSL的Heartbleed漏洞原理及简单模拟相关推荐

  1. SSL,TLS协议与OpenSSL 心血heartbleed漏洞之伤

    一声惊雷,今天爆出了一个关于SSL协议的惊天大漏洞,在用完各种poc工具后,我们不妨来深入了解下这个高危漏洞的机理. 不管你是用网上公布的检测网站还是各个QQ群疯传的poc 脚本,知其然还要知其所以然 ...

  2. Tomcat工作原理及简单模拟实现

    Tomcat应该都不陌生,我们经常会把写好的代码打包放在Tomcat里并启动,然后在浏览器里就能愉快的调用我们写的代码来实现相应的功能了,那么Tomcat是如何工作的? 一.Tomcat工作原理 我们 ...

  3. 【文件包含漏洞-02】文件包含漏洞原理、简单测试实例以及空字符绕过实例

    目录 1 文件包含漏洞 1.1 文件包含漏洞概述 1.2 文件包含漏洞的形成原因/条件 1.3 危害 2 文件包含漏洞简单测试实例 2.1 测试环境 2.2 实例一:本地文件包含 2.3 实例二:远程 ...

  4. 用Java来实现区块链原理并简单模拟开发一个小工具

    前几天心血来潮,用Java模拟实现了一个区块链小工具,该工具是单机版的,没有实现联网功能,属于是单节点的工具,但是对于区块链的核心wk逻辑功能都实现了,如:wk.钱包.转账.记账等功能.界面实现用到了 ...

  5. Dirty COW漏洞原理与简单利用

    我将分为3个部分进行介绍,包括:漏洞的概述,漏洞的成因以及漏洞的利用. 首先是漏洞概述: Dirty COW漏洞是一种发生在写时复制的竞态条件漏洞,它影响所有基于Linux的操作系统,包括Androi ...

  6. 【转载】升级OpenSSL修复高危漏洞Heartbleed

    背景:        OpenSSL全称为Secure Socket Layer,是Netscape所研发,利用数据加密(Encryption)作技术保障在Internet上数据传输的安全.可确保数据 ...

  7. 升级OpenSSL修复高危漏洞Heartbleed

    升级OpenSSL修复高危漏洞Heartbleed 背景:          OpenSSL全称为Secure Socket Layer.是Netscape所研发.利用数据加密(Encryption) ...

  8. openssl HeartBleed漏洞复现

    简介: 心脏滴血漏洞于2014年被爆出,攻击者可以通过构造特殊的数据包,远程读取特定服务器内存中64K的数据,获取内存中的敏感信息.因openssl应用广泛,故影响较大. 原理: 1. 什么是SSL? ...

  9. OPenSSL漏洞原理与安全加固

    openSSL漏洞原理及安全加固 2014年4月8日晚,互联网爆出了又一重量级安全漏洞,即CVE-2014-0160,通俗来讲就是OpenSSL出现了安全漏洞. 说这个漏洞前,先介绍一下OpenSSL ...

最新文章

  1. CSS3 overflow-x 属性
  2. Linux下获取详细硬件信息的工具:Dmidecode命令详解
  3. 这 9 个 Java 开源项目 yyds,你知道几个?
  4. 服务器上的电脑登不上oracle,Oracle服务器改计算机名后报错之解决方法
  5. Magento教程 12:Magento快速上传大量商品的方法
  6. mysql 内置存储过程_mysql 内置存储过程
  7. [转载] python中sort()与sorted()
  8. Android源码中常用的系统广播
  9. 配置绿色版的editplus
  10. 【期刊会议系列】IEEE系列模板下载指南
  11. 手把手教你使用R语言绘制交互效应的森林图
  12. k8s之四层负载均衡Service:概念、原理解读
  13. redis rce漏洞安全_从重新定位到RCE:我从广告到网络安全的旅程
  14. 如何区分VR、AR和MR
  15. 让你的发动机与NXP Kinetis汽车套件一起运行---凯利讯半导体
  16. Python 3 显示图像的方法
  17. MUR2060AC-ASEMI快恢复二极管MUR2060AC
  18. 小米手机升级MIUI11后,要记得关闭这4个按钮,不然电池就会不耐用
  19. WebInspect
  20. mybatis-generator-gui 一款 mybatis generator 的图形界面工具

热门文章

  1. python开发mes系统_MES系统开发
  2. 【java基础知识】JDK环境下载安装过程(windows环境/Linux环境)+IDEA配置
  3. Latex编译pdf后的字体嵌入问题
  4. 多页面之间传递数据的方法
  5. mongodb更新操作符$unset
  6. 中学计算机教学叙事范文,初中地理教育叙事范文
  7. 设置go path_Go命令的PATH安全性
  8. 汇编语言中xor指令_汇编语言XOR指令:对两个操作数进行逻辑(按位)异或操作...
  9. java代码实际_Java 8会给你的代码带来什么:一个实际的例子
  10. python实现不重复排列组合_python之itertools的排列组合相关