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