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 |