RakNet ProcessOfflineNetworkPacket()函数整数下溢漏洞

受影响系统:

Jenkins Software RakNet <= 3.72

描述:

RakNet是跨平台的C++游戏联网引擎。

RakNet库的RakPeer.cpp文件中的ProcessOfflineNetworkPacket()函数在处理畸形UDP报文时存在整数下溢漏洞:

bool ProcessOfflineNetworkPacket( const SystemAddress systemAddress, const char *data, const int length, RakPeer *rakPeer, RakNetSmartPtr<RakNetSocket> rakNetSocket, bool *isOfflineMessage, RakNetTimeUS timeRead )

    if (length <=2)
    {
        *isOfflineMessage=true;
    }
    …
    if (*isOfflineMessage)
    {
        …
        else if ((unsigned char) data[ 0 ] == ID_OUT_OF_BAND_INTERNAL &&
            (size_t) length < MAX_OFFLINE_DATA_LENGTH+sizeof(OFFLINE_MESSAGE_DATA_ID)+sizeof(MessageID)*2+RakNetGUID::size())
        {
            unsigned int dataLength = (unsigned int) (length-sizeof(OFFLINE_MESSAGE_DATA_ID)-RakNetGUID::size()-sizeof(MessageID)*2);
            RakAssert(dataLength<1024);
            packet=rakPeer->AllocPacket(dataLength+sizeof(MessageID), __FILE__, __LINE__);
            RakAssert(packet->length<1024);
            …
            packet->data[0]=data[1];
            …

length <=2检查要求代码无需执行额外的检查便处理入站的ID_OUT_OF_BAND_INTERNAL报文,但报文大小小于sizeof(OFFLINE_MESSAGE_DATA_ID)-RakNetGUID::size()-sizeof(MessageID)*2),因此由于这个整数溢出dataLength会过大,packet->data会被AllocPacket设置为空。访问这个空指针会导致使用这个库的游戏服务器或客户端立即崩溃。

<*来源:Luigi Auriemma (aluigi@pivx.com
  
  链接:
http://secunia.com/advisories/39108/
        http://aluigi.altervista.org/adv/rakkia-adv.txt
*>

测试方法:

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

 

http://aluigi.org/testz/udpsz.zip

建议:

厂商补丁:

Jenkins Software
—————-
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.jenkinssoftware.com/

发表评论?

0 条评论。

发表评论