“心脏出血”(Heartbleed)被称为互联网史上最严重的安全漏洞之一,波及了大量常用网站、服务,包括很多人每天都在用的 Gmail 等等,可能导致用户的密码、信用卡轻易泄露。但是我们可能对它还不是很了解,可能觉得,这不关我事。

我随便找了个规模还算比较大的网站(域名就不说了),然后在调试器里看看返回信息:

 

可以看到,这个网站的服务器也用了OpenSSL。其实 OpenSSL 的使用率还是挺高的,如果你经常上网,那么可以说,你几乎每天都在跟 OpenSSL 打交道,你的各种个人信息存储在各种各样的网站上,一旦某个网站因为 Heartbleed 泄漏了你的重要信息,比如信用卡,银行卡什么的,那么可能你就会因此有所损失。

好奇的人们或许更想知道OpenSSL的程序员到底犯了什么错误,好在有 xkcd 这样的geek网站,用最最通俗易懂的方式,向大家展示了这个漏洞的原理:

 

正好煎蛋那边有翻译:

 

所谓heartbleed的说法,源自于「心跳检测」,就是用户发通过起TSL 加密链接,发起 Client Hello询问,测服务器是否正常在线干活(形象的比喻就是心脏脉搏),服务器发回Server hello,表明正常建立SSL通信。每次询问都会附加一个询问的字符长度pad length,bug来了,如果这个pad length大于实际的长度,服务器还是会返回同样规模的字符信息,于是造成了内存里信息的越界访问……

漫画里,用户meg请求返回 “HAT 五百个字母”,然后色服器返回了内存中包括HAT之后的前500个字,也就是说伺服器将 “五百个字母” 这句话理解为了 显示500个字母 然后将其他人在同时伺服器里操作的前500个字母返回给meg看,而这里面包含很多私密信息。

看起来这个内存泄露越界BUG很2吗?

那么在代码层面再看看?假设心跳信息结构体定义为:

struct hb {
int type;
int length;
unsigned char *data;
};

type为心跳的类型,length为data的大小,其中关于data字段的内容结构为:

type字段占一个字节,payload字段占两个字节,其余的为payload的具体内容,详情如下所示:

字节序号 备注
0 type
1-2 data中具体的内容的大小为payload
3-len 具体的内容pl

当服务器收到消息后,会对该消息进行解析,也就是对data中的字符串进行解析,通过解析第0位得到type,第1-2位得到payload,接着申请(1+2+payload)大小的内存,然后再将相应的数据拷贝到该新申请的内存中。

以下举个简单的示例来说明该问题,假如客户端发送的data数据为"006abcdef",那么服务器端解析可以得到type=0, payload=06, pl='abcdef',申请(1+2+6=9)大小的内存,然后再将type, payload, pl写到新申请的内存中。

如果大家都是老实人,那么上述流程不会出现任何问题。可是世界上总是存在着那么多不“安分”的人,他们会非常的不诚实,比如客户端发送的字符串“abcdef”明明只有6个,而我非得把payload设置为500,如果服务器傻不拉几的不做任何边界检查,直接申请(1+2+500)大小内存,而且更过分的是还把"abcdef********"所有的内容拷贝到新申请的内存处,并发回给客户端。

这样那些不安分的人就获得了服务器上很多非常敏感的信息,这些信息可能包括银行帐号信息,电子交易信息等等诸多安全信息。

当然真实的结构体定义是这样的:

typedef struct ssl3_record_st
{
int type; /* type of record */
unsigned int length; /* How many bytes available */
unsigned int off; /* read/write offset into 'buf' */
unsigned char *data; /* pointer to the record data */
unsigned char *input; /* where the decode bytes are */
unsigned char *comp; /* only used with decompression - malloc()ed */
unsigned long epoch; /* epoch number, needed by DTLS1 */
unsigned char seq_num[8]; /* sequence number, needed by DTLS1 */
} SSL3_RECORD;

每条SSLv3记录中包含一个类型域(type)、一个长度域(length)和一个指向记录数据的指针(data)。

在 dtls1_process_heartbeat 里有这样的语句:

/* Read type and payload length first */
hbtype = *p++;
n2s(p, payload);
pl = p;

SSLv3记录的第一个字节标明了心跳包的类型。宏n2s从指针p指向的数组中取出前两个字节,并把它们存入变量payload中——这实际上是心跳包载荷的长度域(length)。注意程序并没有检查这条SSLv3记录的实际长度。变量pl则指向由访问者提供的心跳包数据。

经常看到很多漏洞利用工具命名变量时,都会使用变量名payload,莫非 OpenSSL 的编写者也经常搞漏洞之类的东西么?

