前阵子“心脏出血”刚发生的时候读了下源代码,给出了自己觉得比较清楚的理解。
 
-------------------------穿越时空的分割线---------------------------
 
参考:http://drops.wooyun.org/papers/1381
 
这个问题出现在openSSL处理TLS心跳的过程中,TLS心跳的流程是:A向B发送请求包,B收到包后读取这个包的内容(data),并返回一个包含有请求包内容的响应包。请求包的内容(data)中包含有包的类型(type)和数据长度等信息。
 
当B收到A的请求包后,并没有的验证A包的实际长度,而是简单的把请求包data中说明的长度当作data的实际长度,于是当请求包中说明的长度与请求包数据实际长度不同时,问题就产生了。假设A构造一个请求包,它的实际内容长度只有1,而却告诉B的它的长度是65535,那么B接受到这个包后就会把A的内容完全当作65535来处理,其实到这里,问题还并不严重,最严重的问题出在,心跳的响应包还需要附带请求包的全部内容,这就需要程序做一次将请求包的数据从它所在的内存拷贝到响应包的内存里的操作,这下就出大问题了,当拷贝的时候,程序认为A包的内容长度是65535个字节,结果A包在内存里面实际只有1个字节,于是程序不仅拷贝出了A包的内容,还“傻傻”地将A包数据在内存中位置后额外的65534个字节拷贝进了响应包里,并将这个响应包发还给了A,于是A便轻易地获得了B内存中这65534个字节的数据。想象一下,如果这65534个字节数据中包括一些敏感信息,那么后果将非常严重。而且A还可以简单地通过连续的发送心跳包,获取B机器内存中n个65534字节的数据,这个漏洞不愧是2014年“最佳漏洞”。
 
现实是残酷的,据说的确已经有很多用户的敏感信息通过这种方式泄漏了。作为一个应用如此广泛和重要的开源库,出现这种低级的问题实在是让人不能理解,不禁又让人联想起了------阴谋!

最新文章

  1. CSS 重设文章
  2. paip.java win程序迁移linux的最佳实践
  3. operator new3种情况详解
  4. android 根据SD卡中图片路径读取并显示SD中的图片——源代码
  5. Hive编程(影印版)
  6. [C#]『PLINQ』任务并行库使用小计
  7. PL/SQL 中文转换为\uxxxx格式(unicode)
  8. PHPExcel讀取excel數據
  9. php开发通用采集程序
  10. OC高级编程——深入block,如何捕获变量,如何存储在堆上
  11. Android 开发笔记___基本适配器的使用__BaseAdapter
  12. 简单搭建一个SpringBoot
  13. luogu3707 相关分析 (线段树)
  14. php字符串操作
  15. [UE4]编辑器偏好设置,在同一个窗口以标签打开蓝图
  16. 2.Early Education of Children 儿童的早期教育
  17. 【CF771A】Bear and Friendship Condition
  18. 1. 集成学习(Ensemble Learning)原理
  19. OC 对象和函数
  20. MIT挑战(如何在12个月内自学完成MIT计算机科学的33门课程|内附MIT公开课程资源和学习顺序

热门文章

  1. springmvc文件上传2中方法
  2. 服务器端json解析
  3. SqlDataAdapter用法
  4. java--依赖、关联、聚合和组合之间区别的理解
  5. Android:布局单位换算
  6. JRE下的rt.jar、tools.jar
  7. [原创]使用命令行工具提升cocos2d-x开发效率(一)之TexturePacker篇
  8. 三个特殊资源目录 /res/xml /res/raw 和 /assets
  9. 高难度(3)RenderScript
  10. 查看mssql死锁的详细信息(存储过程)