安全研究

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

发布日期:2010-03-25
更新日期:2010-03-29

受影响系统:
Jenkins Software RakNet <= 3.72
描述:
BUGTRAQ  ID: 38974

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/

浏览次数:2604
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障