再度chromeのクロスドメインセキュリティチェック探訪

前回のchromeのクロスドメインセキュリティチェック探訪では、なんでinspectorからだとクロスドメインのIFRAMEの中が読み出せるのか、というのがけっきょくわかんないままでしたが、理由がわかりました。
src/webkit/port/bindings/v8/v8_proxy.cppの中にクロスドメインチェックを行うV8Proxy::CanAccessPrivateという関数があり、これがinspectorのようなブラウザ組み込みのページのためのprotocolを特別扱いするようになっていました。

// Check if the current execution context can access a target frame.
// First it checks same domain policy using the lexical context
//
// This is equivalent to KJS::Window::allowsAccessFrom(ExecState*, String&).
bool V8Proxy::CanAccessPrivate(DOMWindow* target_window)
{
    ASSERT(target_window);

    String message;

    DOMWindow* origin_window = retrieveWindow();
    if (origin_window == target_window)
        return true;

    if (!origin_window)
        return false;

    // JS may be attempting to access the "window" object, which should be
    // valid, even if the document hasn't been constructed yet.
    // If the document doesn't exist yet allow JS to access the window object.
    if (!origin_window->document())
        return true;

    const SecurityOrigin* active_security_origin = origin_window->securityOrigin();
    const SecurityOrigin* target_security_origin = target_window->securityOrigin();

    String ui_resource_protocol = webkit_glue::StdStringToString(webkit_glue::GetUIResourceProtocol());
    if (active_security_origin->protocol() == ui_resource_protocol) {
        KURL inspector_url = webkit_glue::GURLToKURL(webkit_glue::GetInspectorURL());
        ASSERT(inspector_url.protocol() == ui_resource_protocol);
        ASSERT(inspector_url.protocol().endsWith("-resource"));

        // The Inspector can access anything.
        if (active_security_origin->host() == inspector_url.host())
            return true;

        // To mitigate XSS vulnerabilities on the browser itself, UI resources
        // besides the Inspector can't access other documents.
        return false;
    }

inspectorのURLはsrc/chrome/renderer/renderer_glue.ccで定義されていて

GURL webkit_glue::GetInspectorURL() {

  return GURL("chrome-resource://inspector/inspector.html");

}



std::string webkit_glue::GetUIResourceProtocol() {

  return "chrome-resource";

}

実際アドレスバーにchrome-resource://inspector/inspector.htmlを入れるとinspectorの出来損ないみたいなのが表示されます。


About this entry