OpenSSL的Heartbleed漏洞原理及简单模拟
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漏洞原理及简单模拟相关推荐
- SSL,TLS协议与OpenSSL 心血heartbleed漏洞之伤
一声惊雷,今天爆出了一个关于SSL协议的惊天大漏洞,在用完各种poc工具后,我们不妨来深入了解下这个高危漏洞的机理. 不管你是用网上公布的检测网站还是各个QQ群疯传的poc 脚本,知其然还要知其所以然 ...
- Tomcat工作原理及简单模拟实现
Tomcat应该都不陌生,我们经常会把写好的代码打包放在Tomcat里并启动,然后在浏览器里就能愉快的调用我们写的代码来实现相应的功能了,那么Tomcat是如何工作的? 一.Tomcat工作原理 我们 ...
- 【文件包含漏洞-02】文件包含漏洞原理、简单测试实例以及空字符绕过实例
目录 1 文件包含漏洞 1.1 文件包含漏洞概述 1.2 文件包含漏洞的形成原因/条件 1.3 危害 2 文件包含漏洞简单测试实例 2.1 测试环境 2.2 实例一:本地文件包含 2.3 实例二:远程 ...
- 用Java来实现区块链原理并简单模拟开发一个小工具
前几天心血来潮,用Java模拟实现了一个区块链小工具,该工具是单机版的,没有实现联网功能,属于是单节点的工具,但是对于区块链的核心wk逻辑功能都实现了,如:wk.钱包.转账.记账等功能.界面实现用到了 ...
- Dirty COW漏洞原理与简单利用
我将分为3个部分进行介绍,包括:漏洞的概述,漏洞的成因以及漏洞的利用. 首先是漏洞概述: Dirty COW漏洞是一种发生在写时复制的竞态条件漏洞,它影响所有基于Linux的操作系统,包括Androi ...
- 【转载】升级OpenSSL修复高危漏洞Heartbleed
背景: OpenSSL全称为Secure Socket Layer,是Netscape所研发,利用数据加密(Encryption)作技术保障在Internet上数据传输的安全.可确保数据 ...
- 升级OpenSSL修复高危漏洞Heartbleed
升级OpenSSL修复高危漏洞Heartbleed 背景: OpenSSL全称为Secure Socket Layer.是Netscape所研发.利用数据加密(Encryption) ...
- openssl HeartBleed漏洞复现
简介: 心脏滴血漏洞于2014年被爆出,攻击者可以通过构造特殊的数据包,远程读取特定服务器内存中64K的数据,获取内存中的敏感信息.因openssl应用广泛,故影响较大. 原理: 1. 什么是SSL? ...
- OPenSSL漏洞原理与安全加固
openSSL漏洞原理及安全加固 2014年4月8日晚,互联网爆出了又一重量级安全漏洞,即CVE-2014-0160,通俗来讲就是OpenSSL出现了安全漏洞. 说这个漏洞前,先介绍一下OpenSSL ...
最新文章
- CSS3 overflow-x 属性
- Linux下获取详细硬件信息的工具:Dmidecode命令详解
- 这 9 个 Java 开源项目 yyds,你知道几个?
- 服务器上的电脑登不上oracle,Oracle服务器改计算机名后报错之解决方法
- Magento教程 12:Magento快速上传大量商品的方法
- mysql 内置存储过程_mysql 内置存储过程
- [转载] python中sort()与sorted()
- Android源码中常用的系统广播
- 配置绿色版的editplus
- 【期刊会议系列】IEEE系列模板下载指南
- 手把手教你使用R语言绘制交互效应的森林图
- k8s之四层负载均衡Service:概念、原理解读
- redis rce漏洞安全_从重新定位到RCE:我从广告到网络安全的旅程
- 如何区分VR、AR和MR
- 让你的发动机与NXP Kinetis汽车套件一起运行---凯利讯半导体
- Python 3 显示图像的方法
- MUR2060AC-ASEMI快恢复二极管MUR2060AC
- 小米手机升级MIUI11后,要记得关闭这4个按钮,不然电池就会不耐用
- WebInspect
- mybatis-generator-gui 一款 mybatis generator 的图形界面工具
热门文章
- python开发mes系统_MES系统开发
- 【java基础知识】JDK环境下载安装过程(windows环境/Linux环境)+IDEA配置
- Latex编译pdf后的字体嵌入问题
- 多页面之间传递数据的方法
- mongodb更新操作符$unset
- 中学计算机教学叙事范文,初中地理教育叙事范文
- 设置go path_Go命令的PATH安全性
- 汇编语言中xor指令_汇编语言XOR指令:对两个操作数进行逻辑(按位)异或操作...
- java代码实际_Java 8会给你的代码带来什么:一个实际的例子
- python实现不重复排列组合_python之itertools的排列组合相关