Lucene search

K
seebugRootSSV:3207
HistoryApr 23, 2008 - 12:00 a.m.

Firefly媒体服务器畸形Content-Length字段堆溢出漏洞

2008-04-2300:00:00
Root
www.seebug.org
11

0.066 Low

EPSS

Percentile

93.0%

BUGTRAQ ID: 28860
CVE(CAN) ID: CVE-2008-1771

Firefly是Roku SoundBridge和iTunes所使用的开源媒体服务器。

Firefly的src/webserver.c文件的ws_getpostvars()函数中存在堆溢出漏洞,如果远程攻击者向服务区发送了带有负数Content-Length值的POST请求的话就可以触发这个溢出,导致拒绝服务或执行任意指令。

以下是src/webserver.c文件中的漏洞代码:

707 int ws_getpostvars(WS_CONNINFO pwsc) {
708 char content_length;
709 unsigned char buffer;
710 uint32_t length;
711 uint32_t ms;

715 content_length = ws_getarg(&pwsc->request_headers,"Content-Length");

722 length=atoi(content_length);
723 ws_dprintf(L_WS_DBG,"Thread %d: Post var length: %d\n",
724 pwsc->threadno,length);
725
726 buffer=(unsigned char
)malloc(length+1);

739 if(!io_read_timeout(pwsc->hclient, buffer, &length, &ms)) {

757
758 if(!ws_getgetvars(pwsc,(char
)buffer)) {
759 /
assume error was set already */
760 free(buffer);
761 ws_dprintf(L_WS_LOG,"Could not parse get vars\n");
762 return FALSE;
763 }
764
765 free(buffer);

这里的相对变量为uint32_t类型的length,在715行content_length指向了用户在HTTP POST请求中所提供的Content-Length值,这个值在722行使用atoi转换为整数。由于长度类型为uint32_t,值-1会将length设置为UINT_MAX,然后使用这个长度值分配堆上空间,在malloc调用添加+ 1就会触发整数溢出。如果Content-Length: -1的话,传送给malloc的(UINT_MAX + 1)缓冲区大小为0,导致malloc分配可能的最小块,但不会失败。

在739行会对缓冲区执行定时的读取,src/io.c的io_read_timeout()函数结束对io_read的调用,将length字节数读到缓冲区,向length写回读字节的计数,因此可能出现堆溢出,导致在765行释放已破坏的缓冲区时服务器崩溃。

Firefly Media Server < 0.2.4.2
Firefly

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

<a href=“http://sourceforge.net/project/showfiles.php?group_id=98211&amp;package_id=105189&amp;release_id=593465” target=“_blank”>http://sourceforge.net/project/showfiles.php?group_id=98211&amp;package_id=105189&amp;release_id=593465</a>


                                                http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=10;filename=mt-daapd.py;att=1;bug=476241