这次OpenSSL HeartBleed漏洞是怎么一回事呢?的更多相关文章

  1. CentOS修复“OpenSSL Heartbleed漏洞”方法

    转载 http://www.coolhots.net/article/229.shtml

  2. OpenSSL重大漏洞-Heartbleed之漏洞利用脚本POC讲解

    OpenSSL Security Advisory [07 Apr 2014] ======================================== TLS heartbeat read ...

  3. OpenSSL Heartbleed “心脏滴血”漏洞简单攻击示例

    OpenSSL Heartbleed漏洞的公开和流行让许多人兴奋了一把,也让另一些人惊慌了一把. 单纯从攻击的角度讲,我已知道的,网上公开的扫描工具有: 1.  Nmap脚本ssl-heartblee ...

  4. OpenSSL Heartbleed "心脏滴血"漏洞简单攻击示例

    转自:http://www.lijiejie.com/openssl-heartbleed-attack/ OpenSSL Heartbleed漏洞的公开和流行让许多人兴奋了一把,也让另一些人惊慌了一 ...

  5. OpenSSL Heartbleed原因小结

    User发送心跳报文给Server,Server复制心跳报文的内容回应User. memcpy(bp, p1, payload); Server拷贝心跳报文的内容给Client时,如果拷贝的字节数目超 ...

  6. OpenSSL 安全漏洞: heartbleed

    Heartbleed 是 2014年4月7日被广泛报道的一个 OpenSSL 安全漏洞,号称是灾难. 利用它能读取服务器上最多64k的内存,只要该服务器可以通过ssl连接.   Heartbleed ...

  7. [漏洞复现] [Vulhub靶机] OpenSSL Heartbleed Vulnerability (CVE-2014-0160)

    免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责. 0x00 背景知识 传输层安全协议SSL 安全套接字协议SSL(Secure Sockets Layer),及其继任者传输层安 ...

  8. 汉澳sinox不受openssl心血漏洞影响并分析修复其漏洞代码

    OpenSSL 心血(HeartBleed)漏洞 是openssl 在 2014-04-07 发布的重大安全漏洞(CVE-2014-0160)这个漏洞使攻击者可以从server内存中读取64 KB的数 ...

  9. heartbleed漏洞利用

    1.  heartbleed漏洞扫描: 2.  heartbleed漏洞利用: poc.py      117.52.93.111 貌似没有打到管理员账号密码,可能是管理员没登录,其实,可以写一个自动 ...

随机推荐

  1. SVN配置自启动-1053错误

    主要内容:解决启动“配置的svn自启动服务”报1053错误 1. 环境: 系统: wind10 svn服务端版本: VisualSVN-Server-3.8.0-x64 2. 配置自启动 以管理员身份 ...

  2. Str_turn

    public class Str_turn { public static void main(String args[]) { String Str1 = new String("This ...

  3. 你真的了解React吗

    https://zhufengzhufeng.github.io/zhufengreact/index.html#t21.%E4%BB%80%E4%B9%88%E6%98%AFReact?

  4. FPGA数字鉴相鉴频器的开发记录

    1. 对于电机的锁相控制,需要对相差进行PI性质的环路滤波,但现有的锁相环中鉴频鉴相器输出为相差脉冲而非数字量,难以直接进行PI特性的环路滤波. 通过对晶振的非整数分频获取准确的参考时钟,基于触发器机 ...

  5. Linux下Expect 完成自动输入密码

    今天要开发一个定时任务,然后加入cron列表中.但是有个问题摆在眼前,脚本的执行中需要输入数据库密码(貌似5.1版本以上不允许在-p后直接加密码,会报错) mysql -u root -p <& ...

  6. Qt 隐藏标题栏可移动升级版

    在最出的时候,在Qt程序隐藏标题栏的情况下,实现界面可拖拽移动,是鼠标在在程序界面的任意位置都可以,现在这个版本是需要鼠标在程序界面的特定位置开可以 上代码 static QPoint last(0, ...

  7. (vue01)vue环境搭建

    腾讯,百度,网易....这么大媒体平台咋老推送这么lower的信息? 你们不缺钱啊....我这么善良的孩子都别你们带坏了 强烈鄙视马化腾 强烈鄙视李彦宏 参考地址: https://segmentfa ...

  8. CSS实现自适应下保持宽高比

    在项目中,我们可能经常使得自己设计的网页能自适应.特别是网站中的图片,经常要求在网页放大(或缩小)时,宽高同时放大(或缩小),而且不变形(即保持正常的长宽比).为了不变形,常用的方法就是设置width ...

  9. Web负载均衡技术

    Web负载均衡(Load Balancing),简单地说就是给我们的服务器集群分配“工作任务”,而采用恰当的分配方式,对于保护处于后端的Web服务器来说,非常重要. 负载均衡的策略有很多,我们从简单的 ...

  10. linux备忘录-shell脚本

    知识 shell执行方式 shell执行方式有 通过source或. 在现在的bash环境中执行脚本 变量等会保持 通过bash shell.sh或sh shell.sh 使用一个新的bash环境执行 ...