前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >CVE-2014-0160-OpenSSL TLS 数组越界访问漏洞(“心脏出血”漏洞)

CVE-2014-0160-OpenSSL TLS 数组越界访问漏洞(“心脏出血”漏洞)

作者头像
用户1423082
发布2024-12-31 18:33:58
发布2024-12-31 18:33:58
7400
代码可运行
举报
文章被收录于专栏:giantbranch's bloggiantbranch's blog
运行总次数:0
代码可运行

由于这个是开源的,直接源码对比 https://bugzilla.redhat.com/attachment.cgi?id=883475&action=diff

修复的另外一处也差不多

两处都对s->s3->rrec.length进行了判断

这个rrec结构如下:

代码语言:javascript
代码运行次数:0
复制
typedef struct ssl3_record_st
	{
/*r */	int type;               /* type of record */
/*rw*/	unsigned int length;    /* How many bytes available */
/*r */	unsigned int off;       /* read/write offset into 'buf' */
/*rw*/	unsigned char *data;    /* pointer to the record data */
/*rw*/	unsigned char *input;   /* where the decode bytes are */
/*r */	unsigned char *comp;    /* only used with decompression - malloc()ed */
/*r */  unsigned long epoch;    /* epoch number, needed by DTLS1 */
/*r */  unsigned char seq_num[8]; /* sequence number, needed by DTLS1 */
	} SSL3_RECORD;

length(心跳包的长度)是用户可控的,而payload(也是储存长度)是也是用户可控的,那么当payload长度大于心跳包的长度,那么就可以读取内存中心跳包后面的数据了

我们看看泄露这一步,首先是是malloc的大小,复制的大小都是payload这个变量

代码语言:javascript
代码运行次数:0
复制
buffer = OPENSSL_malloc(1 + 2 + payload + padding);   //分配内存
bp = buffer;    //buffer即bp

/* Enter response type, length and copy payload */
*bp++ = TLS1_HB_RESPONSE;
s2n(payload, bp);
memcpy(bp, pl, payload);   //复制到bp
bp += payload;
/* Random padding */
RAND_pseudo_bytes(bp, padding);

r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding); //将前面复制到bp的数据,写到s结构的特定变量返回到用户(因为buffer就是bp)

那么这个就可以越界读取内存的信息,可能读取到密码什么的

再说说SSL3_RT_MAX_PLAIN_LENGTH那个,SSL3_RT_MAX_PLAIN_LENGTH在源码中找到是16384,所以这里的判断应该不是最重点,这个限制了最大长度

代码语言:javascript
代码运行次数:0
复制
#define SSL3_RT_MAX_PLAIN_LENGTH		16384
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档