安全研究

安全漏洞
Pidgin Libpurple库msn_slplink_process_msg()函数内存破坏漏洞

发布日期:2009-08-19
更新日期:2009-08-20

受影响系统:
Rob Flynn Gaim >= 0.79
Pidgin Pidgin 2.5.8
不受影响系统:
Pidgin Pidgin 2.6.0
描述:
BUGTRAQ  ID: 36071
CVE(CAN) ID: CVE-2009-2694

Pidgin是支持多种协议的即时通讯客户端。

Pidgin和其他一些即时消息客户端所使用的Libpurple库中存在内存破坏漏洞,远程攻击者可以通过向聊天客户端发送特制的MSNSLP报文触发这个漏洞,导致执行任意代码。

攻击需要发送两个连续的MSNSLP消息,第一个用于对slpmsg存储会话id,第二个用于触发漏洞,最终目标是到达msn_slplink_process_msg()中的memcpy()调用。需要创建偏移为非0的MSNSLP消息,因为这个值是memcpy()的目标。

因为偏移非0,所以在调用msn_slplink_message_find()返回NULL时会出现第一个问题:

/-----------

if (offset == 0)
{
    .. construct a new slpmsg ..
}
else
{
    slpmsg = msn_slplink_message_find(slplink,
msg->msnslp_header.session_id, msg->msnslp_header.id);
}

if (slpmsg == NULL)
{
    /* Probably the transfer was canceled */
    purple_debug_error("msn", "Couldn't find slpmsg\n");
    return;
}

- -----------/

因此,slpmsg必须为非空,这就是为什么需要发送两次消息才能进行攻击。发送的第一个MSNSLP消息偏移为0,用于创建slpmsg对象,Libpurple会存储这个对象;第二个MSNSLP消息的偏移非0,但由于Libpurple已经存储了第一个MSNSLP消息,因此调用msn_slplink_message_find()会有效的返回之前的对象而不是NULL:

/-----------

if (slpmsg->fp)
{
    /* fseek(slpmsg->fp, offset, SEEK_SET); */
    len = fwrite(data, 1, len, slpmsg->fp);
}
else if (slpmsg->size)
{
    if (G_MAXSIZE - len < offset || (offset='' + len='') > slpmsg->size)
    {
        purple_debug_error("msn",
          "Oversized slpmsg - msgsize=%lld offset=%" G_GSIZE_FORMAT "
len=%" G_GSIZE_FORMAT "\n",
          slpmsg->size, offset, len);
        g_return_if_reached();
    }
    else
        memcpy(slpmsg->buffer + offset, data, len);
    }

- -----------/

例如,如果创建的第一个MSNSLP消息大小为0x01ffffff,第二个消息的偏移为小于0x01ffffff - len的任意值,就满足了任意写入的条件。

最后,以小于0x01ffffff - len的任意偏移值到达了memcpy(),缓冲区指向0。这意味着可以向低于0x01ffffff - len的任意位置写入数据内容。

<*来源:Federico Muttis
  
  链接:http://secunia.com/advisories/36384/
        http://marc.info/?l=bugtraq&m=125069450302665&w=2
        https://www.redhat.com/support/errata/RHSA-2009-1218.html
        http://security.gentoo.org/glsa/glsa-200910-02.xml
*>

建议:
厂商补丁:

RedHat
------
RedHat已经为此发布了一个安全公告(RHSA-2009:1218-01)以及相应补丁:
RHSA-2009:1218-01:Critical: pidgin security update
链接:https://www.redhat.com/support/errata/RHSA-2009-1218.html

Gentoo
------
Gentoo已经为此发布了一个安全公告(GLSA-200910-02)以及相应补丁:
GLSA-200910-02:Pidgin: Multiple vulnerabilities
链接:http://security.gentoo.org/glsa/glsa-200910-02.xml

所有Pidgin用户都应升级到最新版本:

    # emerge --sync
    # emerge --ask --oneshot --verbose =3Dnet-im/pidgin-2.5.9-r1

Pidgin
------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://www.pidgin.im/news/security/?id=34

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