blob: 2d186f9c908c09070d9ef7b081bdb1b27e209054 [file] [log] [blame]
[email protected]33ca232f2012-04-10 00:08:451// 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
3// found in the LICENSE file.
4
5#include "chrome/browser/download/download_danger_prompt.h"
6
avie4d7b6f2015-12-26 00:59:187#include "base/macros.h"
Ilya Sherman982457e62017-12-13 02:19:368#include "base/metrics/histogram_functions.h"
jialiul70cd6f2c2016-02-02 23:24:579#include "base/strings/stringprintf.h"
jialiul7f11b742015-11-26 04:54:4910#include "chrome/browser/browser_process.h"
Micah Morton5675f902017-08-16 22:35:1911#include "chrome/browser/safe_browsing/download_protection/download_protection_service.h"
jialiul7f11b742015-11-26 04:54:4912#include "chrome/browser/safe_browsing/safe_browsing_service.h"
Min Qin0ca8e1ee2018-01-31 00:49:3513#include "components/download/public/common/download_danger_type.h"
Min Qina9f487872018-02-09 20:43:2314#include "components/download/public/common/download_item.h"
Colin Blundell641e4e42021-06-24 16:09:5315#include "components/safe_browsing/content/browser/web_ui/safe_browsing_ui.h"
Daniel Ruberyaf17ad32020-03-02 20:06:4916#include "components/safe_browsing/core/file_type_policies.h"
Xinghui Lu09e84f582021-05-11 19:18:2917#include "content/public/browser/browser_task_traits.h"
18#include "content/public/browser/browser_thread.h"
Daniel Ruberydd3f5a492020-08-18 19:20:3519#include "content/public/browser/download_item_utils.h"
[email protected]33ca232f2012-04-10 00:08:4520
jialiulee910ec12016-01-11 19:42:4621using safe_browsing::ClientDownloadResponse;
jialiul7f11b742015-11-26 04:54:4922using safe_browsing::ClientSafeBrowsingReportRequest;
[email protected]f85a34b2014-08-16 01:10:1623
[email protected]33ca232f2012-04-10 00:08:4524namespace {
25
jialiul70cd6f2c2016-02-02 23:24:5726const char kDownloadDangerPromptPrefix[] = "Download.DownloadDangerPrompt";
27
jialiul70cd6f2c2016-02-02 23:24:5728// Converts DownloadDangerType into their corresponding string.
29const char* GetDangerTypeString(
Min Qin0ca8e1ee2018-01-31 00:49:3530 const download::DownloadDangerType& danger_type) {
jialiul70cd6f2c2016-02-02 23:24:5731 switch (danger_type) {
Min Qin0ca8e1ee2018-01-31 00:49:3532 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE:
jialiul70cd6f2c2016-02-02 23:24:5733 return "DangerousFile";
Min Qin0ca8e1ee2018-01-31 00:49:3534 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL:
jialiul70cd6f2c2016-02-02 23:24:5735 return "DangerousURL";
Min Qin0ca8e1ee2018-01-31 00:49:3536 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
jialiul70cd6f2c2016-02-02 23:24:5737 return "DangerousContent";
Min Qin0ca8e1ee2018-01-31 00:49:3538 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST:
jialiul70cd6f2c2016-02-02 23:24:5739 return "DangerousHost";
Min Qin0ca8e1ee2018-01-31 00:49:3540 case download::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT:
jialiul70cd6f2c2016-02-02 23:24:5741 return "UncommonContent";
Min Qin0ca8e1ee2018-01-31 00:49:3542 case download::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED:
jialiul70cd6f2c2016-02-02 23:24:5743 return "PotentiallyUnwanted";
Daniel Ruberye357cb41a2019-07-08 20:22:2044 case download::DOWNLOAD_DANGER_TYPE_ASYNC_SCANNING:
45 return "AsyncScanning";
Daniel Rubery7746d122019-07-17 01:28:5946 case download::DOWNLOAD_DANGER_TYPE_BLOCKED_PASSWORD_PROTECTED:
47 return "BlockedPasswordProtected";
Daniel Rubery0b556b92019-10-15 20:35:0948 case download::DOWNLOAD_DANGER_TYPE_BLOCKED_TOO_LARGE:
49 return "BlockedTooLarge";
50 case download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING:
51 return "SensitiveContentWarning";
52 case download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_BLOCK:
53 return "SensitiveContentBlock";
54 case download::DOWNLOAD_DANGER_TYPE_DEEP_SCANNED_SAFE:
55 return "DeepScannedSafe";
56 case download::DOWNLOAD_DANGER_TYPE_DEEP_SCANNED_OPENED_DANGEROUS:
57 return "DeepScannedOpenedDangerous";
Daniel Ruberye6247df2019-12-16 19:51:5358 case download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING:
59 return "PromptForScanning";
Daniel Ruberyd6a3efe52020-03-13 19:51:4860 case download::DOWNLOAD_DANGER_TYPE_BLOCKED_UNSUPPORTED_FILETYPE:
61 return "BlockedUnsupportedFiletype";
Olabode Anise20accf32021-05-19 15:02:2362 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_ACCOUNT_COMPROMISE:
63 return "DangerousAccountCompromise";
Min Qin0ca8e1ee2018-01-31 00:49:3564 case download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS:
65 case download::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT:
66 case download::DOWNLOAD_DANGER_TYPE_USER_VALIDATED:
Scott Violet5177d692020-12-11 16:55:1067 case download::DOWNLOAD_DANGER_TYPE_ALLOWLISTED_BY_POLICY:
Min Qin0ca8e1ee2018-01-31 00:49:3568 case download::DOWNLOAD_DANGER_TYPE_MAX:
jialiul70cd6f2c2016-02-02 23:24:5769 break;
70 }
71 NOTREACHED();
72 return nullptr;
73}
74
[email protected]cce1bad62013-01-04 02:26:3875} // namespace
[email protected]33ca232f2012-04-10 00:08:4576
jialiul2c2638582016-06-08 22:18:0877void DownloadDangerPrompt::SendSafeBrowsingDownloadReport(
78 ClientSafeBrowsingReportRequest::ReportType report_type,
jialiul7f11b742015-11-26 04:54:4979 bool did_proceed,
Min Qina9f487872018-02-09 20:43:2380 const download::DownloadItem& download) {
jialiul7f11b742015-11-26 04:54:4981 safe_browsing::SafeBrowsingService* sb_service =
82 g_browser_process->safe_browsing_service();
Daniel Ruberydd3f5a492020-08-18 19:20:3583 Profile* profile = Profile::FromBrowserContext(
84 content::DownloadItemUtils::GetBrowserContext(&download));
Xinghui Lu09e84f582021-05-11 19:18:2985 auto report = std::make_unique<ClientSafeBrowsingReportRequest>();
86 report->set_type(report_type);
jialiulee910ec12016-01-11 19:42:4687 switch (download.GetDangerType()) {
Min Qin0ca8e1ee2018-01-31 00:49:3588 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL:
89 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
Xinghui Lu09e84f582021-05-11 19:18:2990 report->set_download_verdict(ClientDownloadResponse::DANGEROUS);
jialiulee910ec12016-01-11 19:42:4691 break;
Min Qin0ca8e1ee2018-01-31 00:49:3592 case download::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT:
Xinghui Lu09e84f582021-05-11 19:18:2993 report->set_download_verdict(ClientDownloadResponse::UNCOMMON);
jialiulee910ec12016-01-11 19:42:4694 break;
Min Qin0ca8e1ee2018-01-31 00:49:3595 case download::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED:
Xinghui Lu09e84f582021-05-11 19:18:2996 report->set_download_verdict(
97 ClientDownloadResponse::POTENTIALLY_UNWANTED);
jialiulee910ec12016-01-11 19:42:4698 break;
Min Qin0ca8e1ee2018-01-31 00:49:3599 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST:
Xinghui Lu09e84f582021-05-11 19:18:29100 report->set_download_verdict(ClientDownloadResponse::DANGEROUS_HOST);
jialiulee910ec12016-01-11 19:42:46101 break;
Olabode Anise20accf32021-05-19 15:02:23102 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_ACCOUNT_COMPROMISE:
103 report->set_download_verdict(
104 ClientDownloadResponse::DANGEROUS_ACCOUNT_COMPROMISE);
105 break;
jialiul7526f822016-05-20 22:22:27106 default: // Don't send report for any other danger types.
107 return;
jialiulee910ec12016-01-11 19:42:46108 }
Xinghui Lu09e84f582021-05-11 19:18:29109 report->set_url(download.GetURL().spec());
110 report->set_did_proceed(did_proceed);
jialiul2c2638582016-06-08 22:18:08111 std::string token =
Olabode Anise20accf32021-05-19 15:02:23112 safe_browsing::DownloadProtectionService::GetDownloadPingToken(&download);
jialiul2c2638582016-06-08 22:18:08113 if (!token.empty())
Xinghui Lu09e84f582021-05-11 19:18:29114 report->set_token(token);
jialiul7f11b742015-11-26 04:54:49115 std::string serialized_report;
Xinghui Lu09e84f582021-05-11 19:18:29116 if (report->SerializeToString(&serialized_report)) {
Daniel Ruberydd3f5a492020-08-18 19:20:35117 sb_service->SendSerializedDownloadReport(profile, serialized_report);
Xinghui Lu09e84f582021-05-11 19:18:29118
119 // The following is to log this ClientSafeBrowsingReportRequest on any open
120 // chrome://safe-browsing pages.
121 content::GetUIThreadTaskRunner({})->PostTask(
122 FROM_HERE,
123 base::BindOnce(
124 &safe_browsing::WebUIInfoSingleton::AddToCSBRRsSent,
125 base::Unretained(safe_browsing::WebUIInfoSingleton::GetInstance()),
126 std::move(report)));
127 } else {
jialiul7f11b742015-11-26 04:54:49128 DLOG(ERROR) << "Unable to serialize the threat report.";
Xinghui Lu09e84f582021-05-11 19:18:29129 }
jialiul7f11b742015-11-26 04:54:49130}
jialiul70cd6f2c2016-02-02 23:24:57131
132void DownloadDangerPrompt::RecordDownloadDangerPrompt(
133 bool did_proceed,
Min Qina9f487872018-02-09 20:43:23134 const download::DownloadItem& download) {
nparkerac9da062016-05-19 21:47:23135 int64_t file_type_uma_value =
136 safe_browsing::FileTypePolicies::GetInstance()->UmaValueForFile(
137 download.GetTargetFilePath());
Min Qin0ca8e1ee2018-01-31 00:49:35138 download::DownloadDangerType danger_type = download.GetDangerType();
jialiul70cd6f2c2016-02-02 23:24:57139
Ilya Sherman982457e62017-12-13 02:19:36140 base::UmaHistogramSparse(
jialiul70cd6f2c2016-02-02 23:24:57141 base::StringPrintf("%s.%s.Shown", kDownloadDangerPromptPrefix,
142 GetDangerTypeString(danger_type)),
nparkerac9da062016-05-19 21:47:23143 file_type_uma_value);
jialiul70cd6f2c2016-02-02 23:24:57144 if (did_proceed) {
Ilya Sherman982457e62017-12-13 02:19:36145 base::UmaHistogramSparse(
jialiul70cd6f2c2016-02-02 23:24:57146 base::StringPrintf("%s.%s.Proceed", kDownloadDangerPromptPrefix,
147 GetDangerTypeString(danger_type)),
nparkerac9da062016-05-19 21:47:23148 file_type_uma_value);
jialiul70cd6f2c2016-02-02 23:24:57149 }
150}