OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |