Libmodplug是Stephane Denis和Ivan Vecera程序员共同开发的一个用于处理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,导致了堆溢出,触发内存读写越界异常。
Libmodplug是Stephane Denis和Ivan Vecera程序员共同开发的一个用于处理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,导致了堆溢出,触发内存读写越界异常。