Mozilla是一款开放源码的Web浏览器。 Mozilla 1.7.3和Firefox 1.0中的实现中存在漏洞,远程利用漏洞可能允许攻击者导致堆破坏,造成执行任意代码。 漏洞存在于依赖mozilla/xpcom/string/src/nsTSubstring.cpp文件中函数的字符串处理函数(如nsCSubstring::Append)中。某些函数(如nsTSubstring_CharT::Replace())不能检查重新划定字符串大小函数的返回值。 xpcom/string/src/nsTSubstring.cpp: [1] size_type length = tuple.Length(); cutStart = PR_MIN(cutStart, Length()); [2] ReplacePrep(cutStart, cutLength, length); [3] if (length > 0) tuple.WriteTo(mData + cutStart, length); 在[1]中,长度被设置为将要拷贝的字符串的长度,并于[2]传送给ReplacePrep()。如果这个函数执行的重新分配失败,则将mData设为固定的地址。 mData = NS_CONST_CAST(char_type*, char_traits::sEmptyBuffer); mLength = 0; xpcom/string/src/nsSubstring.cpp中设置了sEmptyBuffer的值: static const PRUnichar gNullChar = 0; const char* nsCharTraits<char> ::sEmptyBuffer = (const char*) &gNullChar; 因为没有检查返回值,如果函数失效的话,mData就指向已知的内存位置。通过导致内存消耗直到出现内存耗尽的情况出现,并控制要附加的字符串的值,就可能在[3]导致在已知位置放置任意数据,允许执行任意代码。
Mozilla是一款开放源码的Web浏览器。 Mozilla 1.7.3和Firefox 1.0中的实现中存在漏洞,远程利用漏洞可能允许攻击者导致堆破坏,造成执行任意代码。 漏洞存在于依赖mozilla/xpcom/string/src/nsTSubstring.cpp文件中函数的字符串处理函数(如nsCSubstring::Append)中。某些函数(如nsTSubstring_CharT::Replace())不能检查重新划定字符串大小函数的返回值。 xpcom/string/src/nsTSubstring.cpp: [1] size_type length = tuple.Length(); cutStart = PR_MIN(cutStart, Length()); [2] ReplacePrep(cutStart, cutLength, length); [3] if (length > 0) tuple.WriteTo(mData + cutStart, length); 在[1]中,长度被设置为将要拷贝的字符串的长度,并于[2]传送给ReplacePrep()。如果这个函数执行的重新分配失败,则将mData设为固定的地址。 mData = NS_CONST_CAST(char_type*, char_traits::sEmptyBuffer); mLength = 0; xpcom/string/src/nsSubstring.cpp中设置了sEmptyBuffer的值: static const PRUnichar gNullChar = 0; const char* nsCharTraits<char> ::sEmptyBuffer = (const char*) &gNullChar; 因为没有检查返回值,如果函数失效的话,mData就指向已知的内存位置。通过导致内存消耗直到出现内存耗尽的情况出现,并控制要附加的字符串的值,就可能在[3]导致在已知位置放置任意数据,允许执行任意代码。