Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(309)

Side by Side Diff: chrome/browser/safe_browsing/database_manager.cc

Issue 611603002: Add the goog-unwanted-shavar list to a new SafeBrowsing PrefixSet. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Lots of additions + tests, still WIP Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/safe_browsing/database_manager.h" 5 #include "chrome/browser/safe_browsing/database_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 } 105 }
106 return safe_browsing_util::INVALID; 106 return safe_browsing_util::INVALID;
107 } 107 }
108 108
109 SBThreatType GetThreatTypeFromListType(safe_browsing_util::ListType list_type) { 109 SBThreatType GetThreatTypeFromListType(safe_browsing_util::ListType list_type) {
110 switch (list_type) { 110 switch (list_type) {
111 case safe_browsing_util::PHISH: 111 case safe_browsing_util::PHISH:
112 return SB_THREAT_TYPE_URL_PHISHING; 112 return SB_THREAT_TYPE_URL_PHISHING;
113 case safe_browsing_util::MALWARE: 113 case safe_browsing_util::MALWARE:
114 return SB_THREAT_TYPE_URL_MALWARE; 114 return SB_THREAT_TYPE_URL_MALWARE;
115 case safe_browsing_util::UNWANTEDURL:
116 return SB_THREAT_TYPE_URL_UNWANTED;
115 case safe_browsing_util::BINURL: 117 case safe_browsing_util::BINURL:
116 return SB_THREAT_TYPE_BINARY_MALWARE_URL; 118 return SB_THREAT_TYPE_BINARY_MALWARE_URL;
117 case safe_browsing_util::EXTENSIONBLACKLIST: 119 case safe_browsing_util::EXTENSIONBLACKLIST:
118 return SB_THREAT_TYPE_EXTENSION; 120 return SB_THREAT_TYPE_EXTENSION;
119 default: 121 default:
120 DVLOG(1) << "Unknown safe browsing list id " << list_type; 122 DVLOG(1) << "Unknown safe browsing list id " << list_type;
121 return SB_THREAT_TYPE_SAFE; 123 return SB_THREAT_TYPE_SAFE;
122 } 124 }
123 } 125 }
124 126
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 166
165 void SafeBrowsingDatabaseManager::Client::OnSafeBrowsingResult( 167 void SafeBrowsingDatabaseManager::Client::OnSafeBrowsingResult(
166 const SafeBrowsingCheck& check) { 168 const SafeBrowsingCheck& check) {
167 DCHECK_EQ(check.urls.size(), check.url_results.size()); 169 DCHECK_EQ(check.urls.size(), check.url_results.size());
168 DCHECK_EQ(check.full_hashes.size(), check.full_hash_results.size()); 170 DCHECK_EQ(check.full_hashes.size(), check.full_hash_results.size());
169 if (!check.urls.empty()) { 171 if (!check.urls.empty()) {
170 DCHECK(check.full_hashes.empty()); 172 DCHECK(check.full_hashes.empty());
171 switch (check.check_type) { 173 switch (check.check_type) {
172 case safe_browsing_util::MALWARE: 174 case safe_browsing_util::MALWARE:
173 case safe_browsing_util::PHISH: 175 case safe_browsing_util::PHISH:
176 case safe_browsing_util::UNWANTEDURL:
174 DCHECK_EQ(1u, check.urls.size()); 177 DCHECK_EQ(1u, check.urls.size());
175 OnCheckBrowseUrlResult( 178 OnCheckBrowseUrlResult(
176 check.urls[0], check.url_results[0], check.url_metadata[0]); 179 check.urls[0], check.url_results[0], check.url_metadata[0]);
177 break; 180 break;
178 case safe_browsing_util::BINURL: 181 case safe_browsing_util::BINURL:
179 DCHECK_EQ(check.urls.size(), check.url_results.size()); 182 DCHECK_EQ(check.urls.size(), check.url_results.size());
180 OnCheckDownloadUrlResult( 183 OnCheckDownloadUrlResult(
181 check.urls, 184 check.urls,
182 *std::max_element(check.url_results.begin(), 185 *std::max_element(check.url_results.begin(),
183 check.url_results.end())); 186 check.url_results.end()));
(...skipping 26 matching lines...) Expand all
210 const scoped_refptr<SafeBrowsingService>& service) 213 const scoped_refptr<SafeBrowsingService>& service)
211 : sb_service_(service), 214 : sb_service_(service),
212 database_(NULL), 215 database_(NULL),
213 enabled_(false), 216 enabled_(false),
214 enable_download_protection_(false), 217 enable_download_protection_(false),
215 enable_csd_whitelist_(false), 218 enable_csd_whitelist_(false),
216 enable_download_whitelist_(false), 219 enable_download_whitelist_(false),
217 enable_extension_blacklist_(false), 220 enable_extension_blacklist_(false),
218 enable_side_effect_free_whitelist_(false), 221 enable_side_effect_free_whitelist_(false),
219 enable_ip_blacklist_(false), 222 enable_ip_blacklist_(false),
223 enable_unwanted_software_blacklist_(false),
220 update_in_progress_(false), 224 update_in_progress_(false),
221 database_update_in_progress_(false), 225 database_update_in_progress_(false),
222 closing_database_(false), 226 closing_database_(false),
223 check_timeout_(base::TimeDelta::FromMilliseconds(kCheckTimeoutMs)) { 227 check_timeout_(base::TimeDelta::FromMilliseconds(kCheckTimeoutMs)) {
224 DCHECK(sb_service_.get() != NULL); 228 DCHECK(sb_service_.get() != NULL);
225 229
226 // Android only supports a subset of FULL_SAFE_BROWSING. 230 // Android only supports a subset of FULL_SAFE_BROWSING.
227 // TODO(shess): This shouldn't be OS-driven <http://crbug.com/394379> 231 // TODO(shess): This shouldn't be OS-driven <http://crbug.com/394379>
228 #if !defined(OS_ANDROID) 232 #if !defined(OS_ANDROID)
229 CommandLine* cmdline = CommandLine::ForCurrentProcess(); 233 CommandLine* cmdline = CommandLine::ForCurrentProcess();
(...skipping 16 matching lines...) Expand all
246 !cmdline->HasSwitch(switches::kSbDisableExtensionBlacklist); 250 !cmdline->HasSwitch(switches::kSbDisableExtensionBlacklist);
247 251
248 enable_side_effect_free_whitelist_ = 252 enable_side_effect_free_whitelist_ =
249 prerender::IsSideEffectFreeWhitelistEnabled() && 253 prerender::IsSideEffectFreeWhitelistEnabled() &&
250 !cmdline->HasSwitch(switches::kSbDisableSideEffectFreeWhitelist); 254 !cmdline->HasSwitch(switches::kSbDisableSideEffectFreeWhitelist);
251 255
252 // The client-side IP blacklist feature is tightly integrated with client-side 256 // The client-side IP blacklist feature is tightly integrated with client-side
253 // phishing protection for now. 257 // phishing protection for now.
254 enable_ip_blacklist_ = enable_csd_whitelist_; 258 enable_ip_blacklist_ = enable_csd_whitelist_;
255 259
260 //FIXME: Figure out how to turn this on and off. It looks like the malware
261 //list is always on, should the uslist also be?
262 enable_unwanted_software_blacklist_ = true;
263
256 enum SideEffectFreeWhitelistStatus { 264 enum SideEffectFreeWhitelistStatus {
257 SIDE_EFFECT_FREE_WHITELIST_ENABLED, 265 SIDE_EFFECT_FREE_WHITELIST_ENABLED,
258 SIDE_EFFECT_FREE_WHITELIST_DISABLED, 266 SIDE_EFFECT_FREE_WHITELIST_DISABLED,
259 SIDE_EFFECT_FREE_WHITELIST_STATUS_MAX 267 SIDE_EFFECT_FREE_WHITELIST_STATUS_MAX
260 }; 268 };
261 269
262 SideEffectFreeWhitelistStatus side_effect_free_whitelist_status = 270 SideEffectFreeWhitelistStatus side_effect_free_whitelist_status =
263 enable_side_effect_free_whitelist_ ? SIDE_EFFECT_FREE_WHITELIST_ENABLED : 271 enable_side_effect_free_whitelist_ ? SIDE_EFFECT_FREE_WHITELIST_ENABLED :
264 SIDE_EFFECT_FREE_WHITELIST_DISABLED; 272 SIDE_EFFECT_FREE_WHITELIST_DISABLED;
265 273
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 410 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
403 if (!enabled_) 411 if (!enabled_)
404 return true; 412 return true;
405 413
406 if (!CanCheckUrl(url)) 414 if (!CanCheckUrl(url))
407 return true; 415 return true;
408 416
409 std::vector<SBThreatType> expected_threats; 417 std::vector<SBThreatType> expected_threats;
410 expected_threats.push_back(SB_THREAT_TYPE_URL_MALWARE); 418 expected_threats.push_back(SB_THREAT_TYPE_URL_MALWARE);
411 expected_threats.push_back(SB_THREAT_TYPE_URL_PHISHING); 419 expected_threats.push_back(SB_THREAT_TYPE_URL_PHISHING);
420 expected_threats.push_back(SB_THREAT_TYPE_URL_UNWANTED);
412 421
413 const base::TimeTicks start = base::TimeTicks::Now(); 422 const base::TimeTicks start = base::TimeTicks::Now();
414 if (!MakeDatabaseAvailable()) { 423 if (!MakeDatabaseAvailable()) {
415 QueuedCheck queued_check(safe_browsing_util::MALWARE, // or PHISH 424 QueuedCheck queued_check(safe_browsing_util::MALWARE, // or PHISH
416 client, 425 client,
417 url, 426 url,
418 expected_threats, 427 expected_threats,
419 start); 428 start);
420 queued_checks_.push_back(queued_check); 429 queued_checks_.push_back(queued_check);
421 return false; 430 return false;
422 } 431 }
423 432
424 std::vector<SBPrefix> prefix_hits; 433 std::vector<SBPrefix> browse_prefix_hits;
425 std::vector<SBFullHashResult> cache_hits; 434 std::vector<SBFullHashResult> browse_cache_hits;
435 bool browse_prefix_match = database_->ContainsBrowseUrl(
436 url, &browse_prefix_hits, &browse_cache_hits);
426 437
427 bool prefix_match = 438 std::vector<SBPrefix> unwanted_prefix_hits;
428 database_->ContainsBrowseUrl(url, &prefix_hits, &cache_hits); 439 std::vector<SBFullHashResult> unwanted_cache_hits;
440 bool unwanted_prefix_match = database_->ContainsUnwantedSoftwareUrl(
441 url, &unwanted_prefix_hits, &unwanted_cache_hits);
429 442
430 UMA_HISTOGRAM_TIMES("SB2.FilterCheck", base::TimeTicks::Now() - start); 443 UMA_HISTOGRAM_TIMES("SB2.FilterCheck", base::TimeTicks::Now() - start);
431 444
432 if (!prefix_match) 445 if (!browse_prefix_match && !unwanted_prefix_match)
433 return true; // URL is okay. 446 return true; // URL is okay.
434 447
435 // Needs to be asynchronous, since we could be in the constructor of a 448 if (browse_prefix_match) {
436 // ResourceDispatcherHost event handler which can't pause there. 449 // Needs to be asynchronous, since we could be in the constructor of a
437 SafeBrowsingCheck* check = new SafeBrowsingCheck(std::vector<GURL>(1, url), 450 // ResourceDispatcherHost event handler which can't pause there.
438 std::vector<SBFullHash>(), 451 SafeBrowsingCheck* check =
439 client, 452 new SafeBrowsingCheck(std::vector<GURL>(1, url),
440 safe_browsing_util::MALWARE, 453 std::vector<SBFullHash>(),
441 expected_threats); 454 client,
442 check->need_get_hash = cache_hits.empty(); 455 safe_browsing_util::MALWARE,
443 check->prefix_hits.swap(prefix_hits); 456 expected_threats);
444 check->cache_hits.swap(cache_hits); 457 check->need_get_hash = browse_cache_hits.empty();
445 checks_.insert(check); 458 check->prefix_hits.swap(browse_prefix_hits);
459 check->cache_hits.swap(browse_cache_hits);
460 checks_.insert(check);
446 461
447 BrowserThread::PostTask( 462 BrowserThread::PostTask(
448 BrowserThread::IO, FROM_HERE, 463 BrowserThread::IO, FROM_HERE,
449 base::Bind(&SafeBrowsingDatabaseManager::OnCheckDone, this, check)); 464 base::Bind(&SafeBrowsingDatabaseManager::OnCheckDone, this, check));
465 }
466
467 if (unwanted_prefix_match) {
468 // Needs to be asynchronous, since we could be in the constructor of a
469 // ResourceDispatcherHost event handler which can't pause there.
470 SafeBrowsingCheck* check =
471 new SafeBrowsingCheck(std::vector<GURL>(1, url),
472 std::vector<SBFullHash>(),
473 client,
474 safe_browsing_util::UNWANTEDURL,
475 expected_threats);
476 check->need_get_hash = unwanted_cache_hits.empty();
477 check->prefix_hits.swap(unwanted_prefix_hits);
478 check->cache_hits.swap(unwanted_cache_hits);
479 checks_.insert(check);
mattm 2014/11/06 01:06:11 This is going to be a problem if both browse_prefi
mattm 2014/11/06 01:22:36 Actually there should be no need for the separate
gab 2014/11/06 17:47:46 I caught on to do the same thing yesterday after s
gab 2014/11/07 00:12:09 Implementation in patch set 6.
mattm 2014/11/07 00:27:09 SafeBrowsingCheck actually checks all lists, then
gab 2014/11/07 18:54:17 I see, as discussed yesterday, makes sense. See la
480
481 BrowserThread::PostTask(
482 BrowserThread::IO, FROM_HERE,
483 base::Bind(&SafeBrowsingDatabaseManager::OnCheckDone, this, check));
484 }
450 485
451 return false; 486 return false;
452 } 487 }
453 488
454 void SafeBrowsingDatabaseManager::CancelCheck(Client* client) { 489 void SafeBrowsingDatabaseManager::CancelCheck(Client* client) {
455 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 490 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
456 for (CurrentChecks::iterator i = checks_.begin(); i != checks_.end(); ++i) { 491 for (CurrentChecks::iterator i = checks_.begin(); i != checks_.end(); ++i) {
457 // We can't delete matching checks here because the db thread has a copy of 492 // We can't delete matching checks here because the db thread has a copy of
458 // the pointer. Instead, we simply NULL out the client, and when the db 493 // the pointer. Instead, we simply NULL out the client, and when the db
459 // thread calls us back, we'll clean up the check. 494 // thread calls us back, we'll clean up the check.
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 startup_metric_utils::ScopedSlowStartupUMA 733 startup_metric_utils::ScopedSlowStartupUMA
699 scoped_timer("Startup.SlowStartupSafeBrowsingGetDatabase"); 734 scoped_timer("Startup.SlowStartupSafeBrowsingGetDatabase");
700 const base::TimeTicks before = base::TimeTicks::Now(); 735 const base::TimeTicks before = base::TimeTicks::Now();
701 736
702 SafeBrowsingDatabase* database = 737 SafeBrowsingDatabase* database =
703 SafeBrowsingDatabase::Create(enable_download_protection_, 738 SafeBrowsingDatabase::Create(enable_download_protection_,
704 enable_csd_whitelist_, 739 enable_csd_whitelist_,
705 enable_download_whitelist_, 740 enable_download_whitelist_,
706 enable_extension_blacklist_, 741 enable_extension_blacklist_,
707 enable_side_effect_free_whitelist_, 742 enable_side_effect_free_whitelist_,
708 enable_ip_blacklist_); 743 enable_ip_blacklist_,
744 enable_unwanted_software_blacklist_);
709 745
710 database->Init(SafeBrowsingService::GetBaseFilename()); 746 database->Init(SafeBrowsingService::GetBaseFilename());
711 { 747 {
712 // Acquiring the lock here guarantees correct ordering between the writes to 748 // Acquiring the lock here guarantees correct ordering between the writes to
713 // the new database object above, and the setting of |databse_| below. 749 // the new database object above, and the setting of |databse_| below.
714 base::AutoLock lock(database_lock_); 750 base::AutoLock lock(database_lock_);
715 database_ = database; 751 database_ = database;
716 } 752 }
717 753
718 BrowserThread::PostTask( 754 BrowserThread::PostTask(
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after
1074 new base::WeakPtrFactory<SafeBrowsingDatabaseManager>(this)); 1110 new base::WeakPtrFactory<SafeBrowsingDatabaseManager>(this));
1075 checks_.insert(check); 1111 checks_.insert(check);
1076 1112
1077 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, task); 1113 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, task);
1078 1114
1079 base::MessageLoop::current()->PostDelayedTask(FROM_HERE, 1115 base::MessageLoop::current()->PostDelayedTask(FROM_HERE,
1080 base::Bind(&SafeBrowsingDatabaseManager::TimeoutCallback, 1116 base::Bind(&SafeBrowsingDatabaseManager::TimeoutCallback,
1081 check->timeout_factory_->GetWeakPtr(), check), 1117 check->timeout_factory_->GetWeakPtr(), check),
1082 check_timeout_); 1118 check_timeout_);
1083 } 1119 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698