Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(606)

Side by Side Diff: chrome/browser/safe_browsing/download_protection_service.cc

Issue 1262753002: [SafeBrowsing] Send pings for Zip files that contain other archives. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix tests Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 FILE_PATH_LITERAL(".mshxml"), 113 FILE_PATH_LITERAL(".mshxml"),
114 FILE_PATH_LITERAL(".ps1"), 114 FILE_PATH_LITERAL(".ps1"),
115 FILE_PATH_LITERAL(".ps1xml"), 115 FILE_PATH_LITERAL(".ps1xml"),
116 FILE_PATH_LITERAL(".ps2"), 116 FILE_PATH_LITERAL(".ps2"),
117 FILE_PATH_LITERAL(".ps2xml"), 117 FILE_PATH_LITERAL(".ps2xml"),
118 FILE_PATH_LITERAL(".psc1"), 118 FILE_PATH_LITERAL(".psc1"),
119 FILE_PATH_LITERAL(".psc2"), 119 FILE_PATH_LITERAL(".psc2"),
120 FILE_PATH_LITERAL(".scf"), 120 FILE_PATH_LITERAL(".scf"),
121 FILE_PATH_LITERAL(".sct"), 121 FILE_PATH_LITERAL(".sct"),
122 FILE_PATH_LITERAL(".wsf"), 122 FILE_PATH_LITERAL(".wsf"),
123 FILE_PATH_LITERAL(".7z"),
124 FILE_PATH_LITERAL(".xz"),
125 FILE_PATH_LITERAL(".gz"),
126 FILE_PATH_LITERAL(".tgz"),
127 FILE_PATH_LITERAL(".bz2"),
128 FILE_PATH_LITERAL(".tar"),
129 FILE_PATH_LITERAL(".arj"),
130 FILE_PATH_LITERAL(".lzh"),
131 FILE_PATH_LITERAL(".lha"),
132 FILE_PATH_LITERAL(".wim"),
133 FILE_PATH_LITERAL(".z"),
134 FILE_PATH_LITERAL(".lzma"),
135 FILE_PATH_LITERAL(".cpio"),
123 }; 136 };
124 137
125 // UMA enumeration value for unrecognized file types. This is the array index of 138 // UMA enumeration value for unrecognized file types. This is the array index of
126 // the "Other" bucket in kDangerousFileTypes. 139 // the "Other" bucket in kDangerousFileTypes.
127 const int EXTENSION_OTHER = 18; 140 const int EXTENSION_OTHER = 18;
128 141
129 void RecordFileExtensionType(const base::FilePath& file) { 142 // Maximum extension ID returned by GetExtensionTypeForUMA() + 1.
143 const int EXTENSION_MAX = arraysize(kDangerousFileTypes);
144
145 int GetExtensionTypeForUMA(const base::FilePath::StringType& extension) {
130 DCHECK_EQ(static_cast<base::FilePath::CharType*>(nullptr), 146 DCHECK_EQ(static_cast<base::FilePath::CharType*>(nullptr),
131 kDangerousFileTypes[EXTENSION_OTHER]); 147 kDangerousFileTypes[EXTENSION_OTHER]);
148 DCHECK_EQ(0u, extension.find(base::FilePath::kExtensionSeparator));
149 DCHECK_EQ(extension, base::FilePath(extension).FinalExtension());
132 150
133 int extension_type = EXTENSION_OTHER; 151 for (const auto& dangerous_extension : kDangerousFileTypes) {
134 for (const auto& extension : kDangerousFileTypes) { 152 if (dangerous_extension &&
135 if (extension && file.MatchesExtension(extension)) { 153 base::FilePath::CompareEqualIgnoreCase(dangerous_extension, extension))
136 extension_type = &extension - kDangerousFileTypes; 154 return &dangerous_extension - kDangerousFileTypes;
137 break;
138 }
139 } 155 }
156 return EXTENSION_OTHER;
157 }
140 158
159 void RecordFileExtensionType(const base::FilePath& file) {
141 UMA_HISTOGRAM_ENUMERATION("SBClientDownload.DownloadExtensions", 160 UMA_HISTOGRAM_ENUMERATION("SBClientDownload.DownloadExtensions",
142 extension_type, arraysize(kDangerousFileTypes)); 161 GetExtensionTypeForUMA(file.FinalExtension()),
162 EXTENSION_MAX);
163 }
164
165 void RecordArchivedArchiveFileExtensionType(
166 const base::FilePath::StringType& extension) {
167 UMA_HISTOGRAM_ENUMERATION("SBClientDownload.ArchivedArchiveExtensions",
168 GetExtensionTypeForUMA(extension), EXTENSION_MAX);
143 } 169 }
144 170
145 // Enumerate for histogramming purposes. 171 // Enumerate for histogramming purposes.
146 // DO NOT CHANGE THE ORDERING OF THESE VALUES (different histogram data will 172 // DO NOT CHANGE THE ORDERING OF THESE VALUES (different histogram data will
147 // be mixed together based on their values). 173 // be mixed together based on their values).
148 enum SBStatsType { 174 enum SBStatsType {
149 DOWNLOAD_URL_CHECKS_TOTAL, 175 DOWNLOAD_URL_CHECKS_TOTAL,
150 DOWNLOAD_URL_CHECKS_CANCELED, 176 DOWNLOAD_URL_CHECKS_CANCELED,
151 DOWNLOAD_URL_CHECKS_MALWARE, 177 DOWNLOAD_URL_CHECKS_MALWARE,
152 178
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 ClientDownloadRequest::DownloadType* type) { 521 ClientDownloadRequest::DownloadType* type) {
496 if (item.GetUrlChain().empty()) { 522 if (item.GetUrlChain().empty()) {
497 *reason = REASON_EMPTY_URL_CHAIN; 523 *reason = REASON_EMPTY_URL_CHAIN;
498 return false; 524 return false;
499 } 525 }
500 const GURL& final_url = item.GetUrlChain().back(); 526 const GURL& final_url = item.GetUrlChain().back();
501 if (!final_url.is_valid() || final_url.is_empty()) { 527 if (!final_url.is_valid() || final_url.is_empty()) {
502 *reason = REASON_INVALID_URL; 528 *reason = REASON_INVALID_URL;
503 return false; 529 return false;
504 } 530 }
505 if (!download_protection_util::IsBinaryFile(target_path)) { 531 if (!download_protection_util::IsSupportedBinaryFile(target_path)) {
506 *reason = REASON_NOT_BINARY_FILE; 532 *reason = REASON_NOT_BINARY_FILE;
507 return false; 533 return false;
508 } 534 }
509 if ((!final_url.IsStandard() && !final_url.SchemeIsBlob() && 535 if ((!final_url.IsStandard() && !final_url.SchemeIsBlob() &&
510 !final_url.SchemeIs(url::kDataScheme)) || 536 !final_url.SchemeIs(url::kDataScheme)) ||
511 final_url.SchemeIsFile()) { 537 final_url.SchemeIsFile()) {
512 *reason = REASON_UNSUPPORTED_URL_SCHEME; 538 *reason = REASON_UNSUPPORTED_URL_SCHEME;
513 return false; 539 return false;
514 } 540 }
515 *type = download_protection_util::GetDownloadType(target_path); 541 *type = download_protection_util::GetDownloadType(target_path);
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 // analyzer is refcounted, it might outlive the request. 620 // analyzer is refcounted, it might outlive the request.
595 analyzer_ = new SandboxedZipAnalyzer( 621 analyzer_ = new SandboxedZipAnalyzer(
596 item_->GetFullPath(), 622 item_->GetFullPath(),
597 base::Bind(&CheckClientDownloadRequest::OnZipAnalysisFinished, 623 base::Bind(&CheckClientDownloadRequest::OnZipAnalysisFinished,
598 weakptr_factory_.GetWeakPtr())); 624 weakptr_factory_.GetWeakPtr()));
599 analyzer_->Start(); 625 analyzer_->Start();
600 } 626 }
601 627
602 void OnZipAnalysisFinished(const zip_analyzer::Results& results) { 628 void OnZipAnalysisFinished(const zip_analyzer::Results& results) {
603 DCHECK_CURRENTLY_ON(BrowserThread::UI); 629 DCHECK_CURRENTLY_ON(BrowserThread::UI);
630 DCHECK_EQ(ClientDownloadRequest::ZIPPED_EXECUTABLE, type_);
604 if (!service_) 631 if (!service_)
605 return; 632 return;
606 if (results.success) { 633 if (results.success) {
607 zipped_executable_ = results.has_executable; 634 zipped_executable_ = results.has_executable;
608 archived_binary_.CopyFrom(results.archived_binary); 635 archived_binary_.CopyFrom(results.archived_binary);
609 DVLOG(1) << "Zip analysis finished for " << item_->GetFullPath().value() 636 DVLOG(1) << "Zip analysis finished for " << item_->GetFullPath().value()
610 << ", has_executable=" << results.has_executable 637 << ", has_executable=" << results.has_executable
611 << " has_archive=" << results.has_archive; 638 << " has_archive=" << results.has_archive;
612 } else { 639 } else {
613 DVLOG(1) << "Zip analysis failed for " << item_->GetFullPath().value(); 640 DVLOG(1) << "Zip analysis failed for " << item_->GetFullPath().value();
614 } 641 }
615 UMA_HISTOGRAM_BOOLEAN("SBClientDownload.ZipFileHasExecutable", 642 UMA_HISTOGRAM_BOOLEAN("SBClientDownload.ZipFileHasExecutable",
616 zipped_executable_); 643 zipped_executable_);
617 UMA_HISTOGRAM_BOOLEAN("SBClientDownload.ZipFileHasArchiveButNoExecutable", 644 UMA_HISTOGRAM_BOOLEAN("SBClientDownload.ZipFileHasArchiveButNoExecutable",
618 results.has_archive && !zipped_executable_); 645 results.has_archive && !zipped_executable_);
619 UMA_HISTOGRAM_TIMES("SBClientDownload.ExtractZipFeaturesTime", 646 UMA_HISTOGRAM_TIMES("SBClientDownload.ExtractZipFeaturesTime",
620 base::TimeTicks::Now() - zip_analysis_start_time_); 647 base::TimeTicks::Now() - zip_analysis_start_time_);
648 for (const auto& file_extension : results.archived_archive_filetypes)
649 RecordArchivedArchiveFileExtensionType(file_extension);
621 650
622 if (!zipped_executable_) { 651 if (!zipped_executable_ && !results.has_archive) {
623 PostFinishTask(UNKNOWN, REASON_ARCHIVE_WITHOUT_BINARIES); 652 PostFinishTask(UNKNOWN, REASON_ARCHIVE_WITHOUT_BINARIES);
624 return; 653 return;
625 } 654 }
655
656 if (!zipped_executable_ && results.has_archive)
657 type_ = ClientDownloadRequest::ZIPPED_ARCHIVE;
626 OnFileFeatureExtractionDone(); 658 OnFileFeatureExtractionDone();
627 } 659 }
628 660
629 static void RecordCountOfSignedOrWhitelistedDownload() { 661 static void RecordCountOfSignedOrWhitelistedDownload() {
630 UMA_HISTOGRAM_COUNTS("SBClientDownload.SignedOrWhitelistedDownload", 1); 662 UMA_HISTOGRAM_COUNTS("SBClientDownload.SignedOrWhitelistedDownload", 1);
631 } 663 }
632 664
633 void CheckWhitelists() { 665 void CheckWhitelists() {
634 DCHECK_CURRENTLY_ON(BrowserThread::IO); 666 DCHECK_CURRENTLY_ON(BrowserThread::IO);
635 667
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after
1136 GURL DownloadProtectionService::GetDownloadRequestUrl() { 1168 GURL DownloadProtectionService::GetDownloadRequestUrl() {
1137 GURL url(kDownloadRequestUrl); 1169 GURL url(kDownloadRequestUrl);
1138 std::string api_key = google_apis::GetAPIKey(); 1170 std::string api_key = google_apis::GetAPIKey();
1139 if (!api_key.empty()) 1171 if (!api_key.empty())
1140 url = url.Resolve("?key=" + net::EscapeQueryParamValue(api_key, true)); 1172 url = url.Resolve("?key=" + net::EscapeQueryParamValue(api_key, true));
1141 1173
1142 return url; 1174 return url;
1143 } 1175 }
1144 1176
1145 } // namespace safe_browsing 1177 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698