A collection of findings from a security assessment of WPF browser-hosted applications (XBAP). Four distinct issues were identified across DoS, crash, and UXSS categories.
Silverlight 3 DoS — Uncaught Exception in CallMethod
Accessing the CallMethod function on the Silverlight bridge object without arguments or in an unexpected state raises an uncaught exception that crashes the browser.
IE DoS — dataTransfer.setData with Invalid URL
Setting an invalid URL in event.dataTransfer.setData("URL", ...) during a drag operation crashes IE. The !exploitable analyzer rated this EXPLOITABLE — EIP is changed, and the DEP access violation...
Mark-of-the-Web + Flash XML to Read Local Files
A local HTML file carrying a Mark-of-the-Web (MotW) comment runs in the Internet Zone rather than the Local Machine Zone. Flash files embedded in that page inherit the Internet Zone context, and...
XBAP Clipboard Hijacker
A WPF XBAP (browser-hosted application) running in Internet Explorer could access the system clipboard when it should not have been able to. The compiled clipboard_hijacker.xbap demonstrates reading...
XAML Hyperlink Cross-Origin Sub-Frame Navigation
A WPF XAML Hyperlink element with a TargetName can navigate an iframe by name — including iframes belonging to other domains — bypassing the "Allow subframes to navigate across different domains"...
Pop-up Blocker Bypass via Windows Media Player 12
The launchURL method of the Windows Media Player 12 ActiveX object bypasses IE's pop-up blocker on Windows 7. The same method with WMP 11 on XP/Vista did not reproduce, suggesting a regression...
Resident Script via Cached IFrame open Method
Saving a reference to an iframe's open method in an external popup window, then reloading the main page (destroying the iframe), leaves the cached open callable. Calling it with "about:blank" and...
IE8 DoS — Cached Image Constructor After Iframe Reload
Saving a reference to an iframe's Image constructor, reloading the iframe (which destroys the original context), and then calling new cachedImage() from the parent crashes IE8 with a...
UXSS via Silverlight Cached Method InvokeSelf
Caching a reference to an iframe's execScript method, navigating the iframe to a cross-origin page, and then invoking the cached method via Silverlight's ScriptObject.CallMethod bypasses the...
Silverlight 3 DoS — Destroy Control While Update Dialog Is Open
Destroying the Silverlight control (via outerHTML replacement) while the Silverlight update modal dialog is open crashes the browser regardless of how the dialog is closed afterward.
Silverlight 3 DoS — Destroy Object During Install Dialog
Destroying the Silverlight OBJECT element via outerHTML while the install dialog is present (and the main thread is frozen) crashes the browser. The onMainThreadFrozen helper detects when the main...
Silverlight 3 DoS — Source Change on FullScreenChanged Event
Changing the Source property of the Silverlight object when the OnFullScreenChanged event fires crashes the browser. The new source value does not matter — even an empty string is sufficient.
Silverlight 3 DoS — SplashScreenSource Null Pointer Dereference
Using the SplashScreenSource parameter with the same .xap file as the source parameter in a Silverlight 3 control triggers a null pointer dereference on load.
Flash getURL Cross-Origin Sub-Frame Navigation
Flash's getURL method can navigate frames by name, including frames that belong to other domains. By assigning a name to a cross-origin iframe through JavaScript (which was apparently allowed at the...
IE8 DoS — XAML insertObject Crash
Loading a XAML file that uses the insertObject mechanism while an empty iframe is present triggers a crash in IE8.
IE8 XSS Filter Bypass via Injected Referrer Link
The IE8 XSS filter skips its checks when the request's referrer is the same domain as the target URL. By injecting a link in the first request that points back to the same vulnerable endpoint — with...
IE Resident Script via createElement OBJECT Self-Reference
Creating an <object type="text/html"> element with createElement and then storing a reference to that element inside its own document's window keeps the element alive indefinitely — even after the...
IE8 defineProperty Intercepts Internal Dialogs for Address Bar Spoofing
IE8's Object.defineProperty can override members that IE's own internal dialogs access on the page's document. When the Print Preview dialog reads document.documentElement, our getter fires — and...
UXSS — IE8 defineProperty Accessor Survives Cross-Origin Redirect
This builds on the delayed-redirect variable injection (entry #23) by using Object.defineProperty to install a getter accessor on a cross-origin window's document object. The accessor persists...
Pseudo-UXSS — Injecting Variables into a Cross-Origin Window via Delayed Redirect
Opening a new window to a same-domain page that performs a server-side redirect to a different domain leaves a window of time during which JavaScript variables set on the new window persist — even...
IE8 DoS — Prototype Property Crash on Properties Dialog
Setting any property on the prototype of any HTML element type causes IE8 to crash when the File → Properties dialog is opened. The crash can be triggered without user interaction by using ExecWB to...
Resident Script via Self-Pointing htmlFile
A script running inside an htmlFile ActiveX document can be made resident simply by storing a reference to the htmlFile object inside its own window. This creates a circular reference that prevents...
Resident Script via WebSlice XAML Frame
A setInterval placed inside a XAML Frame element (loaded via a WebSlice) keeps running even after the WebSlice is closed, because the PresentationHost.exe process remains resident in memory. The...
DoS — X-Frame-Options Reload Crash
Loading a page with an X-Frame-Options header inside an iframe and triggering a reload crashes IE8.
DoS — X-Frame-Options Location Navigation Crash
Navigating an iframe's location to a page with an X-Frame-Options header via script crashes IE.
DoS — htmlFile with Invalid Protocol and WMP launchURL
Two denial-of-service conditions in IE7 and IE8 triggered through the htmlFile ActiveX object.
Address Bar Spoofing and About:Tabs Exploitation via res:// Domain
This builds on the offsetParent UXSS (entry #16) to reach the res://ieframe.dll zone. Once inside that zone, two things become possible: spoofing the address bar using dnserror.htm#arbitrary-url, and...
UXSS via offsetParent as frameElement
I was lucky to find this one. A page with a !DOCTYPE declaration exposes document.all[0] as the DOCTYPE node, and that node's offsetParent is the hosting iframe element — even when that iframe...
RCE via Windows Desktop Search
Windows Desktop Search opened HTML result pages in a context where navigating location to a local executable path would launch that executable. The fix required restricting the zone or navigation...
UXSS via setCapture and offsetParent (Superseded)
This was an early version of a cross-origin technique later superseded by entry #16. The approach loads a non-HTML file (feeds XML, MHT, SWF, XAML, etc.) into an iframe nested inside a cross-origin...
IE8 X-Frame-Options Header Bypass
Two approaches bypassed the X-Frame-Options: DENY header in IE8. The first uses a XAML Frame element as the embedding container; the second delays the insertion of an HTML OBJECT element via...
IE8 RCE via About Dialog _unspecifiedFrame (IE8 Variation)
This is the IE8 variation of the _unspecifiedFrame About dialog attack. The IE7 version used a direct window.open to hijack the frame; IE8 blocked that approach, so the method switches to Windows...
DoS: Reusing a Cached window.open Reference After Navigation
While revisiting the cached window.open technique, I found that invoking the stale method twice in quick succession — after it had already been used to navigate the ghost iframe — was enough to crash...
Heap Spray Variations — ADO Object and Tabular Data Control
These are two variations of a heap spray technique, exploring different data-binding sources in place of the original XML island. Both bind an iframe's src through the datasrc/datafld mechanism, with...
IE8 DoS — Feeds XML Inside Iframe with Nested Iframe
Loading a feeds-formatted XML file inside an iframe, then overwriting its contents with another iframe via innerHTML, and finally clicking inside the new inner iframe crashes IE8.
IE8 WinOOB 1053535 Variation
This entry is a variation of WinOOB 1053535, archived as a compressed proof-of-concept. The reproduction steps and source were preserved in the zip file rather than as standalone HTML. The core issue...
IE7 DoS via ExecWB OLECMDID_GETZOOMRANGE Missing Argument
Calling ExecWB with OLECMDID_GETZOOMRANGE without the required fourth argument (a pointer) crashes IE7.
IE7 RCE via About Dialog _unspecifiedFrame
This one surprised me with how simple the entry point was. IE's About dialog opens a link in a window named _unspecifiedFrame. If an attacker pre-registers that window name, the About dialog's...
UXSS via CreateLink execCommand Across Origins
A close companion to the InsertImage finding, this one uses the CreateLink execCommand. By placing the focus in a cross-origin iframe and then invoking the command from a same-domain hidden iframe,...
Overriding document Methods to Fool IE Internal Dialogs
IE's internal dialogs (Find, Print Preview, Properties, etc.) interact with the page's document object — and since JavaScript can override that object and its members, those dialogs end up calling...
UXSS via InsertImage execCommand Across Origins
This one surprised me. The document.execCommand('InsertImage', true) call, when triggered from an iframe on a different origin, ends up inserting content into the parent document rather than the...
IE8 WinOOB 982379 — setCapture to Read WBControl Path
After playing around for a while with non-HTML content in iframes, I noticed that when IE instantiates a WebBrowser control to render something like a Flash file, that WBControl ends up as an...
IE8 Resident Script via Cached execScript (WinOOB 1004580)
This one took some time to get right. The trick is keeping a script alive even after the main page navigates away, by caching an execScript reference from an iframe — but the catch is that the cache...
IE8 WinOOB 1032522 — Flash GetURL with url: Protocol
A short one. While exploring what Flash's getURL method would accept as a target, I found that embedding a url:file:/// scheme inside the redirect string caused IE8 to handle the navigation in an...
IE8 XSS Filter Bypass via META Redirect
This was a variation on the earlier IE8 XSS filter bypass, this time using a <meta http-equiv="refresh"> redirect instead of navigating an inner iframe's location property. The filter checked whether...
Sandbox LiveLabs: Script Execution, Freezers, and Style Parser Escapes
These proof-of-concepts were written to be pasted into the LiveLabs sandbox environment (an internal IE testing harness at http://131.107.155.233/Samples/genericSample.aspx). The sandbox was supposed...
DoS: IE8 Crashes via createPopup and SCRIPT DEFER
While testing variations of another bug on IE8, I found two separate crash paths involving window.createPopup() and deferred scripts. Both were straightforward to trigger and required no user...
DoS: IE7 Crashes When Writing Flash via innerHTML on ONKEYPRESS
A quick one. Writing a Flash <object> or <embed> tag into the DOM via innerHTML during the ONKEYPRESS event would crash IE7 if the key was pressed quickly enough — typically two or three rapid...
MSRC 7930 Variation: Bypassing the October MSXML Patch via Redirect in DTD
This was a variation on an MSXML cross-domain scripting bug (MSRC 7930) originally found by Gregory Fleischer, who used XML parameter entities in a DTD to exfiltrate content from a remote URL into a...