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

OpenSSL的Heartbleed漏洞原理及简单模拟Heartbleed漏洞自从Heartbleed漏洞曝光以来,网上能看到很多相关的文章,但大部分都是写的云里雾里,本文尝试直观明了的对漏洞原理进行说明及模拟。OpenSSL是SSL协议以及一系列加密算法的开源实现,使用C语言编写。OpenSSL采用Apache开源协议,可以免费用于商业用途,在很多linux发行版和服务器中得到广泛应用。OpenSSL出现漏洞造成的影响是巨大的,Heartb

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159920.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 三极管典型开关电路

    三极管典型开关电路1.基极必须串接电阻,保护基极,保护CPU的IO口。2.基极根据PNP或者NPN管子加上拉电阻或者下拉电阻。3.集电极电阻阻值根据驱动电流实际情况调整。同样基极电阻也可以根据实际情况调整。4.基极和发射极需要并联电阻,该电阻的作用是在输入呈高阻态时使晶体管可靠截止,极小值是在前级驱动使晶体管饱和时与基极限流电阻分压后能够满足晶体管的临界饱和,实际选择时会大大高于这个极小值,

    2022年9月15日
    2
  • pycharm更改环境_pycharm配置环境变量

    pycharm更改环境_pycharm配置环境变量我们在使用pycharm创建项目的时候我们可以直接选择创建项目在什么环境之上。但是大多时候我们都是直接在别人的工作上进行二次开发,所以这时候就涉及直接打开代码,这就需要我们自行调整Python环境0.准备工作1.你需要有Python环境,我这里使用的是anaconda配置的虚拟环境1.代码提示和动态解析的设置这一步决定你写代码的时候是不是会报错,是不是能给出代码提示。首先我们直接File–》Settings直接熟练的打开设置:之后我们直接按照下图,找到调整环境的位置按照你的实际情况,选

    2022年8月28日
    2
  • Ubuntu16.04安装_vs安装路径

    Ubuntu16.04安装_vs安装路径TableofContents一、前言二、安装过程1、下载VSCode2、安装过程3、下载C++模块4、汉化5、常用快捷键一、前言因为要用到在ubuntu系统中使用VSCode来编写C++代码,在此分享VSCode的安装过程。之前我们讲了如何制作U盘启动盘,如何安装双系统,如何安装谷歌浏览器等,如果不了解的同学请看我的分类[操作系统]:操…

    2022年9月18日
    4
  • 盗取QQ密码的顽固的IEXPLORE.EXE病毒

    盗取QQ密码的顽固的IEXPLORE.EXE病毒立刻加入博客人自己的广告网现象: 开机以后不久,在进程里面会出现多个IEXPLORE.EXE进程,用户名都是SYSTEM,杀掉进程之后,过一段时间就会重新启动这个进程。而且IEXPLORE.EXE进程的cpu占用率常常达到100%!计算机根本就无法使用。在进行拨号连网后,系统可能出现重起.甚是恼人!此病毒自动禁用某些杀毒软件,看来全面手工杀毒的时代即将来临!查杀方法:此病

    2022年7月20日
    27
  • Java培训机构排名前十_ui培训机构

    Java培训机构排名前十_ui培训机构02JVM线程JVM内存区域JVM运行时内存垃圾回收与算法JAVA四种引用类型GC分代收集算法VS分区收集算法GC垃圾收集器JAVAIO/NIOJVM类加载器03JAVA集合接口继承关系和实现LISTSETMAP04JAVA多线程并发JAVA并发知识库JAVA线程实现/创建方式4种线程池线程生命周期(状态)终止线程4种方式sleep与wait区别start与run区别JAVA后台线程JAVA锁线程基本方法线程上下文切换同步锁与死

    2022年10月3日
    2
  • IO编程

    IO编程是什么?    IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。    比如你打开浏览器,访问新浪首页,浏览器这个程序就需要通过网络IO获取新浪的网页。浏览器首先会发送数据给新浪服务器,告诉它我想要首页的HTML,这个动作是往外发数据,叫O

    2022年4月27日
    54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号