cve_2014_0160_心脏滴血漏洞分析

2014年的一个漏洞, 通过利用OpenSSL协议1.0.1版本中的BUG读取远程服务器内存中的数据, 漏洞主要设计tls与dtls中的心跳数据包. 因此, 漏洞影响使用OpenSSL 1.0.1版本、开启tls或dtls验证的服务器.

目录

  • 漏洞简介及成因
  • poc
  • 修复方案及开发注意事项

漏洞简介

1
2
3
4
5
漏洞编号: CVE-2014-0160
漏洞类型: remote, 内存越界访问
漏洞危害: 服务器信息泄漏
影响范围: OpenSSl 1.0.1、OpenSSl 1.0.1a、OpenSSL 1.0.1f、OpenSSl 1.0.2-beta
漏洞描述: OpenSSl在实现TLS(传输层安全协议)和DTLS(数据报传输安全协议)的心跳包处理逻辑时, 未校验心跳包中数据长度字段是否与心跳的数据的长度一致, 直接使用心跳数据包的数据长度字段申请响应心跳包数据的长度并用请求心跳包的数据填充相应心跳包中的数据,导致多申请的内存未被重写其中的数据直接返回造成了信息泄漏.

漏洞成因

  1. 内存中的数据只会被覆盖不会被删除;
  2. ssl协议通过心跳机制减少重复创建tcp连接所带来的资源消耗;
  3. openssl 1.0.1版本实现心跳数据包处理时, 未校验心跳数据包的数据长度字段值是否与数据长度相同, 根据数据长度字段直接申请响应数据包所需的内存;
  4. OpenSSL 1.0.1版本实现心跳数据包处理时, 未对申请到的内存进行初始化操作;
  5. OpenSSL 1.0.1版本实现心跳数据包处理时, 将心跳请求包中数据写到响应数据包中;
    基于上述5点事实, 只需构造出心跳数据长度字段的值大于心跳数据占用长度的心跳请求数据包即可触发具有漏洞的服务器泄漏对应的内存数据.

openssl漏洞分析

  1. tls实现中产生的漏洞在源码文件’ssl/t1_lib.c’的tls1_process_heartbeat函数中, 源代码如下(dtls中的漏洞成因与tls中的漏洞成因类似):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 漏洞主要的3处函数

    // 函数一:n2s函数通过指针p读取客户端心跳包协议中的心跳包长度并赋值给payload
    n2s(p, payload);

    // 函数二:直接通过客户端心跳包中的长度申请内存, 未校验与心跳数据是否一致
    buffer = OPENSSL_malloc(1 + 2 + payload + padding);

    //函数三: bp-申请到的服务器心跳包内存; p1-客户端心跳包内容; payload-心跳包长度; 其中payload大于p1中数据的内容
    memcpy(bp, pl, payload);

修复方案及开发注意事项

修复方案: 升级OpenSSL版本; 如果无法及时升级OpenSSL程序, 可先禁用tls和dtls;
开发注意事项:

  1. 申请之后的内存(堆、栈)尽可能的进行初始化; 如果对性能要求过于严苛则忽略;
  2. 申请到的内存在写入的时候要尽可能将其写满, 可填充’0x00’.

参考文章

http://0x4c43.cn/2018/0701/heartbleed-vulnerability-analysis/
http://cea.ceaj.org/CN/abstract/abstract34416.shtml

owefsad wechat
进击的DevSecOps,持续分享SAST/IAST/RASP的技术原理及甲方落地实践。如果你对 SAST、IAST、RASP方向感兴趣,可以扫描下方二维码关注公众号,获得更及时的内容推送。
0%