Commit 46729f08 authored by Robert Shield's avatar Robert Shield Committed by Commit Bot

Remove much of the no-longer-used module verifier code.

Bug: 747557
Change-Id: I2997faa2de1cb384287afc5d4eb23c352b8ea7a5
Reviewed-on: https://chromium-review.googlesource.com/1157864Reviewed-by: default avatarChris Sharp <csharp@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Commit-Queue: Avi Drissman <avi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#580665}
parent 4d7aa7ab
...@@ -590,12 +590,6 @@ jumbo_split_static_library("browser") { ...@@ -590,12 +590,6 @@ jumbo_split_static_library("browser") {
"infobars/infobar_responder.h", "infobars/infobar_responder.h",
"infobars/infobar_service.cc", "infobars/infobar_service.cc",
"infobars/infobar_service.h", "infobars/infobar_service.h",
"install_verification/win/install_verification.cc",
"install_verification/win/install_verification.h",
"install_verification/win/loaded_module_verification.cc",
"install_verification/win/loaded_module_verification.h",
"install_verification/win/module_ids.cc",
"install_verification/win/module_ids.h",
"install_verification/win/module_info.h", "install_verification/win/module_info.h",
"install_verification/win/module_list.cc", "install_verification/win/module_list.cc",
"install_verification/win/module_list.h", "install_verification/win/module_list.h",
......
...@@ -40,7 +40,6 @@ ...@@ -40,7 +40,6 @@
#include "chrome/browser/conflicts/module_database_win.h" #include "chrome/browser/conflicts/module_database_win.h"
#include "chrome/browser/conflicts/module_event_sink_impl_win.h" #include "chrome/browser/conflicts/module_event_sink_impl_win.h"
#include "chrome/browser/first_run/first_run.h" #include "chrome/browser/first_run/first_run.h"
#include "chrome/browser/install_verification/win/install_verification.h"
#include "chrome/browser/memory/swap_thrashing_monitor.h" #include "chrome/browser/memory/swap_thrashing_monitor.h"
#include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_shortcut_manager.h" #include "chrome/browser/profiles/profile_shortcut_manager.h"
...@@ -550,18 +549,6 @@ void ChromeBrowserMainPartsWin::PostBrowserStart() { ...@@ -550,18 +549,6 @@ void ChromeBrowserMainPartsWin::PostBrowserStart() {
UMA_HISTOGRAM_BOOLEAN("Windows.Tablet", UMA_HISTOGRAM_BOOLEAN("Windows.Tablet",
base::win::IsTabletDevice(nullptr, ui::GetHiddenWindow())); base::win::IsTabletDevice(nullptr, ui::GetHiddenWindow()));
// Set up a task to verify installed modules in the current process.
// TODO(gab): Use base::PostTaskWithTraits() directly when we're convinced
// BACKGROUND work doesn't interfere with startup (i.e.
// https://crbug.com/726937).
// TODO(robertshield): remove this altogether, https://crbug.com/747557.
content::BrowserThread::PostAfterStartupTask(
FROM_HERE,
base::CreateTaskRunnerWithTraits(
{base::TaskPriority::BEST_EFFORT,
base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}),
base::Bind(&VerifyInstallation));
InitializeChromeElf(); InitializeChromeElf();
// Reset settings for the current profile if it's tagged to be reset after a // Reset settings for the current profile if it's tagged to be reset after a
......
// Copyright 2013 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 "chrome/browser/install_verification/win/install_verification.h"
#include <stddef.h>
#include <windows.h>
#include <set>
#include <vector>
#include "base/files/file_path.h"
#include "base/metrics/histogram_functions.h"
#include "base/process/process.h"
#include "base/process/process_handle.h"
#include "base/strings/string_util.h"
#include "base/strings/sys_string_conversions.h"
#include "chrome/browser/install_verification/win/loaded_module_verification.h"
#include "chrome/browser/install_verification/win/module_ids.h"
#include "chrome/browser/install_verification/win/module_info.h"
#include "chrome/browser/install_verification/win/module_verification_common.h"
#include "components/variations/hashing.h"
namespace {
void ReportModuleMatch(size_t module_id) {
base::UmaHistogramSparse("InstallVerifier.ModuleMatch", module_id);
}
base::FilePath GetExeFilePathForProcess(const base::Process& process) {
wchar_t exe_name[MAX_PATH];
DWORD exe_name_len = arraysize(exe_name);
// Note: requesting the Win32 path format.
if (::QueryFullProcessImageName(process.Handle(), 0, exe_name,
&exe_name_len) == 0) {
DPLOG(ERROR) << "Failed to get executable name for process";
return base::FilePath();
}
// QueryFullProcessImageName's documentation does not specify behavior when
// the buffer is too small, but we know that GetModuleFileNameEx succeeds and
// truncates the returned name in such a case. Given that paths of arbitrary
// length may exist, the conservative approach is to reject names when
// the returned length is that of the buffer.
if (exe_name_len > 0 && exe_name_len < arraysize(exe_name))
return base::FilePath(exe_name);
return base::FilePath();
}
void ReportParentProcessName() {
base::ProcessId ppid =
base::GetParentProcessId(base::GetCurrentProcessHandle());
base::Process process(
base::Process::OpenWithAccess(ppid, PROCESS_QUERY_LIMITED_INFORMATION));
uint32_t hash = 0U;
if (process.IsValid()) {
base::FilePath path(GetExeFilePathForProcess(process));
if (!path.empty()) {
std::string ascii_path(base::SysWideToUTF8(path.BaseName().value()));
DCHECK(base::IsStringASCII(ascii_path));
hash = variations::HashName(base::ToLowerASCII(ascii_path));
}
}
base::UmaHistogramSparse("Windows.ParentProcessNameHash", hash);
}
} // namespace
void VerifyInstallation() {
ReportParentProcessName();
ModuleIDs module_ids;
LoadModuleIDs(&module_ids);
std::set<ModuleInfo> loaded_modules;
if (GetLoadedModules(&loaded_modules)) {
VerifyLoadedModules(loaded_modules, module_ids, &ReportModuleMatch);
}
}
// Copyright 2013 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.
#ifndef CHROME_BROWSER_INSTALL_VERIFICATION_WIN_INSTALL_VERIFICATION_H_
#define CHROME_BROWSER_INSTALL_VERIFICATION_WIN_INSTALL_VERIFICATION_H_
// Starts a background process to verify the Chrome installation. Results are
// reported via UMA.
void VerifyInstallation();
#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_INSTALL_VERIFICATION_H_
// Copyright 2013 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 "chrome/browser/install_verification/win/loaded_module_verification.h"
#include <algorithm>
#include <iterator>
#include <string>
#include "chrome/browser/install_verification/win/module_ids.h"
#include "chrome/browser/install_verification/win/module_info.h"
namespace {
std::string ExtractModuleNameDigest(const ModuleInfo& module_info) {
return CalculateModuleNameDigest(module_info.name);
}
} // namespace
void VerifyLoadedModules(const std::set<ModuleInfo>& loaded_modules,
const ModuleIDs& module_ids,
ModuleVerificationDelegate* delegate) {
std::vector<std::string> module_name_digests;
std::transform(loaded_modules.begin(),
loaded_modules.end(),
std::back_inserter(module_name_digests),
&ExtractModuleNameDigest);
ReportModuleMatches(module_name_digests, module_ids, delegate);
}
// Copyright 2013 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.
#ifndef CHROME_BROWSER_INSTALL_VERIFICATION_WIN_LOADED_MODULE_VERIFICATION_H_
#define CHROME_BROWSER_INSTALL_VERIFICATION_WIN_LOADED_MODULE_VERIFICATION_H_
#include <set>
#include "chrome/browser/install_verification/win/module_ids.h"
#include "chrome/browser/install_verification/win/module_verification_common.h"
struct ModuleInfo;
// Verifies the provided |loaded_modules| info against the expected
// |module_ids|. Reports results to |delegate|.
void VerifyLoadedModules(const std::set<ModuleInfo>& loaded_modules,
const ModuleIDs& module_ids,
ModuleVerificationDelegate* delegate);
#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_LOADED_MODULE_VERIFICATION_H_
// Copyright 2013 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 "chrome/browser/install_verification/win/loaded_module_verification.h"
#include "chrome/browser/install_verification/win/module_verification_test.h"
#include "testing/gtest/include/gtest/gtest.h"
class LoadedModuleVerificationTest : public ModuleVerificationTest { };
TEST_F(LoadedModuleVerificationTest, TestCase) {
std::set<ModuleInfo> loaded_modules;
ModuleIDs empty_modules_of_interest;
ModuleIDs non_matching_modules_of_interest;
ModuleIDs matching_modules_of_interest;
matching_modules_of_interest.insert(
std::make_pair(CalculateModuleNameDigest(L"fancy_pants.dll"), 999u));
matching_modules_of_interest.insert(
std::make_pair(CalculateModuleNameDigest(L"advapi32.dll"), 666u));
matching_modules_of_interest.insert(
std::make_pair(CalculateModuleNameDigest(L"unit_tests.exe"), 777u));
matching_modules_of_interest.insert(
std::make_pair(CalculateModuleNameDigest(L"user32.dll"), 888u));
non_matching_modules_of_interest.insert(
std::make_pair(CalculateModuleNameDigest(L"fancy_pants.dll"), 999u));
// With empty loaded_modules, nothing matches.
VerifyLoadedModules(loaded_modules,
empty_modules_of_interest,
&ModuleVerificationTest::ReportModule);
ASSERT_TRUE(reported_module_ids_.empty());
VerifyLoadedModules(loaded_modules,
non_matching_modules_of_interest,
&ModuleVerificationTest::ReportModule);
ASSERT_TRUE(reported_module_ids_.empty());
VerifyLoadedModules(loaded_modules,
matching_modules_of_interest,
&ModuleVerificationTest::ReportModule);
ASSERT_TRUE(reported_module_ids_.empty());
// With populated loaded_modules, only the 'matching' module data gives a
// match.
ASSERT_TRUE(GetLoadedModuleInfoSet(&loaded_modules));
VerifyLoadedModules(loaded_modules,
empty_modules_of_interest,
&ModuleVerificationTest::ReportModule);
ASSERT_TRUE(reported_module_ids_.empty());
VerifyLoadedModules(loaded_modules,
non_matching_modules_of_interest,
&ModuleVerificationTest::ReportModule);
ASSERT_TRUE(reported_module_ids_.empty());
VerifyLoadedModules(loaded_modules,
matching_modules_of_interest,
&ModuleVerificationTest::ReportModule);
ASSERT_EQ(3u, reported_module_ids_.size());
ASSERT_NE(reported_module_ids_.end(), reported_module_ids_.find(666u));
ASSERT_NE(reported_module_ids_.end(), reported_module_ids_.find(777u));
ASSERT_NE(reported_module_ids_.end(), reported_module_ids_.find(888u));
}
// Copyright 2013 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 "chrome/browser/install_verification/win/module_ids.h"
#include <utility>
#include "base/logging.h"
#include "base/macros.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_tokenizer.h"
#include "base/strings/string_util.h"
#include "chrome/grit/browser_resources.h"
#include "ui/base/resource/resource_bundle.h"
namespace {
struct { size_t id; const char* module_name_digest; }
kExpectedInstallModules[] = {
{1u, "c8cc47613e155f2129f480c6ced84549"}, // chrome.dll
{2u, "49b78a23b0d8d5d8fb60d4e472b22764"}, // chrome_child.dll
};
// Parses a line consisting of a positive decimal number and a 32-digit
// hexadecimal number, separated by a space. Inserts the output, if valid, into
// |module_ids|. Unexpected leading or trailing characters will cause
// the line to be ignored, as will invalid decimal/hexadecimal characters.
void ParseAdditionalModuleID(
const base::StringPiece& line,
ModuleIDs* module_ids) {
DCHECK(module_ids);
base::CStringTokenizer line_tokenizer(line.begin(), line.end(), " ");
if (!line_tokenizer.GetNext())
return; // Empty string.
base::StringPiece id_piece(line_tokenizer.token_piece());
if (!line_tokenizer.GetNext())
return; // No delimiter (' ').
base::StringPiece digest_piece(line_tokenizer.token_piece());
if (line_tokenizer.GetNext())
return; // Unexpected trailing characters.
unsigned id = 0;
if (!StringToUint(id_piece, &id))
return; // First token was not decimal.
if (digest_piece.length() != 32)
return; // Second token is not the right length.
for (base::StringPiece::const_iterator it = digest_piece.begin();
it != digest_piece.end(); ++it) {
if (!base::IsHexDigit(*it))
return; // Second token has invalid characters.
}
// This is a valid line.
module_ids->insert(std::make_pair(digest_piece.as_string(), id));
}
} // namespace
void ParseAdditionalModuleIDs(
const base::StringPiece& raw_data,
ModuleIDs* module_ids) {
DCHECK(module_ids);
base::CStringTokenizer file_tokenizer(raw_data.begin(),
raw_data.end(),
"\r\n");
while (file_tokenizer.GetNext()) {
ParseAdditionalModuleID(base::StringPiece(file_tokenizer.token_piece()),
module_ids);
}
}
void LoadModuleIDs(ModuleIDs* module_ids) {
for (size_t i = 0; i < arraysize(kExpectedInstallModules); ++i) {
module_ids->insert(
std::make_pair(
kExpectedInstallModules[i].module_name_digest,
kExpectedInstallModules[i].id));
}
base::StringPiece additional_module_ids;
#if defined(GOOGLE_CHROME_BUILD)
additional_module_ids =
ui::ResourceBundle::GetSharedInstance().GetRawDataResource(
IDR_ADDITIONAL_MODULE_IDS);
#endif
ParseAdditionalModuleIDs(additional_module_ids, module_ids);
}
// Copyright 2013 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.
#ifndef CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_IDS_H_
#define CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_IDS_H_
#include <stddef.h>
#include <map>
#include <string>
#include "base/strings/string_piece.h"
typedef std::map<std::string, size_t> ModuleIDs;
// Parses a list of additional modules to verify. The data format is a series of
// lines. Each line starts with a decimal ID, then a module name digest,
// separated by a space. Lines are terminated by \r and/or \n. Invalid lines are
// ignored.
//
// The result is a map of module name digests to module IDs.
void ParseAdditionalModuleIDs(
const base::StringPiece& raw_data,
ModuleIDs* module_ids);
// Loads standard module IDs and additional module IDs from a resource.
void LoadModuleIDs(ModuleIDs* module_ids);
#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_IDS_H_
// Copyright 2013 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 "chrome/browser/install_verification/win/module_ids.h"
#include "base/strings/string_piece.h"
#include "chrome/browser/install_verification/win/module_verification_common.h"
#include "testing/gtest/include/gtest/gtest.h"
TEST(ModuleIDsTest, LoadModuleIDs) {
ModuleIDs module_ids;
LoadModuleIDs(&module_ids);
ASSERT_EQ(1u, module_ids[CalculateModuleNameDigest(L"chrome.dll")]);
}
TEST(ModuleIDsTest, ParseAdditionalModuleIDs) {
ModuleIDs module_ids;
ParseAdditionalModuleIDs(base::StringPiece(), &module_ids);
ASSERT_EQ(0u, module_ids.size());
// Invalid input.
ParseAdditionalModuleIDs("hello", &module_ids);
ASSERT_EQ(0u, module_ids.size());
ParseAdditionalModuleIDs("hello world", &module_ids);
ASSERT_EQ(0u, module_ids.size());
ParseAdditionalModuleIDs("hello world\nfoo bar", &module_ids);
ASSERT_EQ(0u, module_ids.size());
ParseAdditionalModuleIDs("123 world\nfoo bar", &module_ids);
ASSERT_EQ(0u, module_ids.size());
ParseAdditionalModuleIDs("hello 0123456789abcdef0123456789abcdef\nfoo bar",
&module_ids);
ASSERT_EQ(0u, module_ids.size());
// A single valid line followed by an invalid line.
ParseAdditionalModuleIDs("123 0123456789abcdef0123456789abcdef\nfoo bar",
&module_ids);
ASSERT_EQ(1u, module_ids.size());
ASSERT_EQ(123u, module_ids.begin()->second);
ASSERT_EQ("0123456789abcdef0123456789abcdef", module_ids.begin()->first);
module_ids.clear();
// The same, but with \r\n.
ParseAdditionalModuleIDs("123 0123456789abcdef0123456789abcdef\r\nfoo bar",
&module_ids);
ASSERT_EQ(1u, module_ids.size());
ASSERT_EQ(123u, module_ids.begin()->second);
ASSERT_EQ("0123456789abcdef0123456789abcdef", module_ids.begin()->first);
module_ids.clear();
// Several valid and invalid lines, with varying line terminations etc.
ParseAdditionalModuleIDs("123 0123456789abcdef0123456789abcdef\r\n"
"456 DEADBEEFDEADBEEF\r"
"789 DEADBEEFDEADBEEFDEADBEEFDEADBEEF\n"
"\n"
"\n"
"321 BAADCAFEBAADCAFEBAADCAFEBAADCAFE\n",
&module_ids);
ASSERT_EQ(3u, module_ids.size());
ASSERT_EQ(123u, module_ids["0123456789abcdef0123456789abcdef"]);
ASSERT_EQ(789u, module_ids["DEADBEEFDEADBEEFDEADBEEFDEADBEEF"]);
ASSERT_EQ(321u, module_ids["BAADCAFEBAADCAFEBAADCAFEBAADCAFE"]);
module_ids.clear();
// Leading empty lines, no termination on final line.
ParseAdditionalModuleIDs("\n"
"123 0123456789abcdef0123456789abcdef\r\n"
"321 BAADCAFEBAADCAFEBAADCAFEBAADCAFE",
&module_ids);
ASSERT_EQ(2u, module_ids.size());
ASSERT_EQ(123u, module_ids["0123456789abcdef0123456789abcdef"]);
ASSERT_EQ(321u, module_ids["BAADCAFEBAADCAFEBAADCAFEBAADCAFE"]);
module_ids.clear();
}
...@@ -12,11 +12,6 @@ ...@@ -12,11 +12,6 @@
#include "chrome/browser/install_verification/win/module_info.h" #include "chrome/browser/install_verification/win/module_info.h"
#include "chrome/browser/install_verification/win/module_list.h" #include "chrome/browser/install_verification/win/module_list.h"
std::string CalculateModuleNameDigest(const base::string16& module_name) {
return base::MD5String(base::ToLowerASCII(base::UTF16ToUTF8(
base::FilePath(module_name).BaseName().value())));
}
bool GetLoadedModules(std::set<ModuleInfo>* loaded_modules) { bool GetLoadedModules(std::set<ModuleInfo>* loaded_modules) {
std::vector<HMODULE> snapshot; std::vector<HMODULE> snapshot;
if (!base::win::GetLoadedModulesSnapshot(::GetCurrentProcess(), &snapshot)) if (!base::win::GetLoadedModulesSnapshot(::GetCurrentProcess(), &snapshot))
...@@ -26,13 +21,3 @@ bool GetLoadedModules(std::set<ModuleInfo>* loaded_modules) { ...@@ -26,13 +21,3 @@ bool GetLoadedModules(std::set<ModuleInfo>* loaded_modules) {
loaded_modules); loaded_modules);
return true; return true;
} }
void ReportModuleMatches(const std::vector<std::string>& module_name_digests,
const ModuleIDs& module_ids,
ModuleVerificationDelegate* delegate) {
for (size_t i = 0; i < module_name_digests.size(); ++i) {
ModuleIDs::const_iterator entry = module_ids.find(module_name_digests[i]);
if (entry != module_ids.end())
delegate(entry->second);
}
}
...@@ -11,25 +11,11 @@ ...@@ -11,25 +11,11 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "chrome/browser/install_verification/win/module_ids.h"
struct ModuleInfo; struct ModuleInfo;
// Calculates a canonical digest for |module_name|. Ignores case and strips path
// information if present.
std::string CalculateModuleNameDigest(const base::string16& module_name);
// Retrieves a ModuleInfo set representing all currenly loaded modules. Returns // Retrieves a ModuleInfo set representing all currenly loaded modules. Returns
// false in case of failure. // false in case of failure.
bool GetLoadedModules(std::set<ModuleInfo>* loaded_modules); bool GetLoadedModules(std::set<ModuleInfo>* loaded_modules);
// Receives notification of a module verification result.
typedef void (ModuleVerificationDelegate)(size_t module_id);
// For each module in |module_name_digests|, reports the associated ID from
// |module_ids|, if any, to |delegate|.
void ReportModuleMatches(const std::vector<std::string>& module_name_digests,
const ModuleIDs& module_ids,
ModuleVerificationDelegate* delegate);
#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_VERIFICATION_COMMON_H_ #endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_VERIFICATION_COMMON_H_
...@@ -2441,8 +2441,6 @@ test("unit_tests") { ...@@ -2441,8 +2441,6 @@ test("unit_tests") {
"../browser/history/history_tab_helper_unittest.cc", "../browser/history/history_tab_helper_unittest.cc",
"../browser/infobars/mock_infobar_service.cc", "../browser/infobars/mock_infobar_service.cc",
"../browser/infobars/mock_infobar_service.h", "../browser/infobars/mock_infobar_service.h",
"../browser/install_verification/win/loaded_module_verification_unittest.cc",
"../browser/install_verification/win/module_ids_unittest.cc",
"../browser/install_verification/win/module_info_unittest.cc", "../browser/install_verification/win/module_info_unittest.cc",
"../browser/install_verification/win/module_list_unittest.cc", "../browser/install_verification/win/module_list_unittest.cc",
"../browser/install_verification/win/module_verification_test.cc", "../browser/install_verification/win/module_verification_test.cc",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment