安全研究

安全漏洞
Media Player Classic FLI文件处理远程缓冲区溢出漏洞

发布日期:2007-08-25
更新日期:2007-08-27

受影响系统:
guliverkli Media Player Classic 6.4.9.0
描述:
BUGTRAQ  ID: 25437

Media Player Classic是一个免费的基于WMP的播放程序,支持几乎所有媒体格式。

Media Player Classic处理fli文件时存在缓冲区溢出漏洞,远程攻击者可能利用此漏洞控制客户端。

在FLICSource.cpp文件中的以下函数:
    
  690 void CFLICStream::_deltachunk()
  691 {
  692     BYTE* tmp = m_pFrameBuffer;   //m_pFrameBuffer 的长度为m_hdr.x*m_hdr.y*32>>3,
                                                                          //注意m_hdr.x,m_hdr.y是从一个fli文件中读出的,是我们能控制的
  693
  694     WORD lines;
  695     m_flic.Read(&lines, sizeof(lines)); //这里的lines是从一个fli文件中读出的
  696
  697     while(lines--)
  698     {
  699         signed short packets;
  700         m_flic.Read(&packets, sizeof(packets)); // packets也是从一个fli文件中读出的
  701
  702         if(packets < 0)
  703         {
  704             if(packets&0x4000)
  705             {
  706                 tmp += -packets * m_hdr.x;
  707                 lines++;
  708             }
  709             else
  710             {
  711                 signed char count;
  712                 m_flic.Read(&count, sizeof(count));
  713                 tmp[m_hdr.x-1] = (BYTE)packets;
  714             }
  715         }
  716         else
  717         {
  718             BYTE* ptr = tmp;
  719
  720             while(packets--)
  721             {
  722                 BYTE skip;
  723                 m_flic.Read(&skip, sizeof(skip));
  724
  725                 ptr += skip;                                //这里可以使指针快速移动
  726
  727                 signed char count;
  728                 m_flic.Read(&count, sizeof(count)); // count也是从一个fli文件中读出的
  729
  730                 if(count >= 0)
  731                 {
  732                     m_flic.Read(ptr, count << 1); //把fli文件中的内容copy到ptr指向的内存中
  733                     ptr += count << 1;
  734                 }
  735                 else
  736                 {
  737                     WORD c;
  738                     m_flic.Read(&c, sizeof(c));
  739                     count = -count;
  740                     while(count-- > 0)
  741                     {
  742                         *ptr++ = c>>8;
  743                         *ptr++ = c&0xff;
  744                     }
  745                 }
  746             }
  747
  748             tmp += m_hdr.x;
  749         }
  750     }
  751 }

ptr在这个操作中没有设定边界,允许覆盖m_pFrameBuffer后面的内容,而且这些内容可以有选择地覆盖(725行),后面有些地址是new出来的对象的地址。攻击者可以选择覆盖一个对象的vtable地址,把这个地址改成能控制的地址就可以执行可控的代码。

<*来源:wushi (wooshi@gmail.com
  
  链接:http://secunia.com/advisories/26591/
        http://www.team509.com/modules.php?name=News&file=article&sid=38
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

http://www.team509.com/v02s41.fli

建议:
厂商补丁:

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

http://guliverkli.sourceforge.net/

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