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

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: browser tests 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 // TODO(gab): Gate this on the same experiment that will soon control the UwS
261 // URL UI.
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
433 std::vector<SBPrefix> browse_prefix_hits;
434 std::vector<SBFullHashResult> browse_cache_hits;
435 bool browse_prefix_match = database_->ContainsBrowseUrl(
436 url, &browse_prefix_hits, &browse_cache_hits);
437
438 std::vector<SBPrefix> unwanted_prefix_hits;
439 std::vector<SBFullHashResult> unwanted_cache_hits;
440 bool unwanted_prefix_match = database_->ContainsUnwantedSoftwareUrl(
441 url, &unwanted_prefix_hits, &unwanted_cache_hits);
442
443 // The merge below could be smarter but these vectors should be fairly small
444 // so it doesn't matter much.
424 std::vector<SBPrefix> prefix_hits; 445 std::vector<SBPrefix> prefix_hits;
446 prefix_hits.insert(prefix_hits.end(), browse_prefix_hits.begin(),
447 browse_prefix_hits.end());
448 prefix_hits.insert(prefix_hits.end(), unwanted_prefix_hits.begin(),
449 unwanted_prefix_hits.end());
450
425 std::vector<SBFullHashResult> cache_hits; 451 std::vector<SBFullHashResult> cache_hits;
426 452 cache_hits.insert(cache_hits.end(), browse_cache_hits.begin(),
427 bool prefix_match = 453 browse_cache_hits.end());
428 database_->ContainsBrowseUrl(url, &prefix_hits, &cache_hits); 454 cache_hits.insert(cache_hits.end(), unwanted_cache_hits.begin(),
455 unwanted_cache_hits.end());
mattm 2014/11/11 01:29:10 should avoid duplicates in the merged lists
gab 2014/11/11 23:39:11 Done, added STL logic and added API requirements w
429 456
430 UMA_HISTOGRAM_TIMES("SB2.FilterCheck", base::TimeTicks::Now() - start); 457 UMA_HISTOGRAM_TIMES("SB2.FilterCheck", base::TimeTicks::Now() - start);
431 458
432 if (!prefix_match) 459 if (!browse_prefix_match && !unwanted_prefix_match)
433 return true; // URL is okay. 460 return true; // URL is okay.
434 461
435 // Needs to be asynchronous, since we could be in the constructor of a 462 // Needs to be asynchronous, since we could be in the constructor of a
436 // ResourceDispatcherHost event handler which can't pause there. 463 // ResourceDispatcherHost event handler which can't pause there.
437 SafeBrowsingCheck* check = new SafeBrowsingCheck(std::vector<GURL>(1, url), 464 // This check will ping the Safe Browsing servers and get all lists which it
438 std::vector<SBFullHash>(), 465 // matches. These lists will then be filtered against the |expected_threats|
439 client, 466 // and the result callback for MALWARE (which is the same as for PHISH and
440 safe_browsing_util::MALWARE, 467 // UNWANTEDURL) will eventually be invoked with the final decision.
441 expected_threats); 468 SafeBrowsingCheck* check =
469 new SafeBrowsingCheck(std::vector<GURL>(1, url),
470 std::vector<SBFullHash>(),
471 client,
472 safe_browsing_util::MALWARE,
473 expected_threats);
442 check->need_get_hash = cache_hits.empty(); 474 check->need_get_hash = cache_hits.empty();
443 check->prefix_hits.swap(prefix_hits); 475 check->prefix_hits.swap(prefix_hits);
444 check->cache_hits.swap(cache_hits); 476 check->cache_hits.swap(cache_hits);
445 checks_.insert(check); 477 checks_.insert(check);
446 478
447 BrowserThread::PostTask( 479 BrowserThread::PostTask(
448 BrowserThread::IO, FROM_HERE, 480 BrowserThread::IO, FROM_HERE,
449 base::Bind(&SafeBrowsingDatabaseManager::OnCheckDone, this, check)); 481 base::Bind(&SafeBrowsingDatabaseManager::OnCheckDone, this, check));
450 482
451 return false; 483 return false;
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 startup_metric_utils::ScopedSlowStartupUMA 730 startup_metric_utils::ScopedSlowStartupUMA
699 scoped_timer("Startup.SlowStartupSafeBrowsingGetDatabase"); 731 scoped_timer("Startup.SlowStartupSafeBrowsingGetDatabase");
700 const base::TimeTicks before = base::TimeTicks::Now(); 732 const base::TimeTicks before = base::TimeTicks::Now();
701 733
702 SafeBrowsingDatabase* database = 734 SafeBrowsingDatabase* database =
703 SafeBrowsingDatabase::Create(enable_download_protection_, 735 SafeBrowsingDatabase::Create(enable_download_protection_,
704 enable_csd_whitelist_, 736 enable_csd_whitelist_,
705 enable_download_whitelist_, 737 enable_download_whitelist_,
706 enable_extension_blacklist_, 738 enable_extension_blacklist_,
707 enable_side_effect_free_whitelist_, 739 enable_side_effect_free_whitelist_,
708 enable_ip_blacklist_); 740 enable_ip_blacklist_,
741 enable_unwanted_software_blacklist_);
709 742
710 database->Init(SafeBrowsingService::GetBaseFilename()); 743 database->Init(SafeBrowsingService::GetBaseFilename());
711 { 744 {
712 // Acquiring the lock here guarantees correct ordering between the writes to 745 // Acquiring the lock here guarantees correct ordering between the writes to
713 // the new database object above, and the setting of |databse_| below. 746 // the new database object above, and the setting of |databse_| below.
714 base::AutoLock lock(database_lock_); 747 base::AutoLock lock(database_lock_);
715 database_ = database; 748 database_ = database;
716 } 749 }
717 750
718 BrowserThread::PostTask( 751 BrowserThread::PostTask(
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 bool is_download = check->check_type == safe_browsing_util::BINURL; 797 bool is_download = check->check_type == safe_browsing_util::BINURL;
765 sb_service_->protocol_manager()->GetFullHash( 798 sb_service_->protocol_manager()->GetFullHash(
766 check->prefix_hits, 799 check->prefix_hits,
767 base::Bind(&SafeBrowsingDatabaseManager::HandleGetHashResults, 800 base::Bind(&SafeBrowsingDatabaseManager::HandleGetHashResults,
768 base::Unretained(this), 801 base::Unretained(this),
769 check), 802 check),
770 is_download); 803 is_download);
771 } else { 804 } else {
772 // We may have cached results for previous GetHash queries. Since 805 // We may have cached results for previous GetHash queries. Since
773 // this data comes from cache, don't histogram hits. 806 // this data comes from cache, don't histogram hits.
774 bool is_threat = HandleOneCheck(check, check->cache_hits); 807 HandleOneCheck(check, check->cache_hits);
775 // cache_hits should only contain hits for a fullhash we searched for, so if
776 // we got to this point it should always result in a threat match.
777 DCHECK(is_threat);
778 } 808 }
779 } 809 }
780 810
781 void SafeBrowsingDatabaseManager::GetAllChunksFromDatabase( 811 void SafeBrowsingDatabaseManager::GetAllChunksFromDatabase(
782 GetChunksCallback callback) { 812 GetChunksCallback callback) {
783 DCHECK_EQ(base::MessageLoop::current(), 813 DCHECK_EQ(base::MessageLoop::current(),
784 safe_browsing_thread_->message_loop()); 814 safe_browsing_thread_->message_loop());
785 815
786 bool database_error = true; 816 bool database_error = true;
787 std::vector<SBListChunkRanges> lists; 817 std::vector<SBListChunkRanges> lists;
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
1074 new base::WeakPtrFactory<SafeBrowsingDatabaseManager>(this)); 1104 new base::WeakPtrFactory<SafeBrowsingDatabaseManager>(this));
1075 checks_.insert(check); 1105 checks_.insert(check);
1076 1106
1077 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, task); 1107 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, task);
1078 1108
1079 base::MessageLoop::current()->PostDelayedTask(FROM_HERE, 1109 base::MessageLoop::current()->PostDelayedTask(FROM_HERE,
1080 base::Bind(&SafeBrowsingDatabaseManager::TimeoutCallback, 1110 base::Bind(&SafeBrowsingDatabaseManager::TimeoutCallback,
1081 check->timeout_factory_->GetWeakPtr(), check), 1111 check->timeout_factory_->GetWeakPtr(), check),
1082 check_timeout_); 1112 check_timeout_);
1083 } 1113 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698