libmodplug CSoundFile::ReadMed()函数整数溢出漏洞

2009-04-23

受影响系统:

    libmodplug libmodplug 0.8.4
    libmodplug libmodplug 0.8

不受影响系统:

    libmodplug libmodplug 0.8.6

描述:BUGTRAQ  ID: 30801

Libmodplug是用于播放mod类音乐格式的开源函数库。

Libmodplug库的src/load_med.cpp文件中的CSoundFile::ReadMed()函数在加载MED文件时存在可导致堆溢出的整数溢出漏洞,以下是load_med.cpp中的有漏洞代码段:

698   // Song Comments
699   UINT annotxt = bswapBE32(pmex->annotxt);
700   UINT annolen = bswapBE32(pmex->annolen);
701   if ((annotxt) && (annolen) && (annotxt+annolen <= dwMemLength))
702   {
703    m_lpszSongComments = new char[annolen+1];
704    memcpy(m_lpszSongComments, lpStream+annotxt, annolen);
705    m_lpszSongComments[annolen] = 0;
706   }

这是个很典型的整数溢出,annolen为0xFFFFFFFF(即有符号整数-1)时,导致703行new char[0]。这个0字节分配可以成功返回,所以即使703行后加上类似if(m_lpszSongComments)的检查代码也无法防范这个漏洞。704行进行memcpy,因为annolen为0xFFFFFFFF,导致了堆溢出,触发内存读写越界异常。

测试方法:

警 告

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




http://www.15897.com/blog/post/QianQianJingTing-mod-buffer-overflow-POC.html

建议:厂商补丁:

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

http://sourceforge.net/project/shownotes.php?release_id=677065&group_id=1275




向上