| 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"), |
| 102 FILE_PATH_LITERAL(".msc"), |
| 103 FILE_PATH_LITERAL(".msp"), |
| 104 FILE_PATH_LITERAL(".mst"), |
| 105 FILE_PATH_LITERAL(".bas"), |
| 106 FILE_PATH_LITERAL(".hta"), |
| 107 FILE_PATH_LITERAL(".msh"), |
| 108 FILE_PATH_LITERAL(".msh1"), |
| 109 FILE_PATH_LITERAL(".msh1xml"), |
| 110 FILE_PATH_LITERAL(".msh2"), |
| 111 FILE_PATH_LITERAL(".msh2xml"), |
| 112 FILE_PATH_LITERAL(".mshxml"), |
| 113 FILE_PATH_LITERAL(".ps1"), |
| 114 FILE_PATH_LITERAL(".ps1xml"), |
| 115 FILE_PATH_LITERAL(".ps2"), |
| 116 FILE_PATH_LITERAL(".ps2xml"), |
| 117 FILE_PATH_LITERAL(".psc1"), |
| 118 FILE_PATH_LITERAL(".psc2"), |
| 119 FILE_PATH_LITERAL(".scf"), |
| 120 FILE_PATH_LITERAL(".sct"), |
| 121 FILE_PATH_LITERAL(".wsf"), |
| 94 }; | 122 }; |
| 95 | 123 |
| 96 MaliciousExtensionType GetExtensionType(const base::FilePath& f) { | 124 // UMA enumeration value for unrecognized file types. This is the array index of |
| 97 if (f.MatchesExtension(FILE_PATH_LITERAL(".exe"))) return EXTENSION_EXE; | 125 // the "Other" bucket in kDangerousFileTypes. |
| 98 if (f.MatchesExtension(FILE_PATH_LITERAL(".msi"))) return EXTENSION_MSI; | 126 const int EXTENSION_OTHER = 18; |
| 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 | 127 |
| 127 void RecordFileExtensionType(const base::FilePath& file) { | 128 void RecordFileExtensionType(const base::FilePath& file) { |
| 129 DCHECK_EQ(static_cast<base::FilePath::CharType*>(nullptr), |
| 130 kDangerousFileTypes[EXTENSION_OTHER]); |
| 131 |
| 132 int extension_type = EXTENSION_OTHER; |
| 133 for (const auto& extension : kDangerousFileTypes) { |
| 134 if (extension && file.MatchesExtension(extension)) { |
| 135 extension_type = &extension - kDangerousFileTypes; |
| 136 break; |
| 137 } |
| 138 } |
| 139 |
| 128 UMA_HISTOGRAM_ENUMERATION("SBClientDownload.DownloadExtensions", | 140 UMA_HISTOGRAM_ENUMERATION("SBClientDownload.DownloadExtensions", |
| 129 GetExtensionType(file), | 141 extension_type, arraysize(kDangerousFileTypes)); |
| 130 EXTENSION_MAX); | |
| 131 } | 142 } |
| 132 | 143 |
| 133 // Enumerate for histogramming purposes. | 144 // Enumerate for histogramming purposes. |
| 134 // DO NOT CHANGE THE ORDERING OF THESE VALUES (different histogram data will | 145 // DO NOT CHANGE THE ORDERING OF THESE VALUES (different histogram data will |
| 135 // be mixed together based on their values). | 146 // be mixed together based on their values). |
| 136 enum SBStatsType { | 147 enum SBStatsType { |
| 137 DOWNLOAD_URL_CHECKS_TOTAL, | 148 DOWNLOAD_URL_CHECKS_TOTAL, |
| 138 DOWNLOAD_URL_CHECKS_CANCELED, | 149 DOWNLOAD_URL_CHECKS_CANCELED, |
| 139 DOWNLOAD_URL_CHECKS_MALWARE, | 150 DOWNLOAD_URL_CHECKS_MALWARE, |
| 140 | 151 |
| (...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 620 | 631 |
| 621 void CheckWhitelists() { | 632 void CheckWhitelists() { |
| 622 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 633 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 623 | 634 |
| 624 if (!database_manager_.get()) { | 635 if (!database_manager_.get()) { |
| 625 PostFinishTask(UNKNOWN, REASON_SB_DISABLED); | 636 PostFinishTask(UNKNOWN, REASON_SB_DISABLED); |
| 626 return; | 637 return; |
| 627 } | 638 } |
| 628 | 639 |
| 629 const GURL& url = url_chain_.back(); | 640 const GURL& url = url_chain_.back(); |
| 641 // TODO(asanka): This may acquire a lock on the SB DB on the IO thread. |
| 630 if (url.is_valid() && database_manager_->MatchDownloadWhitelistUrl(url)) { | 642 if (url.is_valid() && database_manager_->MatchDownloadWhitelistUrl(url)) { |
| 631 DVLOG(2) << url << " is on the download whitelist."; | 643 DVLOG(2) << url << " is on the download whitelist."; |
| 632 RecordCountOfSignedOrWhitelistedDownload(); | 644 RecordCountOfSignedOrWhitelistedDownload(); |
| 633 // TODO(grt): Continue processing without uploading so that | 645 // TODO(grt): Continue processing without uploading so that |
| 634 // ClientDownloadRequest callbacks can be run even for this type of safe | 646 // ClientDownloadRequest callbacks can be run even for this type of safe |
| 635 // download. | 647 // download. |
| 636 PostFinishTask(SAFE, REASON_WHITELISTED_URL); | 648 PostFinishTask(SAFE, REASON_WHITELISTED_URL); |
| 637 return; | 649 return; |
| 638 } | 650 } |
| 639 | 651 |
| (...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1129 GURL DownloadProtectionService::GetDownloadRequestUrl() { | 1141 GURL DownloadProtectionService::GetDownloadRequestUrl() { |
| 1130 GURL url(kDownloadRequestUrl); | 1142 GURL url(kDownloadRequestUrl); |
| 1131 std::string api_key = google_apis::GetAPIKey(); | 1143 std::string api_key = google_apis::GetAPIKey(); |
| 1132 if (!api_key.empty()) | 1144 if (!api_key.empty()) |
| 1133 url = url.Resolve("?key=" + net::EscapeQueryParamValue(api_key, true)); | 1145 url = url.Resolve("?key=" + net::EscapeQueryParamValue(api_key, true)); |
| 1134 | 1146 |
| 1135 return url; | 1147 return url; |
| 1136 } | 1148 } |
| 1137 | 1149 |
| 1138 } // namespace safe_browsing | 1150 } // namespace safe_browsing |
| OLD | NEW |