参考答案:
【问题1】
(1)心跳包数据长度的最大取值为65535。
(2)必须是一致的。
【问题2】
存在溢出安全漏洞。
接收端处理代码在组装响应包时,心跳包数据长度字段(payload)采用的是客户端。
发送的请求包中使用的长度字段,由于心跳包数据长度字段完全由客户端控制,当payload大于实际心跳包数据的长度时,将导致越界访问接收端内存,从而泄露内存信息。(2分)
造成的危害:在正常的情况下,response 报文中的data就是request报文中的data数据,但是在异常情况下,payload 的长度远大于实际数据的长度,这样就会发生内存的越界访问,但这种越界访问并不会直接导致程序异常,(因为这里直接memcpy后,服务器端并没有使用copy后的数据,而只是简单的进行了回复报文的填充,如果服务端使用了copy的数据也许就可能发现问题)这里使用了memcpy函数,该函数会直接根据长度把内存中数据复制给另一个变量。这样就给恶意的程序留下了后门,当恶意程序给data的长度变量赋值为65535时,就可以把内存中64KB的内存数据通过Response报文发送给客户端,这样客户端程序就可以获取到一些敏感数据泄露。
【问题3】
属于黑盒测试;不存在误报。
【问题4】
不能。
因为不会产生异常,模糊测试器就无法监视到异常,从而无法检测到该漏洞。
详细解析:
【问题1】
已知表示心跳包的数据长度值为2字节,则其最大长度为216-1=65535。
心跳包中的数据长度字段给出的长度值必须与后续的数据字段的实际长度一致;如果不一致会产生“心脏出血”漏洞,造成有用数据泄露。
【问题2】
心脏出血漏洞主要通过攻击者模拟向服务器端发送自己编写的Heartbeat心跳数据包,主要是HeartbeatMessage的长度与payload的length进行匹配,若payload_lenght长度大于HeartbeatMessage的length,则会在服务器返回的response响应包中产生数据溢出,造成有用数据泄露。
题中每条心跳包记录中包含一个类型域(type)、一个长度域(length)和一个指向记录数据的指针(data)。心跳包的第一个字节标明了心跳包的类型。宏n2s从指针p指向的数组中取出前两个字节,并把它们存入变量payload中——这实际上是心跳包载荷的长度域(length)。注意程序并没有检查这条心跳包记录的实际长度。变量pl则指向由访问者提供的心跳包数据。
buffer = malloc(1 + 2 + payload);程序将分配一段由访问者指定大小的内存区域,这段内存区域最大为 (65535 + 1 + 2)个字节。变量bp是用来访问这段内存区域的指针。
代码中宏s2n与宏n2s干的事情正好相反:s2n读入一个16 bit长的值,然后将它存成双字节值,所以s2n会将与请求的心跳包载荷长度相同的长度值存入变量payload。然后程序从pl处开始复制payload个字节到新分配的bp数组中——pl指向了用户提供的心跳包数据。最后,程序将所有数据发回给用户。如果用户并没有在心跳包中提供足够多的数据,比如pl指向的数据实际上只有一个字节,那么memcpy会把这条心跳包记录之后的数据(无论那些数据是什么)都复制出来。
分配的buffer是根据数据包给出的长度字段来分配的,并在memcpy函数实现内存数据拷贝,因此有可能越界读取额外的内存数据,造成信息泄露。
【问题3】
模糊测试是一种黑盒测试技术,它将大量的畸形数据输入到目标程序中,通过监测程序的异常来发现被崩程序中可能存在的安全漏洞。模糊测试是一种基于缺陷注入的自动化测试技术,没有具体的执行规则,旨在预测软件中可能存在的错误以及什么样的输入能够触发错误。其通过模糊器向目标应用发送大量的畸形数据并监视程序运行异常以发现软件故障,通过记录触发异常的输入数据来进一步定位异常位置。与基于源代码的白盒测试相比,模糊测试的测试对象是二进制目标文件,因而具有更好的适用性:模糊测试是一种自动化的动态漏洞挖掘技术,不存在误报,也不需要人工进行大量的逆向分析工作。
【问题4】
上述代码存在的信息泄露漏洞在模糊测试过程中,不管用什么样的数据包长度去测试,被测代码都是正常运行,没有出现异常情况,因此也就无法判断是否有漏洞,所以模糊测试无法测试出该代码存在的漏洞。