Chromium Code Reviews| 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/download_protection_service.h" | 5 #include "chrome/browser/safe_browsing/download_protection_service.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 55 namespace { | 55 namespace { |
| 56 static const int64 kDownloadRequestTimeoutMs = 7000; | 56 static const int64 kDownloadRequestTimeoutMs = 7000; |
| 57 } // namespace | 57 } // namespace |
| 58 | 58 |
| 59 namespace safe_browsing { | 59 namespace safe_browsing { |
| 60 | 60 |
| 61 const char DownloadProtectionService::kDownloadRequestUrl[] = | 61 const char DownloadProtectionService::kDownloadRequestUrl[] = |
| 62 "https://sb-ssl.google.com/safebrowsing/clientreport/download"; | 62 "https://sb-ssl.google.com/safebrowsing/clientreport/download"; |
| 63 | 63 |
| 64 namespace { | 64 namespace { |
| 65 // List of extensions for which we track some UMA stats. | 65 // List of extensions for which we track some UMA stats. The position of the |
| 66 enum MaliciousExtensionType { | 66 // extension in kDangerousFileTypes is considered to be the UMA enumeration |
| 67 EXTENSION_EXE, | 67 // value. Naturally, new values should only be added at the end. |
| 68 EXTENSION_MSI, | 68 const base::FilePath::CharType* const kDangerousFileTypes[] = { |
| 69 EXTENSION_CAB, | 69 FILE_PATH_LITERAL(".exe"), |
| 70 EXTENSION_SYS, | 70 FILE_PATH_LITERAL(".msi"), |
| 71 EXTENSION_SCR, | 71 FILE_PATH_LITERAL(".cab"), |
| 72 EXTENSION_DRV, | 72 FILE_PATH_LITERAL(".sys"), |
| 73 EXTENSION_BAT, | 73 FILE_PATH_LITERAL(".scr"), |
| 74 EXTENSION_ZIP, | 74 FILE_PATH_LITERAL(".drv"), |
| 75 EXTENSION_RAR, | 75 FILE_PATH_LITERAL(".bat"), |
| 76 EXTENSION_DLL, | 76 FILE_PATH_LITERAL(".zip"), |
| 77 EXTENSION_PIF, | 77 FILE_PATH_LITERAL(".rar"), |
| 78 EXTENSION_COM, | 78 FILE_PATH_LITERAL(".dll"), |
| 79 EXTENSION_JAR, | 79 FILE_PATH_LITERAL(".pif"), |
| 80 EXTENSION_CLASS, | 80 FILE_PATH_LITERAL(".com"), |
| 81 EXTENSION_PDF, | 81 FILE_PATH_LITERAL(".jar"), |
| 82 EXTENSION_VB, | 82 FILE_PATH_LITERAL(".class"), |
| 83 EXTENSION_REG, | 83 FILE_PATH_LITERAL(".pdf"), |
| 84 EXTENSION_GRP, | 84 FILE_PATH_LITERAL(".vb"), |
| 85 EXTENSION_OTHER, // Groups all other extensions into one bucket. | 85 FILE_PATH_LITERAL(".reg"), |
| 86 EXTENSION_CRX, | 86 FILE_PATH_LITERAL(".grp"), |
| 87 EXTENSION_APK, | 87 nullptr, // The "Other" bucket. This is in the middle of the array due to |
| 88 EXTENSION_DMG, | 88 // historical reasons. |
| 89 EXTENSION_PKG, | 89 FILE_PATH_LITERAL(".crx"), |
| 90 EXTENSION_TORRENT, | 90 FILE_PATH_LITERAL(".apk"), |
| 91 EXTENSION_WEBSITE, | 91 FILE_PATH_LITERAL(".dmg"), |
| 92 EXTENSION_URL, | 92 FILE_PATH_LITERAL(".pkg"), |
| 93 EXTENSION_MAX, | 93 FILE_PATH_LITERAL(".torrent"), |
| 94 FILE_PATH_LITERAL(".website"), | |
| 95 FILE_PATH_LITERAL(".url"), | |
| 96 FILE_PATH_LITERAL(".vbe"), | |
| 97 FILE_PATH_LITERAL(".vbs"), | |
| 98 FILE_PATH_LITERAL(".js"), | |
| 99 FILE_PATH_LITERAL(".jse"), | |
| 100 FILE_PATH_LITERAL(".mht"), | |
| 101 FILE_PATH_LITERAL(".mhtml"), | |
|
moheeb1
2015/07/08 20:25:29
Would be great to expand this list to cover all da
| |
| 94 }; | 102 }; |
| 95 | 103 |
| 96 MaliciousExtensionType GetExtensionType(const base::FilePath& f) { | 104 const int EXTENSION_OTHER = 18; |
|
Nathan Parker
2015/07/08 20:11:08
Nit: Add comment or make the name indicate that th
| |
| 97 if (f.MatchesExtension(FILE_PATH_LITERAL(".exe"))) return EXTENSION_EXE; | |
| 98 if (f.MatchesExtension(FILE_PATH_LITERAL(".msi"))) return EXTENSION_MSI; | |
| 99 if (f.MatchesExtension(FILE_PATH_LITERAL(".cab"))) return EXTENSION_CAB; | |
| 100 if (f.MatchesExtension(FILE_PATH_LITERAL(".sys"))) return EXTENSION_SYS; | |
| 101 if (f.MatchesExtension(FILE_PATH_LITERAL(".scr"))) return EXTENSION_SCR; | |
| 102 if (f.MatchesExtension(FILE_PATH_LITERAL(".drv"))) return EXTENSION_DRV; | |
| 103 if (f.MatchesExtension(FILE_PATH_LITERAL(".bat"))) return EXTENSION_BAT; | |
| 104 if (f.MatchesExtension(FILE_PATH_LITERAL(".zip"))) return EXTENSION_ZIP; | |
| 105 if (f.MatchesExtension(FILE_PATH_LITERAL(".rar"))) return EXTENSION_RAR; | |
| 106 if (f.MatchesExtension(FILE_PATH_LITERAL(".dll"))) return EXTENSION_DLL; | |
| 107 if (f.MatchesExtension(FILE_PATH_LITERAL(".pif"))) return EXTENSION_PIF; | |
| 108 if (f.MatchesExtension(FILE_PATH_LITERAL(".com"))) return EXTENSION_COM; | |
| 109 if (f.MatchesExtension(FILE_PATH_LITERAL(".jar"))) return EXTENSION_JAR; | |
| 110 if (f.MatchesExtension(FILE_PATH_LITERAL(".class"))) return EXTENSION_CLASS; | |
| 111 if (f.MatchesExtension(FILE_PATH_LITERAL(".pdf"))) return EXTENSION_PDF; | |
| 112 if (f.MatchesExtension(FILE_PATH_LITERAL(".vb"))) return EXTENSION_VB; | |
| 113 if (f.MatchesExtension(FILE_PATH_LITERAL(".reg"))) return EXTENSION_REG; | |
| 114 if (f.MatchesExtension(FILE_PATH_LITERAL(".grp"))) return EXTENSION_GRP; | |
| 115 if (f.MatchesExtension(FILE_PATH_LITERAL(".crx"))) return EXTENSION_CRX; | |
| 116 if (f.MatchesExtension(FILE_PATH_LITERAL(".apk"))) return EXTENSION_APK; | |
| 117 if (f.MatchesExtension(FILE_PATH_LITERAL(".dmg"))) return EXTENSION_DMG; | |
| 118 if (f.MatchesExtension(FILE_PATH_LITERAL(".pkg"))) return EXTENSION_PKG; | |
| 119 if (f.MatchesExtension(FILE_PATH_LITERAL(".torrent"))) | |
| 120 return EXTENSION_TORRENT; | |
| 121 if (f.MatchesExtension(FILE_PATH_LITERAL(".website"))) | |
| 122 return EXTENSION_WEBSITE; | |
| 123 if (f.MatchesExtension(FILE_PATH_LITERAL(".url"))) return EXTENSION_URL; | |
| 124 return EXTENSION_OTHER; | |
| 125 } | |
| 126 | 105 |
| 127 void RecordFileExtensionType(const base::FilePath& file) { | 106 void RecordFileExtensionType(const base::FilePath& file) { |
| 107 DCHECK_EQ(static_cast<base::FilePath::CharType*>(nullptr), | |
| 108 kDangerousFileTypes[EXTENSION_OTHER]); | |
| 109 | |
| 110 int extension_type = EXTENSION_OTHER; | |
| 111 for (const auto& extension : kDangerousFileTypes) { | |
| 112 if (extension && file.MatchesExtension(extension)) { | |
| 113 extension_type = &extension - kDangerousFileTypes; | |
| 114 break; | |
| 115 } | |
| 116 } | |
| 117 | |
| 128 UMA_HISTOGRAM_ENUMERATION("SBClientDownload.DownloadExtensions", | 118 UMA_HISTOGRAM_ENUMERATION("SBClientDownload.DownloadExtensions", |
| 129 GetExtensionType(file), | 119 extension_type, arraysize(kDangerousFileTypes)); |
| 130 EXTENSION_MAX); | |
| 131 } | 120 } |
| 132 | 121 |
| 133 // Enumerate for histogramming purposes. | 122 // Enumerate for histogramming purposes. |
| 134 // DO NOT CHANGE THE ORDERING OF THESE VALUES (different histogram data will | 123 // DO NOT CHANGE THE ORDERING OF THESE VALUES (different histogram data will |
| 135 // be mixed together based on their values). | 124 // be mixed together based on their values). |
| 136 enum SBStatsType { | 125 enum SBStatsType { |
| 137 DOWNLOAD_URL_CHECKS_TOTAL, | 126 DOWNLOAD_URL_CHECKS_TOTAL, |
| 138 DOWNLOAD_URL_CHECKS_CANCELED, | 127 DOWNLOAD_URL_CHECKS_CANCELED, |
| 139 DOWNLOAD_URL_CHECKS_MALWARE, | 128 DOWNLOAD_URL_CHECKS_MALWARE, |
| 140 | 129 |
| (...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 620 | 609 |
| 621 void CheckWhitelists() { | 610 void CheckWhitelists() { |
| 622 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 611 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 623 | 612 |
| 624 if (!database_manager_.get()) { | 613 if (!database_manager_.get()) { |
| 625 PostFinishTask(UNKNOWN, REASON_SB_DISABLED); | 614 PostFinishTask(UNKNOWN, REASON_SB_DISABLED); |
| 626 return; | 615 return; |
| 627 } | 616 } |
| 628 | 617 |
| 629 const GURL& url = url_chain_.back(); | 618 const GURL& url = url_chain_.back(); |
| 619 // TODO(asanka): This may acquire a lock on the SB DB on the IO thread. | |
| 630 if (url.is_valid() && database_manager_->MatchDownloadWhitelistUrl(url)) { | 620 if (url.is_valid() && database_manager_->MatchDownloadWhitelistUrl(url)) { |
| 631 DVLOG(2) << url << " is on the download whitelist."; | 621 DVLOG(2) << url << " is on the download whitelist."; |
| 632 RecordCountOfSignedOrWhitelistedDownload(); | 622 RecordCountOfSignedOrWhitelistedDownload(); |
| 633 // TODO(grt): Continue processing without uploading so that | 623 // TODO(grt): Continue processing without uploading so that |
| 634 // ClientDownloadRequest callbacks can be run even for this type of safe | 624 // ClientDownloadRequest callbacks can be run even for this type of safe |
| 635 // download. | 625 // download. |
| 636 PostFinishTask(SAFE, REASON_WHITELISTED_URL); | 626 PostFinishTask(SAFE, REASON_WHITELISTED_URL); |
| 637 return; | 627 return; |
| 638 } | 628 } |
| 639 | 629 |
| (...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1120 GURL DownloadProtectionService::GetDownloadRequestUrl() { | 1110 GURL DownloadProtectionService::GetDownloadRequestUrl() { |
| 1121 GURL url(kDownloadRequestUrl); | 1111 GURL url(kDownloadRequestUrl); |
| 1122 std::string api_key = google_apis::GetAPIKey(); | 1112 std::string api_key = google_apis::GetAPIKey(); |
| 1123 if (!api_key.empty()) | 1113 if (!api_key.empty()) |
| 1124 url = url.Resolve("?key=" + net::EscapeQueryParamValue(api_key, true)); | 1114 url = url.Resolve("?key=" + net::EscapeQueryParamValue(api_key, true)); |
| 1125 | 1115 |
| 1126 return url; | 1116 return url; |
| 1127 } | 1117 } |
| 1128 | 1118 |
| 1129 } // namespace safe_browsing | 1119 } // namespace safe_browsing |
| OLD | NEW |