Block-all-connection-requests-with-qjz9zk-in-the-domain-name-or-with-a-trk-scheme.patch 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. From: csagan5 <32685696+csagan5@users.noreply.github.com>
  2. Date: Wed, 30 Oct 2019 11:50:13 +0100
  3. Subject: Block all connection requests with 'qjz9zk' in the domain name or
  4. with a 'trk:' scheme.
  5. An info bar is displayed unless the --disable-trkbar command-line flag or the chrome://flag option is used.
  6. This patch is based on Iridium's 'net: add "trk:" scheme and help identify URLs being retrieved'
  7. ---
  8. .../chrome_autocomplete_scheme_classifier.cc | 1 +
  9. chrome/browser/history/history_utils.cc | 1 +
  10. chrome/browser/ui/singleton_tabs.cc | 3 +-
  11. .../browser/url_request_context_factory.cc | 7 +++-
  12. .../omnibox/browser/autocomplete_input.cc | 7 ++--
  13. components/url_formatter/url_fixer.cc | 4 +++
  14. .../child_process_security_policy_impl.cc | 1 +
  15. net/BUILD.gn | 2 ++
  16. net/url_request/trk_protocol_handler.cc | 26 +++++++++++++++
  17. net/url_request/trk_protocol_handler.h | 33 +++++++++++++++++++
  18. net/url_request/url_request.cc | 8 +++++
  19. .../url_request_context_builder.cc | 4 +++
  20. url/url_constants.cc | 1 +
  21. url/url_constants.h | 1 +
  22. url/url_util.cc | 2 ++
  23. 15 files changed, 97 insertions(+), 4 deletions(-)
  24. create mode 100644 net/url_request/trk_protocol_handler.cc
  25. create mode 100644 net/url_request/trk_protocol_handler.h
  26. diff --git a/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc b/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
  27. --- a/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
  28. +++ b/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
  29. @@ -28,6 +28,7 @@ ChromeAutocompleteSchemeClassifier::GetInputTypeForScheme(
  30. if (base::IsStringASCII(scheme) &&
  31. (ProfileIOData::IsHandledProtocol(scheme) ||
  32. base::LowerCaseEqualsASCII(scheme, content::kViewSourceScheme) ||
  33. + base::LowerCaseEqualsASCII(scheme, url::kTraceScheme) ||
  34. base::LowerCaseEqualsASCII(scheme, url::kJavaScriptScheme) ||
  35. base::LowerCaseEqualsASCII(scheme, url::kDataScheme))) {
  36. return metrics::OmniboxInputType::URL;
  37. diff --git a/chrome/browser/history/history_utils.cc b/chrome/browser/history/history_utils.cc
  38. --- a/chrome/browser/history/history_utils.cc
  39. +++ b/chrome/browser/history/history_utils.cc
  40. @@ -22,6 +22,7 @@ bool CanAddURLToHistory(const GURL& url) {
  41. url.SchemeIs(content::kChromeDevToolsScheme) ||
  42. url.SchemeIs(content::kChromeUIScheme) ||
  43. url.SchemeIs(content::kViewSourceScheme) ||
  44. + url.SchemeIs(url::kTraceScheme) ||
  45. url.SchemeIs(chrome::kChromeNativeScheme) ||
  46. url.SchemeIs(chrome::kChromeSearchScheme) ||
  47. url.SchemeIs(dom_distiller::kDomDistillerScheme) ||
  48. diff --git a/chrome/browser/ui/singleton_tabs.cc b/chrome/browser/ui/singleton_tabs.cc
  49. --- a/chrome/browser/ui/singleton_tabs.cc
  50. +++ b/chrome/browser/ui/singleton_tabs.cc
  51. @@ -100,7 +100,8 @@ int GetIndexOfExistingTab(Browser* browser, const NavigateParams& params) {
  52. // Skip view-source tabs. This is needed because RewriteURLIfNecessary
  53. // removes the "view-source:" scheme which leads to incorrect matching.
  54. - if (tab_url.SchemeIs(content::kViewSourceScheme))
  55. + if (tab_url.SchemeIs(content::kViewSourceScheme) ||
  56. + tab_url.SchemeIs(url::kTraceScheme))
  57. continue;
  58. GURL rewritten_tab_url = tab_url;
  59. diff --git a/chromecast/browser/url_request_context_factory.cc b/chromecast/browser/url_request_context_factory.cc
  60. --- a/chromecast/browser/url_request_context_factory.cc
  61. +++ b/chromecast/browser/url_request_context_factory.cc
  62. @@ -39,6 +39,7 @@
  63. #include "net/http/http_stream_factory.h"
  64. #include "net/proxy_resolution/proxy_resolution_service.h"
  65. #include "net/ssl/ssl_config_service_defaults.h"
  66. +#include "net/url_request/trk_protocol_handler.h"
  67. #include "net/url_request/url_request_context.h"
  68. #include "net/url_request/url_request_context_builder.h"
  69. #include "net/url_request/url_request_context_getter.h"
  70. @@ -245,13 +246,17 @@ void URLRequestContextFactory::InitializeMainContextDependencies(
  71. new net::URLRequestJobFactoryImpl());
  72. // Keep ProtocolHandlers added in sync with
  73. // CastContentBrowserClient::IsHandledURL().
  74. + bool set_protocol = false;
  75. for (content::ProtocolHandlerMap::iterator it = protocol_handlers->begin();
  76. it != protocol_handlers->end();
  77. ++it) {
  78. - bool set_protocol =
  79. + set_protocol =
  80. job_factory->SetProtocolHandler(it->first, std::move(it->second));
  81. DCHECK(set_protocol);
  82. }
  83. + set_protocol = job_factory->SetProtocolHandler(
  84. + url::kTraceScheme, base::WrapUnique(new net::TrkProtocolHandler));
  85. + DCHECK(set_protocol);
  86. // Set up interceptors in the reverse order.
  87. std::unique_ptr<net::URLRequestJobFactory> top_job_factory =
  88. diff --git a/components/omnibox/browser/autocomplete_input.cc b/components/omnibox/browser/autocomplete_input.cc
  89. --- a/components/omnibox/browser/autocomplete_input.cc
  90. +++ b/components/omnibox/browser/autocomplete_input.cc
  91. @@ -496,7 +496,8 @@ void AutocompleteInput::ParseForEmphasizeComponents(
  92. // For the view-source and blob schemes, we should emphasize the host of the
  93. // URL qualified by the view-source or blob prefix.
  94. if ((base::LowerCaseEqualsASCII(scheme_str, kViewSourceScheme) ||
  95. - base::LowerCaseEqualsASCII(scheme_str, url::kBlobScheme)) &&
  96. + base::LowerCaseEqualsASCII(scheme_str, url::kBlobScheme) ||
  97. + base::LowerCaseEqualsASCII(scheme_str, url::kTraceScheme)) &&
  98. (static_cast<int>(text.length()) > after_scheme_and_colon)) {
  99. // Obtain the URL prefixed by view-source or blob and parse it.
  100. base::string16 real_url(text.substr(after_scheme_and_colon));
  101. @@ -569,7 +570,9 @@ int AutocompleteInput::NumNonHostComponents(const url::Parsed& parts) {
  102. bool AutocompleteInput::HasHTTPScheme(const base::string16& input) {
  103. std::string utf8_input(base::UTF16ToUTF8(input));
  104. url::Component scheme;
  105. - if (url::FindAndCompareScheme(utf8_input, kViewSourceScheme, &scheme)) {
  106. + if (url::FindAndCompareScheme(utf8_input, url::kTraceScheme, &scheme)) {
  107. + return false;
  108. + } else if (url::FindAndCompareScheme(utf8_input, kViewSourceScheme, &scheme)) {
  109. utf8_input.erase(0, scheme.end() + 1);
  110. }
  111. return url::FindAndCompareScheme(utf8_input, url::kHttpScheme, nullptr);
  112. diff --git a/components/url_formatter/url_fixer.cc b/components/url_formatter/url_fixer.cc
  113. --- a/components/url_formatter/url_fixer.cc
  114. +++ b/components/url_formatter/url_fixer.cc
  115. @@ -552,6 +552,10 @@ GURL FixupURL(const std::string& text, const std::string& desired_tld) {
  116. }
  117. }
  118. + if (scheme == url::kTraceScheme) {
  119. + return GURL();
  120. + }
  121. +
  122. // We handle the file scheme separately.
  123. if (scheme == url::kFileScheme)
  124. return GURL(parts.scheme.is_valid() ? text : FixupPath(text));
  125. diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc
  126. --- a/content/browser/child_process_security_policy_impl.cc
  127. +++ b/content/browser/child_process_security_policy_impl.cc
  128. @@ -513,6 +513,7 @@ ChildProcessSecurityPolicyImpl::ChildProcessSecurityPolicyImpl() {
  129. RegisterWebSafeScheme(url::kHttpsScheme);
  130. RegisterWebSafeScheme(url::kFtpScheme);
  131. RegisterWebSafeScheme(url::kDataScheme);
  132. + RegisterWebSafeScheme(url::kTraceScheme);
  133. RegisterWebSafeScheme("feed");
  134. // TODO(nick): https://crbug.com/651534 blob: and filesystem: schemes embed
  135. diff --git a/net/BUILD.gn b/net/BUILD.gn
  136. --- a/net/BUILD.gn
  137. +++ b/net/BUILD.gn
  138. @@ -1801,6 +1801,8 @@ component("net") {
  139. "url_request/report_sender.h",
  140. "url_request/static_http_user_agent_settings.cc",
  141. "url_request/static_http_user_agent_settings.h",
  142. + "url_request/trk_protocol_handler.cc",
  143. + "url_request/trk_protocol_handler.h",
  144. "url_request/url_fetcher.cc",
  145. "url_request/url_fetcher.h",
  146. "url_request/url_fetcher_core.cc",
  147. diff --git a/net/url_request/trk_protocol_handler.cc b/net/url_request/trk_protocol_handler.cc
  148. new file mode 100644
  149. --- /dev/null
  150. +++ b/net/url_request/trk_protocol_handler.cc
  151. @@ -0,0 +1,26 @@
  152. +// Copyright (c) 2018 The ungoogled-chromium Authors. All rights reserved.
  153. +// Use of this source code is governed by a BSD-style license that can be
  154. +// found in the LICENSE file.
  155. +
  156. +#include "net/url_request/trk_protocol_handler.h"
  157. +
  158. +#include "base/logging.h"
  159. +#include "net/base/net_errors.h"
  160. +#include "net/url_request/url_request_error_job.h"
  161. +
  162. +namespace net {
  163. +
  164. +TrkProtocolHandler::TrkProtocolHandler() = default;
  165. +
  166. +URLRequestJob* TrkProtocolHandler::MaybeCreateJob(
  167. + URLRequest* request, NetworkDelegate* network_delegate) const {
  168. + LOG(ERROR) << "Blocked URL in TrkProtocolHandler: " << request->original_url();
  169. + return new URLRequestErrorJob(
  170. + request, network_delegate, ERR_BLOCKED_BY_CLIENT);
  171. +}
  172. +
  173. +bool TrkProtocolHandler::IsSafeRedirectTarget(const GURL& location) const {
  174. + return true;
  175. +}
  176. +
  177. +} // namespace net
  178. diff --git a/net/url_request/trk_protocol_handler.h b/net/url_request/trk_protocol_handler.h
  179. new file mode 100644
  180. --- /dev/null
  181. +++ b/net/url_request/trk_protocol_handler.h
  182. @@ -0,0 +1,33 @@
  183. +// Copyright (c) 2018 The ungoogled-chromium Authors. All rights reserved.
  184. +// Use of this source code is governed by a BSD-style license that can be
  185. +// found in the LICENSE file.
  186. +
  187. +#ifndef NET_URL_REQUEST_TRK_PROTOCOL_HANDLER_H_
  188. +#define NET_URL_REQUEST_TRK_PROTOCOL_HANDLER_H_
  189. +
  190. +#include "base/compiler_specific.h"
  191. +#include "base/macros.h"
  192. +#include "net/base/net_export.h"
  193. +#include "net/url_request/url_request_job_factory.h"
  194. +
  195. +namespace net {
  196. +
  197. +class URLRequestJob;
  198. +
  199. +// Implements a ProtocolHandler for Trk jobs.
  200. +class NET_EXPORT TrkProtocolHandler
  201. + : public URLRequestJobFactory::ProtocolHandler {
  202. + public:
  203. + TrkProtocolHandler();
  204. + URLRequestJob* MaybeCreateJob(
  205. + URLRequest* request,
  206. + NetworkDelegate* network_delegate) const override;
  207. + bool IsSafeRedirectTarget(const GURL& location) const override;
  208. +
  209. + private:
  210. + DISALLOW_COPY_AND_ASSIGN(TrkProtocolHandler);
  211. +};
  212. +
  213. +} // namespace net
  214. +
  215. +#endif // NET_URL_REQUEST_TRK_PROTOCOL_HANDLER_H_
  216. diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc
  217. --- a/net/url_request/url_request.cc
  218. +++ b/net/url_request/url_request.cc
  219. @@ -13,6 +13,7 @@
  220. #include "base/metrics/histogram_macros.h"
  221. #include "base/rand_util.h"
  222. #include "base/stl_util.h"
  223. +#include "base/strings/string_util.h"
  224. #include "base/strings/utf_string_conversions.h"
  225. #include "base/synchronization/lock.h"
  226. #include "base/threading/thread_task_runner_handle.h"
  227. @@ -40,6 +41,7 @@
  228. #include "net/url_request/url_request_redirect_job.h"
  229. #include "url/gurl.h"
  230. #include "url/origin.h"
  231. +#include "url/url_constants.h"
  232. using base::Time;
  233. using std::string;
  234. @@ -592,6 +594,12 @@ URLRequest::URLRequest(const GURL& url,
  235. // Sanity check out environment.
  236. DCHECK(base::ThreadTaskRunnerHandle::IsSet());
  237. + if (!url.SchemeIs(url::kTraceScheme) &&
  238. + base::EndsWith(url.host(), "qjz9zk", base::CompareCase::INSENSITIVE_ASCII)) {
  239. + LOG(ERROR) << "Block URL in URLRequest: " << url;
  240. + url_chain_[0] = GURL(url::kTraceScheme + (":" + url.possibly_invalid_spec()));
  241. + }
  242. +
  243. context->url_requests()->insert(this);
  244. net_log_.BeginEvent(NetLogEventType::REQUEST_ALIVE, [&] {
  245. return NetLogURLRequestConstructorParams(url, priority_,
  246. diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
  247. --- a/net/url_request/url_request_context_builder.cc
  248. +++ b/net/url_request/url_request_context_builder.cc
  249. @@ -40,6 +40,7 @@
  250. #include "net/ssl/ssl_config_service_defaults.h"
  251. #include "net/url_request/data_protocol_handler.h"
  252. #include "net/url_request/static_http_user_agent_settings.h"
  253. +#include "net/url_request/trk_protocol_handler.h"
  254. #include "net/url_request/url_request_context.h"
  255. #include "net/url_request/url_request_context_storage.h"
  256. #include "net/url_request/url_request_intercepting_job_factory.h"
  257. @@ -641,6 +642,9 @@ std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() {
  258. }
  259. url_request_interceptors_.clear();
  260. }
  261. + job_factory->SetProtocolHandler(url::kTraceScheme,
  262. + std::make_unique<TrkProtocolHandler>());
  263. +
  264. if (create_intercepting_job_factory_) {
  265. top_job_factory = std::move(create_intercepting_job_factory_)
  266. .Run(std::move(top_job_factory));
  267. diff --git a/url/url_constants.cc b/url/url_constants.cc
  268. --- a/url/url_constants.cc
  269. +++ b/url/url_constants.cc
  270. @@ -26,6 +26,7 @@ const char kHttpsScheme[] = "https";
  271. const char kJavaScriptScheme[] = "javascript";
  272. const char kMailToScheme[] = "mailto";
  273. const char kTelScheme[] = "tel";
  274. +const char kTraceScheme[] = "trk";
  275. const char kWsScheme[] = "ws";
  276. const char kWssScheme[] = "wss";
  277. diff --git a/url/url_constants.h b/url/url_constants.h
  278. --- a/url/url_constants.h
  279. +++ b/url/url_constants.h
  280. @@ -32,6 +32,7 @@ COMPONENT_EXPORT(URL) extern const char kHttpsScheme[];
  281. COMPONENT_EXPORT(URL) extern const char kJavaScriptScheme[];
  282. COMPONENT_EXPORT(URL) extern const char kMailToScheme[];
  283. COMPONENT_EXPORT(URL) extern const char kTelScheme[];
  284. +COMPONENT_EXPORT(URL) extern const char kTraceScheme[];
  285. COMPONENT_EXPORT(URL) extern const char kWsScheme[];
  286. COMPONENT_EXPORT(URL) extern const char kWssScheme[];
  287. diff --git a/url/url_util.cc b/url/url_util.cc
  288. --- a/url/url_util.cc
  289. +++ b/url/url_util.cc
  290. @@ -52,6 +52,7 @@ struct SchemeRegistry {
  291. kHttpsScheme,
  292. kAboutScheme,
  293. kDataScheme,
  294. + kTraceScheme,
  295. kWssScheme,
  296. };
  297. @@ -67,6 +68,7 @@ struct SchemeRegistry {
  298. kAboutScheme,
  299. kJavaScriptScheme,
  300. kDataScheme,
  301. + kTraceScheme,
  302. };
  303. // Schemes that can be sent CORS requests.
  304. --
  305. 2.17.1