diff --git a/browser/farbling/BUILD.gn b/browser/farbling/BUILD.gn index 3c0f0fc51989..78033a7a3240 100644 --- a/browser/farbling/BUILD.gn +++ b/browser/farbling/BUILD.gn @@ -32,7 +32,6 @@ if (!is_android) { "brave_enumeratedevices_farbling_browsertest.cc", "brave_navigator_devicememory_farbling_browsertest.cc", "brave_navigator_hardwareconcurrency_farbling_browsertest.cc", - "brave_navigator_plugins_farbling_browsertest.cc", "brave_navigator_useragent_farbling_browsertest.cc", "brave_offscreencanvas_farbling_browsertest.cc", "brave_webaudio_farbling_browsertest.cc", diff --git a/browser/farbling/brave_navigator_plugins_farbling_browsertest.cc b/browser/farbling/brave_navigator_plugins_farbling_browsertest.cc deleted file mode 100644 index a4e074476b84..000000000000 --- a/browser/farbling/brave_navigator_plugins_farbling_browsertest.cc +++ /dev/null @@ -1,252 +0,0 @@ -/* Copyright (c) 2020 The Brave Authors. All rights reserved. - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "base/path_service.h" -#include "base/strings/stringprintf.h" -#include "base/task/post_task.h" -#include "base/test/thread_test_helper.h" -#include "brave/browser/brave_browser_process_impl.h" -#include "brave/browser/brave_content_browser_client.h" -#include "brave/browser/extensions/brave_base_local_data_files_browsertest.h" -#include "brave/common/brave_paths.h" -#include "brave/common/pref_names.h" -#include "brave/components/brave_component_updater/browser/local_data_files_service.h" -#include "brave/components/brave_shields/browser/brave_shields_util.h" -#include "chrome/browser/content_settings/host_content_settings_map_factory.h" -#include "chrome/browser/extensions/extension_browsertest.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/common/chrome_content_client.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "chrome/test/base/ui_test_utils.h" -#include "components/prefs/pref_service.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/test/browser_test.h" -#include "content/public/test/browser_test_utils.h" -#include "net/dns/mock_host_resolver.h" - -using brave_shields::ControlType; - -const char kPluginsLengthScript[] = - "domAutomationController.send(navigator.plugins.length);"; - -class BraveNavigatorPluginsFarblingBrowserTest : public InProcessBrowserTest { - public: - void SetUpOnMainThread() override { - InProcessBrowserTest::SetUpOnMainThread(); - - content_client_.reset(new ChromeContentClient); - content::SetContentClient(content_client_.get()); - browser_content_client_.reset(new BraveContentBrowserClient()); - content::SetBrowserClientForTesting(browser_content_client_.get()); - - host_resolver()->AddRule("*", "127.0.0.1"); - content::SetupCrossSiteRedirector(embedded_test_server()); - - brave::RegisterPathProvider(); - base::FilePath test_data_dir; - base::PathService::Get(brave::DIR_TEST_DATA, &test_data_dir); - embedded_test_server()->ServeFilesFromDirectory(test_data_dir); - - ASSERT_TRUE(embedded_test_server()->Start()); - - top_level_page_url_ = embedded_test_server()->GetURL("a.com", "/"); - farbling_url_ = embedded_test_server()->GetURL("a.com", "/simple.html"); - } - - void TearDown() override { - browser_content_client_.reset(); - content_client_.reset(); - } - - const GURL& farbling_url() { return farbling_url_; } - - HostContentSettingsMap* content_settings() { - return HostContentSettingsMapFactory::GetForProfile(browser()->profile()); - } - - void AllowFingerprinting() { - brave_shields::SetFingerprintingControlType( - content_settings(), ControlType::ALLOW, top_level_page_url_); - } - - void BlockFingerprinting() { - brave_shields::SetFingerprintingControlType( - content_settings(), ControlType::BLOCK, top_level_page_url_); - } - - void SetFingerprintingDefault() { - brave_shields::SetFingerprintingControlType( - content_settings(), ControlType::DEFAULT, top_level_page_url_); - } - - template - int ExecScriptGetInt(const std::string& script, T* frame) { - int value; - EXPECT_TRUE(ExecuteScriptAndExtractInt(frame, script, &value)); - return value; - } - - template - std::string ExecScriptGetStr(const std::string& script, T* frame) { - std::string value; - EXPECT_TRUE(ExecuteScriptAndExtractString(frame, script, &value)); - return value; - } - - content::WebContents* contents() { - return browser()->tab_strip_model()->GetActiveWebContents(); - } - - bool NavigateToURLUntilLoadStop(const GURL& url) { - ui_test_utils::NavigateToURL(browser(), url); - return WaitForLoadStop(contents()); - } - - private: - GURL top_level_page_url_; - GURL farbling_url_; - std::unique_ptr content_client_; - std::unique_ptr browser_content_client_; -}; - -// Tests results of farbling known values -// https://github.com/brave/brave-browser/issues/9435 -IN_PROC_BROWSER_TEST_F(BraveNavigatorPluginsFarblingBrowserTest, - FarbleNavigatorPlugins) { - // Farbling level: off - // get real length of navigator.plugins - AllowFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); - int off_length = ExecScriptGetInt(kPluginsLengthScript, contents()); - - // Farbling level: balanced (default) - // navigator.plugins should contain all real plugins + 2 fake ones - SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(farbling_url()); - int balanced_length = ExecScriptGetInt(kPluginsLengthScript, contents()); - EXPECT_EQ(balanced_length, off_length + 2); - - // Farbling level: maximum - // navigator.plugins should contain no real plugins, only 2 fake ones - BlockFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); - int maximum_length = ExecScriptGetInt(kPluginsLengthScript, contents()); - EXPECT_EQ(maximum_length, 2); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[0].name);", - contents()), - "Xr1at27"); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[0].filename);", - contents()), - "SJEChw48ev3bNGD"); - EXPECT_EQ( - ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[0].description);", - contents()), - "rVqVqVqVqVKlSpUqVqVKlSJEChQIECh"); - EXPECT_EQ(ExecScriptGetInt( - "domAutomationController.send(navigator.plugins[0].length);", - contents()), - 1); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[0][0].type);", - contents()), - ""); - EXPECT_EQ( - ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[0][0].description);", - contents()), - "HDBAgQo0aNGDBgw48.fvXrVKFiRIkyZM"); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[1].name);", - contents()), - "8.fPHDhw"); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[1].filename);", - contents()), - "06du37du3bt2bNmT"); - EXPECT_EQ( - ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[1].description);", - contents()), - "BgwYMmTpUq1aNmTJky5cOnTp069ePnTp"); - EXPECT_EQ(ExecScriptGetInt( - "domAutomationController.send(navigator.plugins[1].length);", - contents()), - 1); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[1][0].type);", - contents()), - ""); - EXPECT_EQ( - ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[1][0].description);", - contents()), - "qVKly58ePHDBgQoUqVKFix48.fvXLlSJ"); -} - -// Tests that names of built-in plugins get farbled by default -// https://github.com/brave/brave-browser/issues/10597 -IN_PROC_BROWSER_TEST_F(BraveNavigatorPluginsFarblingBrowserTest, - FarbleNavigatorPluginsBuiltin) { - // Farbling level: off - AllowFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); - int off_length = ExecScriptGetInt(kPluginsLengthScript, contents()); - EXPECT_EQ(off_length, 2); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[0].name);", - contents()), - "Chrome PDF Plugin"); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[1].name);", - contents()), - "Chrome PDF Viewer"); - - // Farbling level: balanced (default) - SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(farbling_url()); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[1].name);", - contents()), - "Brave PDF plug in"); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[2].name);", - contents()), - "Chrome PDF and PS plug-in"); -} - -// Tests that names of built-in plugins that get farbled will reset to their -// original names when fingerprinting is turned off -// https://github.com/brave/brave-browser/issues/11278 -IN_PROC_BROWSER_TEST_F(BraveNavigatorPluginsFarblingBrowserTest, - FarbleNavigatorPluginsReset) { - // Farbling level: balanced (default) - SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(farbling_url()); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[1].name);", - contents()), - "Brave PDF plug in"); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[2].name);", - contents()), - "Chrome PDF and PS plug-in"); - - // Farbling level: off - AllowFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); - int off_length = ExecScriptGetInt(kPluginsLengthScript, contents()); - EXPECT_EQ(off_length, 2); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[0].name);", - contents()), - "Chrome PDF Plugin"); - EXPECT_EQ(ExecScriptGetStr( - "domAutomationController.send(navigator.plugins[1].name);", - contents()), - "Chrome PDF Viewer"); -} diff --git a/chromium_src/third_party/blink/renderer/core/page/plugin_data.h b/chromium_src/third_party/blink/renderer/core/page/plugin_data.h deleted file mode 100644 index 5fc591ef49eb..000000000000 --- a/chromium_src/third_party/blink/renderer/core/page/plugin_data.h +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2020 The Brave Authors. All rights reserved. - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef BRAVE_CHROMIUM_SRC_THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_PLUGIN_DATA_H_ -#define BRAVE_CHROMIUM_SRC_THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_PLUGIN_DATA_H_ - -#define BRAVE_PLUGIN_DATA_H \ - void SetName(const String& new_name) { name_ = new_name; } \ - void SetFilename(const String& new_filename) { filename_ = new_filename; } - -#include "../../../../../../../third_party/blink/renderer/core/page/plugin_data.h" - -#undef BRAVE_PLUGIN_DATA_H - -#endif // BRAVE_CHROMIUM_SRC_THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_PLUGIN_DATA_H_ diff --git a/chromium_src/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc b/chromium_src/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc deleted file mode 100644 index 04088e99edb7..000000000000 --- a/chromium_src/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc +++ /dev/null @@ -1,147 +0,0 @@ -/* Copyright (c) 2020 The Brave Authors. All rights reserved. - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include - -#include "brave/third_party/blink/renderer/brave_farbling_constants.h" -#include "third_party/blink/public/platform/web_content_settings_client.h" -#include "third_party/blink/renderer/core/execution_context/execution_context.h" -#include "third_party/blink/renderer/core/frame/local_dom_window.h" -#include "third_party/blink/renderer/core/frame/local_frame.h" -#include "third_party/blink/renderer/core/page/plugin_data.h" -#include "third_party/blink/renderer/modules/plugins/dom_plugin.h" -#include "third_party/blink/renderer/modules/plugins/dom_plugin_array.h" -#include "third_party/blink/renderer/platform/heap/heap.h" -#include "third_party/blink/renderer/platform/wtf/text/string_builder.h" -#include "third_party/blink/renderer/platform/wtf/vector.h" - -using blink::DOMPlugin; -using blink::DOMPluginArray; -using blink::HeapVector; -using blink::LocalFrame; -using blink::MakeGarbageCollected; -using blink::Member; -using blink::MimeClassInfo; -using blink::PluginInfo; -using WTF::String; -using WTF::StringBuilder; - -namespace brave { - -String PluginReplacementName(std::mt19937_64* prng) { - std::vector chrome{"Chrome ", "Chromium ", "Brave ", - "Web ", "Browser ", "OpenSource ", - "Online ", "JavaScript ", ""}; - std::vector pdf{"PDF ", - "Portable Document Format ", - "portable-document-format ", - "document ", - "doc ", - "PDF and PS ", - "com.adobe.pdf "}; - std::vector viewer{"Viewer", "Renderer", "Display", "Plugin", - "plug-in", "plug in", "extension", ""}; - StringBuilder result; - result.Append(chrome[(*prng)() % chrome.size()]); - result.Append(pdf[(*prng)() % pdf.size()]); - result.Append(viewer[(*prng)() % viewer.size()]); - return result.ToString(); -} - -void FarblePlugins(DOMPluginArray* owner, - HeapVector>* dom_plugins) { - if (!owner->DomWindow()) - return; - LocalFrame* frame = owner->DomWindow()->GetFrame(); - if (!frame || !frame->GetContentSettingsClient()) - return; - switch (frame->GetContentSettingsClient()->GetBraveFarblingLevel()) { - case BraveFarblingLevel::OFF: { - break; - } - case BraveFarblingLevel::MAXIMUM: { - dom_plugins->clear(); - // "Maximum" behavior is clear existing plugins + "balanced" behavior, - // so fall through here. - U_FALLTHROUGH; - } - case BraveFarblingLevel::BALANCED: { - std::mt19937_64 prng = BraveSessionCache::From(*(frame->DomWindow())) - .MakePseudoRandomGenerator(); - // The item() method will populate plugin info if any item of - // |dom_plugins_| is null, but when it tries, it assumes the - // length of |dom_plugins_| == the length of the underlying - // GetPluginData()->Plugins(). Once we add our fake plugins, that - // assumption will break and the item() method will crash with an - // out-of-bounds array access. Rather than patch the item() method, we - // ensure that the cache is fully populated now while the assumptions - // still hold, so the problematic code is never executed later. - for (unsigned index = 0; index < dom_plugins->size(); index++) { - auto plugin = frame->GetPluginData()->Plugins()[index]; - String name = plugin->Name(); - // Built-in plugins get their names and descriptions farbled as well. - if ((name == "Chrome PDF Plugin") || (name == "Chrome PDF Viewer")) { - plugin->SetName(PluginReplacementName(&prng)); - plugin->SetFilename( - BraveSessionCache::From(*(frame->DomWindow())) - .GenerateRandomString(plugin->Filename().Ascii(), 32)); - } - (*dom_plugins)[index] = - MakeGarbageCollected(frame->DomWindow(), *plugin); - } - // Add fake plugin #1. - auto* fake_plugin_info_1 = MakeGarbageCollected( - BraveSessionCache::From(*(frame->DomWindow())) - .GenerateRandomString("PLUGIN_1_NAME", 8), - BraveSessionCache::From(*(frame->DomWindow())) - .GenerateRandomString("PLUGIN_1_FILENAME", 16), - BraveSessionCache::From(*(frame->DomWindow())) - .GenerateRandomString("PLUGIN_1_DESCRIPTION", 32), - 0, false); - auto* fake_mime_info_1 = MakeGarbageCollected( - "", - BraveSessionCache::From(*(frame->DomWindow())) - .GenerateRandomString("MIME_1_DESCRIPTION", 32), - *fake_plugin_info_1); - fake_plugin_info_1->AddMimeType(fake_mime_info_1); - auto* fake_dom_plugin_1 = MakeGarbageCollected( - frame->DomWindow(), *fake_plugin_info_1); - dom_plugins->push_back(fake_dom_plugin_1); - // Add fake plugin #2. - auto* fake_plugin_info_2 = MakeGarbageCollected( - BraveSessionCache::From(*(frame->DomWindow())) - .GenerateRandomString("PLUGIN_2_NAME", 7), - BraveSessionCache::From(*(frame->DomWindow())) - .GenerateRandomString("PLUGIN_2_FILENAME", 15), - BraveSessionCache::From(*(frame->DomWindow())) - .GenerateRandomString("PLUGIN_2_DESCRIPTION", 31), - 0, false); - auto* fake_mime_info_2 = MakeGarbageCollected( - "", - BraveSessionCache::From(*(frame->DomWindow())) - .GenerateRandomString("MIME_2_DESCRIPTION", 32), - *fake_plugin_info_2); - fake_plugin_info_2->AddMimeType(fake_mime_info_2); - auto* fake_dom_plugin_2 = MakeGarbageCollected( - frame->DomWindow(), *fake_plugin_info_2); - dom_plugins->push_back(fake_dom_plugin_2); - // Shuffle the list of plugins pseudo-randomly, based on the domain key. - std::shuffle(dom_plugins->begin(), dom_plugins->end(), prng); - break; - } - default: - NOTREACHED(); - } -} - -} // namespace brave - -#define BRAVE_DOM_PLUGINS_UPDATE_PLUGIN_DATA \ - data->ResetPluginData(); \ - brave::FarblePlugins(this, &dom_plugins_); - -#include "../../../../../../../third_party/blink/renderer/modules/plugins/dom_plugin_array.cc" - -#undef BRAVE_DOM_PLUGIN_ARRAY_GET_PLUGIN_DATA diff --git a/patches/third_party-blink-renderer-core-page-plugin_data.h.patch b/patches/third_party-blink-renderer-core-page-plugin_data.h.patch deleted file mode 100644 index e5e1d862a772..000000000000 --- a/patches/third_party-blink-renderer-core-page-plugin_data.h.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/third_party/blink/renderer/core/page/plugin_data.h b/third_party/blink/renderer/core/page/plugin_data.h -index fe5aa20243d89ea6a0f1cecb5ea00846607c6d39..7363a4dab1c30ab26fc57b2d546b77564b359e0b 100644 ---- a/third_party/blink/renderer/core/page/plugin_data.h -+++ b/third_party/blink/renderer/core/page/plugin_data.h -@@ -1,4 +1,3 @@ -- - /* - Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - -@@ -76,6 +75,7 @@ class CORE_EXPORT PluginInfo final : public GarbageCollected { - Color BackgroundColor() const { return background_color_; } - bool MayUseExternalHandler() const { return may_use_external_handler_; } - -+ BRAVE_PLUGIN_DATA_H - private: - friend class MimeClassInfo; - friend class PluginData; diff --git a/patches/third_party-blink-renderer-modules-plugins-dom_plugin_array.cc.patch b/patches/third_party-blink-renderer-modules-plugins-dom_plugin_array.cc.patch deleted file mode 100644 index c3b5496ecb48..000000000000 --- a/patches/third_party-blink-renderer-modules-plugins-dom_plugin_array.cc.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc b/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc -index d75bf82ee420aa67fed211284da20934a6ace39a..c81fac42874465155847109cf629d4e28824ef0a 100644 ---- a/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc -+++ b/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc -@@ -154,6 +154,7 @@ void DOMPluginArray::UpdatePluginData() { - } - } - } -+ BRAVE_DOM_PLUGINS_UPDATE_PLUGIN_DATA - } - - void DOMPluginArray::ContextDestroyed() {