CVE:CVE-2008-1771
CNNVD:CNNVD-200804-236
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行释放已破坏的缓冲区时服务器崩溃。
solution:Upgrade fireflymediaserver fireflymediaserver to a higher version than 0.2.4.1,and avoid the version 0.2.4.1