| Index: chrome/browser/chrome_elf_init_win.cc
|
| diff --git a/chrome/browser/chrome_elf_init_win.cc b/chrome/browser/chrome_elf_init_win.cc
|
| deleted file mode 100644
|
| index c400196fc056a18d137bfdc847f35995457a9929..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chrome_elf_init_win.cc
|
| +++ /dev/null
|
| @@ -1,208 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include <stddef.h>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/metrics/field_trial.h"
|
| -#include "base/metrics/histogram.h"
|
| -#include "base/metrics/sparse_histogram.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "base/win/registry.h"
|
| -#include "chrome/browser/chrome_elf_init_win.h"
|
| -#include "chrome/common/chrome_version.h"
|
| -#include "chrome_elf/blacklist/blacklist.h"
|
| -#include "chrome_elf/chrome_elf_constants.h"
|
| -#include "chrome_elf/dll_hash/dll_hash.h"
|
| -#include "components/variations/variations_associated_data.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -
|
| -const char kBrowserBlacklistTrialName[] = "BrowserBlacklist";
|
| -const char kBrowserBlacklistTrialDisabledGroupName[] = "NoBlacklist";
|
| -
|
| -namespace {
|
| -
|
| -// How long to wait, in seconds, before reporting for the second (and last
|
| -// time), what dlls were blocked from the browser process.
|
| -const int kBlacklistReportingDelaySec = 600;
|
| -
|
| -// This enum is used to define the buckets for an enumerated UMA histogram.
|
| -// Hence,
|
| -// (a) existing enumerated constants should never be deleted or reordered, and
|
| -// (b) new constants should only be appended in front of
|
| -// BLACKLIST_SETUP_EVENT_MAX.
|
| -enum BlacklistSetupEventType {
|
| - // The blacklist beacon has placed to enable the browser blacklisting.
|
| - BLACKLIST_SETUP_ENABLED = 0,
|
| -
|
| - // The blacklist was successfully enabled.
|
| - BLACKLIST_SETUP_RAN_SUCCESSFULLY,
|
| -
|
| - // The blacklist setup code failed to execute.
|
| - BLACKLIST_SETUP_FAILED,
|
| -
|
| - // The blacklist thunk setup code failed. This is probably an indication
|
| - // that something else patched that code first.
|
| - BLACKLIST_THUNK_SETUP_FAILED,
|
| -
|
| - // Deprecated. The blacklist interception code failed to execute.
|
| - BLACKLIST_INTERCEPTION_FAILED,
|
| -
|
| - // The blacklist was disabled for this run (after it failed too many times).
|
| - BLACKLIST_SETUP_DISABLED,
|
| -
|
| - // Always keep this at the end.
|
| - BLACKLIST_SETUP_EVENT_MAX,
|
| -};
|
| -
|
| -void RecordBlacklistSetupEvent(BlacklistSetupEventType blacklist_setup_event) {
|
| - UMA_HISTOGRAM_ENUMERATION("Blacklist.Setup",
|
| - blacklist_setup_event,
|
| - BLACKLIST_SETUP_EVENT_MAX);
|
| -}
|
| -
|
| -// Report which DLLs were prevented from being loaded.
|
| -void ReportSuccessfulBlocks() {
|
| - // Figure out how many dlls were blocked.
|
| - int num_blocked_dlls = 0;
|
| - blacklist::SuccessfullyBlocked(NULL, &num_blocked_dlls);
|
| -
|
| - if (num_blocked_dlls == 0)
|
| - return;
|
| -
|
| - // Now retrieve the list of blocked dlls.
|
| - std::vector<const wchar_t*> blocked_dlls(num_blocked_dlls);
|
| - blacklist::SuccessfullyBlocked(&blocked_dlls[0], &num_blocked_dlls);
|
| -
|
| - // Send up the hashes of the blocked dlls via UMA.
|
| - for (size_t i = 0; i < blocked_dlls.size(); ++i) {
|
| - std::string dll_name_utf8;
|
| - base::WideToUTF8(blocked_dlls[i], wcslen(blocked_dlls[i]), &dll_name_utf8);
|
| - int uma_hash = DllNameToHash(dll_name_utf8);
|
| -
|
| - UMA_HISTOGRAM_SPARSE_SLOWLY("Blacklist.Blocked", uma_hash);
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -void InitializeChromeElf() {
|
| - if (base::FieldTrialList::FindFullName(kBrowserBlacklistTrialName) ==
|
| - kBrowserBlacklistTrialDisabledGroupName) {
|
| - // Disable the blacklist for all future runs by removing the beacon.
|
| - base::win::RegKey blacklist_registry_key(HKEY_CURRENT_USER);
|
| - blacklist_registry_key.DeleteKey(blacklist::kRegistryBeaconPath);
|
| - } else {
|
| - AddFinchBlacklistToRegistry();
|
| - BrowserBlacklistBeaconSetup();
|
| - }
|
| -
|
| - // Report all successful blacklist interceptions.
|
| - ReportSuccessfulBlocks();
|
| -
|
| - // Schedule another task to report all successful interceptions later.
|
| - // This time delay should be long enough to catch any dlls that attempt to
|
| - // inject after Chrome has started up.
|
| - content::BrowserThread::PostDelayedTask(
|
| - content::BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(&ReportSuccessfulBlocks),
|
| - base::TimeDelta::FromSeconds(kBlacklistReportingDelaySec));
|
| -}
|
| -
|
| -// Note that running multiple chrome instances with distinct user data
|
| -// directories could lead to deletion (and/or replacement) of the finch
|
| -// blacklist registry data in one instance before the second has a chance to
|
| -// read those values.
|
| -void AddFinchBlacklistToRegistry() {
|
| - base::win::RegKey finch_blacklist_registry_key(
|
| - HKEY_CURRENT_USER, blacklist::kRegistryFinchListPath, KEY_SET_VALUE);
|
| -
|
| - // No point in trying to continue if the registry key isn't valid.
|
| - if (!finch_blacklist_registry_key.Valid())
|
| - return;
|
| -
|
| - // Delete and recreate the key to clear the registry.
|
| - finch_blacklist_registry_key.DeleteKey(L"");
|
| - finch_blacklist_registry_key.Create(
|
| - HKEY_CURRENT_USER, blacklist::kRegistryFinchListPath, KEY_SET_VALUE);
|
| -
|
| - std::map<std::string, std::string> params;
|
| - variations::GetVariationParams(kBrowserBlacklistTrialName, ¶ms);
|
| -
|
| - for (std::map<std::string, std::string>::iterator it = params.begin();
|
| - it != params.end();
|
| - ++it) {
|
| - std::wstring name = base::UTF8ToWide(it->first);
|
| - std::wstring val = base::UTF8ToWide(it->second);
|
| -
|
| - finch_blacklist_registry_key.WriteValue(name.c_str(), val.c_str());
|
| - }
|
| -}
|
| -
|
| -void BrowserBlacklistBeaconSetup() {
|
| - base::win::RegKey blacklist_registry_key(HKEY_CURRENT_USER,
|
| - blacklist::kRegistryBeaconPath,
|
| - KEY_QUERY_VALUE | KEY_SET_VALUE);
|
| -
|
| - // No point in trying to continue if the registry key isn't valid.
|
| - if (!blacklist_registry_key.Valid())
|
| - return;
|
| -
|
| - // Record the results of the last blacklist setup.
|
| - DWORD blacklist_state = blacklist::BLACKLIST_STATE_MAX;
|
| - blacklist_registry_key.ReadValueDW(blacklist::kBeaconState, &blacklist_state);
|
| -
|
| - if (blacklist_state == blacklist::BLACKLIST_ENABLED) {
|
| - // The blacklist setup didn't crash, so we report if it was enabled or not.
|
| - if (blacklist::IsBlacklistInitialized()) {
|
| - RecordBlacklistSetupEvent(BLACKLIST_SETUP_RAN_SUCCESSFULLY);
|
| - } else {
|
| - // The only way for the blacklist to be enabled, but not fully
|
| - // initialized is if the thunk setup failed. See blacklist.cc
|
| - // for more details.
|
| - RecordBlacklistSetupEvent(BLACKLIST_THUNK_SETUP_FAILED);
|
| - }
|
| -
|
| - // Regardless of if the blacklist was fully enabled or not, report how many
|
| - // times we had to try to set it up.
|
| - DWORD attempt_count = 0;
|
| - blacklist_registry_key.ReadValueDW(blacklist::kBeaconAttemptCount,
|
| - &attempt_count);
|
| - UMA_HISTOGRAM_COUNTS_100("Blacklist.RetryAttempts.Success", attempt_count);
|
| - } else if (blacklist_state == blacklist::BLACKLIST_SETUP_FAILED) {
|
| - // We can set the state to disabled without checking that the maximum number
|
| - // of attempts was exceeded because blacklist.cc has already done this.
|
| - RecordBlacklistSetupEvent(BLACKLIST_SETUP_FAILED);
|
| - blacklist_registry_key.WriteValue(blacklist::kBeaconState,
|
| - blacklist::BLACKLIST_DISABLED);
|
| - } else if (blacklist_state == blacklist::BLACKLIST_DISABLED) {
|
| - RecordBlacklistSetupEvent(BLACKLIST_SETUP_DISABLED);
|
| - }
|
| -
|
| - // Find the last recorded blacklist version.
|
| - base::string16 blacklist_version;
|
| - blacklist_registry_key.ReadValue(blacklist::kBeaconVersion,
|
| - &blacklist_version);
|
| -
|
| - if (blacklist_version != TEXT(CHROME_VERSION_STRING)) {
|
| - // The blacklist hasn't been enabled for this version yet, so enable it
|
| - // and reset the failure count to zero.
|
| - LONG set_version = blacklist_registry_key.WriteValue(
|
| - blacklist::kBeaconVersion,
|
| - TEXT(CHROME_VERSION_STRING));
|
| -
|
| - LONG set_state = blacklist_registry_key.WriteValue(
|
| - blacklist::kBeaconState,
|
| - blacklist::BLACKLIST_ENABLED);
|
| -
|
| - blacklist_registry_key.WriteValue(blacklist::kBeaconAttemptCount,
|
| - static_cast<DWORD>(0));
|
| -
|
| - // Only report the blacklist as getting setup when both registry writes
|
| - // succeed, since otherwise the blacklist wasn't properly setup.
|
| - if (set_version == ERROR_SUCCESS && set_state == ERROR_SUCCESS)
|
| - RecordBlacklistSetupEvent(BLACKLIST_SETUP_ENABLED);
|
| - }
|
| -}
|
|
|