Pidgin Libpurple库MSN-SLP表情符目录遍历漏洞

2010-01-06T00:00:00
ID SSV:15186
Type seebug
Reporter Root
Modified 2010-01-06T00:00:00

Description

BUGTRAQ ID: 37524

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

Pidgin的Libpurple库在实现自定义表情符功能时存在安全漏洞,远程攻击者可以通过提交包含有目录遍历序列的MSN表情符请求读取任意文件的内容。以下是libpurple/protocols/msn/slp.c中的有漏洞代码段:

static void got_sessionreq(MsnSlpCall slpcall, const char branch, const char euf_guid, const char context) { gboolean accepted = FALSE;

if (!strcmp(euf_guid, MSN_OBJ_GUID))
{
    /* Emoticon or UserDisplay */
    char *content;
    gsize len;
    MsnSlpLink *slplink;
    MsnSlpMessage *slpmsg;
    MsnObject *obj;
    char *msnobj_data;
    PurpleStoredImage *img;
    int type;

    /* Send Ok */
 ...
    msnobj_data = (char *)purple_base64_decode(context, &len);
    obj = msn_object_new_from_string(msnobj_data);
    type = msn_object_get_type(obj);
    g_free(msnobj_data);
 ...
    if (type == MSN_OBJECT_EMOTICON) {
        char *path;
        path = g_build_filename(purple_smileys_get_storing_dir(),
                obj->location, NULL);
        img = purple_imgstore_new_from_file(path);
        g_free(path);
...
    msn_slpmsg_set_image(slpmsg, img);
    msn_slplink_queue_slpmsg(slplink, slpmsg);
    purple_imgstore_unref(img);

    accepted = TRUE;
}
...

}

上述代码首先解码Base64编码的上下文然后存储到msnobj_data,之后会使用这个传送给 msn_object_new_from_string()的指针检索MsnObject结构。这个类型是在libpurple/protocols /msn/slp.h中定义的,包含有:

typedef struct { gboolean local;

char *creator;
int size;
MsnObjectType type;
PurpleStoredImage *img;
char *location;
char *friendly;
char *sha1d;
char *sha1c;

} MsnObject;

在got_sessionreq()函数中,如果之前所接收到对象(使用msn_object_get_type()检索到)的类型为 MSN_OBJECT_EMOTICON的类型,也就是为表情符,就会调用g_build_filename()基于pidgin的默认表情符目录构建文件名。由于其中使用了从purple_smileys_get_storing_dir()检索的内容和用户控制的obj->location,远程攻击者可以创建包含有目录遍历序列表情符的MSN请求从系统检索任意文件。

Pidgin 2.6.4 厂商补丁:

Pidgin

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

http://pidgin.im/pidgin/home/