阅读下列说明和C语言代码,回答问题1至问题4,将解答写在答题纸的对应栏内。 【说明】 在客户服务器通信模型中,客户端需要每隔一定时间向服务器发送数据包,以确定服务器是否掉线,服务器也能以此判断客户端是否存活。这种每隔固定时间发一次的数据包也称为心跳

admin2020-04-30  41

问题 阅读下列说明和C语言代码,回答问题1至问题4,将解答写在答题纸的对应栏内。
【说明】
    在客户服务器通信模型中,客户端需要每隔一定时间向服务器发送数据包,以确定服务器是否掉线,服务器也能以此判断客户端是否存活。这种每隔固定时间发一次的数据包也称为心跳包。心跳包的内容没有什么特别的规定,一般都是很小的包。
    某系统采用的请求和应答两种类型的心跳包格式如图4—1所示。

    心跳包类型占1个宁节,主要是请求和响应两种类型:心跳包数据长度字段占2个字节,表示后续数据或者负载的长度。
    接收端收到该心跳包后的处理函数是process—heartbeat(),其中参数P指向心跳包的报文数据,S是对应客户端的socket网络通信套接字。
    void process_heartbeat(unsigned char *P,SOCKET s)
    {
    unsigned short hbtype;
    unsigned int payload;
    hbtype= *p++;  //心跳包类型
    n2s(p,payload); //心跳包数据长度
    pl=P;  //pl指向心跳包数据
    if(hbtype==HB_REQUEST){
    unsigned char *buffer, *bp;
    buffer=malloc(1 + 2 + payload);
    bp=buffer; //bp指向刚分配的内存
    *bp++=HB RESPONSE;  //填充1 byte的心跳包类型
    s2n(payload,bp);  //填充2 bytes的数据长度
    memcpy(bp,pl,payload);
    /*将构造好的心跳响应包通过socket s返回给客户端*/
    r=wrlte_bytes(s,  buffer,  3  +payload);
    }
    }
(1)上述接收代码存在什么样的安全漏洞?
(2)该漏洞的危害是什么?

选项

答案 存在溢出安全漏洞。 接收端处理代码在组装响应包时,心跳包数据长度字段(payload)采用的是客户端发送的请求包中使用的长度字段,由于心跳包数据长度字段完全由客户端控制,当payload大于实际心跳包数据的长度时,将导致越界访问接收端内存,从而泄露内存信息。 造成的危害:在正常的情况下,response报文中的data就是request报文中的data数据,但是在异常情况下,payload的长度远大于实际数据的长度,这样就会发生内存的越界访问,但这种越界访问并不会直接导致程序异常,(因为这里直接meffcpy后,服务器端并没有使用copy后的数据,而只是简单的进行了回复报文的填充,如果服务端使用了copy的数据也许就可能发现问题)这里使用了memcpy函数,该函数会直接根据长度把内存中数据复制给另一个变量。这样就给恶意的程序留下了后门,当恶意程序给data的长度变量赋值为65535时,就可以把内存中64KB的内存数据通过Response报文发送给客户端,这样客户端程序就可以获取到一些敏感数据泄露。

解析     分配的butier是根据数据包给出的长度字段来分配的,并在memcpy函数实现内存数据拷贝,因此有可能越界读取额外的内存数据,造成信息泄露。
转载请注明原文地址:https://jikaoti.com/ti/hwx7FFFM
0

相关试题推荐
最新回复(0)