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);...
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请求从系统检索任意文件。