OpenSSL心血漏洞分析「建议收藏」

OpenSSL心血漏洞分析「建议收藏」SSL是一种理论,而其具体实现,就有好多了,firefox有自己的实现,旧版本的chrome有自己的实现,Openssl也属于实现的一种。   该漏洞并不是协议上的漏洞,而是针对某个实现的漏洞,说简单点就是:代码写的烂或者考虑不全面。 受影响的OpenSSL版本:OpenSSL1.0.2-betaOpenSSL1.0.1-OpenSSL1.0.1f 

大家好,又见面了,我是你们的朋友全栈君。

    SSL 是一种理论,而其具体实现,就有好多了,firefox有自己的实现,旧版本的chrome有自己的实现,Openssl也属于实现的一种。

 

    漏洞并不是协议上的漏洞,而是针对某个实现的漏洞,说简单点就是:代码写的烂或者考虑不全面。

 

受影响的OpenSSL版本:

OpenSSL 1.0.2-beta

OpenSSL 1.0.1 – OpenSSL 1.0.1f

 

1:为什么叫 心血漏洞

    SSL有一个特性,相当于TCPkeepalive 特性,即一端发送特定的报文到对端,如果对端收到,并且回复,就表示对方未断开连接,并且自己也不会断开连接。

 

该功能的英文名叫做:Heartbeat ,发现漏洞的人称这个漏洞为Heartbleed,翻译成中文就叫心血漏洞。

 

该功能在RFC 6520中详细描述,主要讲解了一些报文格式。


2:心血漏洞原理

简要概述就是说,OpenSSL在解析 对端发送的Heartbeat 请求报文的时候没有判断边界值。

我们先来看看Heartbeat 请求报文格式:

OpenSSL心血漏洞分析「建议收藏」


第一部分 类型 Content type

第二部分 协议版本 Version 

第三部分 长度 Length

Length指定了后面数据的长度。


而Length 指定的数据(即上图中的Encrypted Heartbeat Mesaage) 包括2部分:
1:序号
2:填充
协议要求,Heartbeat 响应的序号,必须和Heartbeat  请求的序号相同,padding是随机值。

但是我们看看openssl是怎么解这个报文的:

OpenSSL心血漏洞分析「建议收藏」


    开始时,p 指向的是read_buf,OpenSSL的流程就是解析这个报文。

    提取 报文 中 Length 字段, 赋值到payload中,并未判断报文 后面的长度是否是 Length 指定的长度。因为客户端可能指定了payload 长度是0x4000,而后面的实际数据起始就1个字节。到目前为止,还未出现致命的信息泄露问题。

紧接着,准备构造Heartbeat 响应:

OpenSSL心血漏洞分析「建议收藏」


    上面说过,根据协议要求,Heartbeat 响应的序号,必须和Heartbeat  请求的序号相同
    OpenSSL为了图方便,直接把 Heartbeat 请求报文拷贝过来了(因为请求报文中存在自己需要的序号)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    P1 指向了read_buf的payload,OpenSSL直接从read_buf中的payload起始处拷贝了payload 长度的数据到字节的write_buf。

    read_buf一共也就16k长度,如果客户端故意写的payload 是64k,那么很显然,OpenSSL进程空间的(64k-16k)的内存(可能是会话结构体中的其他字段,包括存放私钥等其他私密信息的内存)透露给客户端了。


3:OpenSSL对该问题的修复如下

OpenSSL心血漏洞分析「建议收藏」

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

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

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


相关推荐

  • python的第三方库是用什么实现的_python 第三方库

    python的第三方库是用什么实现的_python 第三方库编写自己的第三方库当你看见你编程时所用到的所有Python第三方库时,有没有想过,他们是怎么被允许使用的呢?这篇教程,帮你制作一个属于自己的第三方库!1.你需要的工具pycharmsetuptools库twine库2.详细步骤首先,打开pycharm,新建一个项目然后选择编译器Virtualenv,新建一个虚拟环境等待虚拟环境创建完成,如果默认存在main.py,就删除它然后,新建一个pythonpackage文件夹,取名为你要上传的库的名字创建后,文件夹中默认有__init__

    2022年8月31日
    1
  • 【Java面试】第二章:P5级面试

    HashMap底层原理,扩容机制,jdk8以后会使用红黑树优化?红黑树和二叉平衡树的区别,红黑树和B树,B+树的区别,Mysql二大引擎索引底层实现,HashMap在多线程环境中为何出错?ConcurrentHashMap底层实现,CAS,原子引用,ABA问题,volatile,如何解决HashMap出现的OOM问题?(WeakHashMap)HashMap是Map的一个实现类,它是以键值对存储数据的,Key-Value都是Map.Entry中的属性。当我们向HashMap中存放一个元素(k1,v1)

    2022年4月17日
    47
  • js添加事件和移除事件:addEventListener()与removeEventListener()

    js添加事件和移除事件:addEventListener()与removeEventListener()作用:   addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作。   它们都接受3个参数:事件名、事件处理的函数和布尔值。   布尔值参数是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。示例:环境:移动端,界面禁止触摸事件要在bo

    2022年7月12日
    42
  • @RestController的作用「建议收藏」

    @RestController的作用「建议收藏」原文:文章收藏于IT老兵博客。正文理解一下@RestControlle的作用。ThiscodeusesSpring4’snew @RestController annotation,whichmarkstheclassasacontrollerwhereeverymethodreturnsadomainobjectinsteadofa…

    2022年6月17日
    39
  • wxPython树控件

    wxPython树控件

    2021年11月22日
    22
  • a b在java中的意思是什么意思_java中”a=”+a “b=”+b是什么意思?

    a b在java中的意思是什么意思_java中”a=”+a “b=”+b是什么意思?展开全部1、在JAVA程序中由String和“+”参与的运算变量都会被转为字符类型,可以理解为先把32313133353236313431303231363533e4b893e5b19e31333335313237变量转为字符型然后在进行字符拼接。publicclassTest{publicstaticvoidmain(String[]args){intintnum=9;lon…

    2022年7月8日
    33

发表回复

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

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