2014年的一个漏洞, 通过利用OpenSSL协议1.0.1版本中的BUG读取远程服务器内存中的数据, 漏洞主要设计tls与dtls中的心跳数据包. 因此, 漏洞影响使用OpenSSL 1.0.1版本、开启tls或dtls验证的服务器.
目录
- 漏洞简介及成因
- poc
- 修复方案及开发注意事项
漏洞简介
1 | 漏洞编号: CVE-2014-0160 |
漏洞成因
- 内存中的数据只会被覆盖不会被删除;
- ssl协议通过心跳机制减少重复创建tcp连接所带来的资源消耗;
- openssl 1.0.1版本实现心跳数据包处理时, 未校验心跳数据包的数据长度字段值是否与数据长度相同, 根据数据长度字段直接申请响应数据包所需的内存;
- OpenSSL 1.0.1版本实现心跳数据包处理时, 未对申请到的内存进行初始化操作;
- OpenSSL 1.0.1版本实现心跳数据包处理时, 将心跳请求包中数据写到响应数据包中;
基于上述5点事实, 只需构造出心跳数据长度字段的值大于心跳数据占用长度的心跳请求数据包即可触发具有漏洞的服务器泄漏对应的内存数据.
openssl漏洞分析
- 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;
开发注意事项:
- 申请之后的内存(堆、栈)尽可能的进行初始化; 如果对性能要求过于严苛则忽略;
- 申请到的内存在写入的时候要尽可能将其写满, 可填充’0x00’.
参考文章
http://0x4c43.cn/2018/0701/heartbleed-vulnerability-analysis/
http://cea.ceaj.org/CN/abstract/abstract34416.shtml