Heartbleed bug

来源:互联网 发布:软件开发流程管理规范 编辑:程序博客网 时间:2024/05/16 17:28

该漏洞被归为缓冲过度读取。缓冲过度读取错误是软件可以读取比应该被允许还多的数据。

1. 概述
Heartbleed错误(CVE-2014-0160)是OpenSSL库中的严重实施缺陷,它使攻击者能够从受害服务器的内存窃取数据。 被盗数据的内容取决于服务器内存中的内容。 它可能包含私钥,TLS会话密钥,用户名,密码,信用卡等。此漏洞是在执行Heartbeat协议,SSL / TLS使用它来保持连接活动。 本实验的目的是让学生了解这个漏洞的严重程度,攻击的工作原理以及如何解决这个问题。 受影响的OpenSSL版本范围为1.0.1到1.0.1f。 我们的Ubuntu VM的版本是1.0.1。

2. 实验环境
在本实验中,我们需要设置两个虚拟机:一个称为攻击者计算机,另一个称为受害服务器。我们使用预构建的SEEDUbuntu12.04 VM。 VM需要使用NAT网络适配器进行网络设置。这可以通过转到VM设置,选择网络,然后单击适配器标记将适配器切换到NAT-Network来完成。确保两个VM位于同一NAT网络上。此攻击中使用的网站可以是使用SSL / TLS的任何HTTPS网站。然而,由于攻击一个真实的网站是非法的,我们已经在我们的VM中设置了一个网站,并对我们自己的VM进行攻击。我们使用一个名为ELGG的开源社交网络应用程序,并将其托管在以下URL中:https://www.heartbleedlabelgg.com。
我们需要修改攻击者计算机上的/ etc / hosts文件,以将服务器名称映射到服务器VM的IP地址。搜索/ etc / hosts中的以下行,并将IP地址127.0.0.1替换为承载ELGG应用程序的服务器VM的实际IP地址。 127.0.0.1 www.heartbleedlabelgg.com

3. 实验任务
在进行实验任务之前,您需要了解Heartbeat协议的工作原理。 Heartbeat协议由两种消息类型组成:HeartbeatRequest包和HeartbeatResponse包。 客户端向服务器发送HeartbeatRequest包。 当服务器接收到它时,它在HeartbeatResponse数据包中发送一个接收到的消息的副本。 目标是保持持续连接状态。 协议如图1所示。
这里写图片描述
3.1 任务1:启动Heartbleed攻击。
在这项任务中,学生将在我们的社交网站上启动Heartbleed攻击,并看看可以实现什么样的损害。 Heartbleed攻击的实际损坏取决于服务器内存中存储的是什么类型的信息。 如果服务器上没有太多活动,您将无法窃取有用的数据。 因此,我们需要作为合法用户与Web服务器进行交互。 让我们以管理员身份执行操作,并执行以下操作:
这里写图片描述
在作为合法用户进行了足够的交互后,您可以启动攻击,并查看可以从受害服务器中获取的信息。 编写程序以从头开始执行Heartbleed攻击并不容易,因为它需要Heartbeat协议的低级知识。 幸运的是,其他人已经写了攻击代码。 因此,我们将使用现有代码在Heartbleed攻击中获得第一手的体验。 我们使用的代码称为attack.py,它最初是由Jared Stafford编写的。 我们对教育目的的代码做了一些小的改动。 您可以从实验室的网站下载代码,更改其权限,以便文件可执行。 然后,您可以运行攻击代码,如下所示:
$ ./attack.py www.heartbleedlabelgg.com
您可能需要多次运行攻击代码以获取有用的数据。 尝试看看是否可以从目标服务器获取以下信息。
• 用户名和密码。
•用户的活动(用户做了什么)。
•私人消息的确切内容。
对于你从Heartbleed攻击中窃取的每一个秘密,你需要显示屏幕转储作为证明,并解释你是如何进行攻击,以及你的观察是什么。
3.2 任务2:查找Heartbleed漏洞的原因
在此任务中,学生将比较良性数据包的结果和攻击者代码发送的恶意数据包,以找出Heartbleed漏洞的根本原因。 Heartbleed攻击基于Heartbeat请求。这个请求只是发送一些数据到服务器,并且服务器将数据复制到其响应数据包,所以所有的数据被回送。在正常情况下,假设请求包括3个字节的数据“ABC”,因此长度字段具有值3.服务器将数据放置在存储器中,并将3个字节从数据开始复制到其响应包。在攻击情形中,请求可以包含3字节的数据,但是长度字段可以表示为1003.当服务器构造其响应分组时,它从数据的开始(即“ABC”)复制,但是它复制1003字节,而不是3字节。这些额外的1000个类型显然不是来自请求包;它们来自服务器的私有内存,它们可能包含其他用户的信息,密钥,密码等。
在这个任务中,我们将使用请求的长度字段。首先,让我们了解Heartbeat响应数据包是如何从图2构建的。当心跳请求数据包到来时,服务器将解析数据包以获取有效负载和有效负载长度值(在图2中突出显示)。这里,有效载荷只是一个3字节的字符串“ABC”,有效载荷长度值正好为3.服务器程序将盲目地从请求数据包中取这个长度值。然后通过指向存储“ABC”的存储器并将有效载荷长度字节复制到响应有效载荷来构建响应分组。这样,响应包将包含3字节字符串“ABC”。我们可以启动HeartBleed攻击,如图3所示。我们保持相同的有效负载(3字节),但将Payload长度字段设置为1003.当构建响应数据包时,服务器将再次盲取该有效负载长度值。这一次,服务器程序将指向字符串“ABC”,并将1003字节从内存复制到响应包作为有效载荷。除了字符串“ABC”,额外的1000字节被复制到响应数据包,这可能是来自内存的任何东西,如秘密活动,日志信息,密码等。
我们的攻击代码允许你使用不同的有效载荷长度值。 默认情况下,该值设置为相当大的值(0x4000),但可以使用命令选项“-l”(letter ell)或“–length”减小大小,如以下示例所示:
这里写图片描述
你的任务是使用不同有效载荷长度值的攻击程序,并回答以下问题:
•问题2.1:随着长度变量减少,您可以观察到什么样的差异?
•问题2.2:随着长度变量减小,输入长度变量有一个边界值。 在该边界处或以下,心跳查询将接收响应分组,而不附加任何额外数据(这意味着请求是良性的)。 请找到边界长度。 您可能需要尝试许多不同的长度值,直到Web服务器发送回应,没有额外的数据。 为了帮助您,当返回的字节数小于预期的长度,程序将打印“服务器处理的格式错误的心跳,但没有返回任何额外的数据。
3.3任务3:对策和错误修复
要修复Heartbleed漏洞,最好的方法是将OpenSSL库更新到最新版本。 这可以使用以下命令实现。 应该注意的是,一旦更新,很难回到脆弱的版本。 因此,请确保在执行更新之前完成了先前的任务。 您还可以在更新之前创建VM的快照。
这里写图片描述
任务3.1在更新OpenSSL库之后再次尝试您的攻击。 请描述你的观察。
任务3.2此任务的目标是找出如何修复Heartbleed错误在源代码中。 以下C风格结构(与源代码不完全相同)是Heartbeat请求/响应数据包的格式。
这里写图片描述
分组的第一字段(1字节)是类型信息,第二字段(2字节)是有效载荷长度,随后是实际有效载荷和填充。 有效载荷的大小应该与有效载荷长度字段中的值相同,但在攻击情形中,有效载荷长度可以设置为不同的值。 以下代码段显示了服务器如何将数据从请求数据包复制到响应数据包。

/* Allocate memory for the response, size is 1 byte2 * message type, plus 2 bytes payload length, plus3 * payload, plus padding4 */56 unsigned int payload;7 unsigned int padding = 16; /* Use minimum padding */89 // Read from type field first10 hbtype = *p++; /* After this instruction, the pointer11 * p will point to the payload_length field *.1213 // Read from the payload_length field14 // from the request packet15 n2s(p, payload); /* Function n2s(p, payload) reads 16 bits16 * from pointer p and store the value17 * in the INT variable "payload". */181920 pl=p; // pl points to the beginning of the payload content2122 if (hbtype == TLS1_HB_REQUEST)23 {24 unsigned char *buffer, *bp;25 int r;2627 /* Allocate memory for the response, size is 1 byte28 * message type, plus 2 bytes payload length, plus29 * payload, plus padding30 */3132 buffer = OPENSSL_malloc(1 + 2 + payload + padding);33 bp = buffer;3435 // Enter response type, length and copy payload36 *bp++ = TLS1_HB_RESPONSE;37 s2n(payload, bp);3839 // copy payload40 memcpy(bp, pl, payload); /* pl is the pointer which41 * points to the beginning42 * of the payload content */4344 bp += payload;4546 // Random padding47 RAND_pseudo_bytes(bp, padding);4849 // this function will copy the 3+payload+padding bytes50 // from the buffer and put them into the heartbeat response51 // packet to send back to the request client side.52 OPENSSL_free(buffer);SEED Labs – Heartbleed Attack 753 r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer,54 3 + payload + padding);

请从清单1中的代码中指出该问题,并提供一个解决方案来修复该错误(即修复该错误需要进行哪些修改)。 你不需要重新编译代码; 只是描述如何解决您的实验报告中的问题。 此外,请对Alice,Bob和Eva关于Heartbleed漏洞的根本原因的以下讨论进行评论:Alice认为缓冲区副本中的根本原因是缺少边界检查; 鲍勃认为原因是缺少用户输入验证; Eva认为我们可以从包中删除长度值来解决一切。
4提交
学生需要提交详细的实验室报告,以描述他们做了什么和他们观察到了什么。 报告应包括支持观察的证据。 证据包括数据包跟踪,屏幕转储等。

原文地址:

http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Networking/Heartbleed/Heartbleed.pdf

0 0
原创粉丝点击