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

Unified Diff: components/data_reduction_proxy/browser/data_reduction_proxy_tamper_detect.h

Issue 338483002: Chrome Participated Tamper Detect (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: components/data_reduction_proxy/browser/data_reduction_proxy_tamper_detect.h
diff --git a/components/data_reduction_proxy/browser/data_reduction_proxy_tamper_detect.h b/components/data_reduction_proxy/browser/data_reduction_proxy_tamper_detect.h
new file mode 100644
index 0000000000000000000000000000000000000000..5d3f58d7e5869d5443bda43adc19373571015fd9
--- /dev/null
+++ b/components/data_reduction_proxy/browser/data_reduction_proxy_tamper_detect.h
@@ -0,0 +1,174 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_TAMPER_DETECT_H_
+#define COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_TAMPER_DETECT_H_
+
+#include <map>
+
+#include "net/http/http_response_headers.h"
bengr 2014/07/02 17:31:01 add: namespace net { class HttpResponseHeaders; }
xingx 2014/07/06 03:18:19 Done.
+
+namespace data_reduction_proxy {
+
+// There are two fingerprints will be added to Chrome-Proxy header.
bengr 2014/07/02 17:31:00 Remove "There are"
xingx 2014/07/06 03:18:19 Done.
+// One starts with |kTamperDetectFingerprintChromeProxy|, which is the
+// fingerprint for Chrome-Proxy header.
+// The other one starts with |kTamperDetectFingerprint|, which includes
+// all other fingerprints.
+const char kTamperDetectFingerprint[] = "fp=";
+const char kTamperDetectFingerprintChromeProxy[] = "cp=";
+
+// In fingerprint starts with |kTamperDetectFingerprint|, it contains multiple
bengr 2014/07/02 17:31:00 "In" --> "If |kTamperDetectFingerprint| contains
xingx 2014/07/06 03:18:19 Done.
+// fingerprints, each starts with a tag followed by "=" and its fingerprint
+// value. Currently we have 3 of fingerprints and thus 3 tags, defined below.
bengr 2014/07/02 17:30:59 Currently --> Three fingerprints and their respect
xingx 2014/07/06 03:18:19 Done.
+const char kTamperDetectFingerprintVia[] = "via";
bengr 2014/07/02 17:31:00 Are these needed outside the class? If not, define
xingx 2014/07/06 03:18:19 Done.
+const char kTamperDetectFingerprintOther[] = "oh";
+const char kTamperDetectFingerprintContengLength[] = "cl";
+
+// Macro for UMA report.
bengr 2014/07/02 17:30:59 Why is this in the .h?
xingx 2014/07/06 03:18:19 Done.
+// If |is_secure_scheme| is true, report to |HTTPS_histogram|,
+// otherwise report to |HTTP_histogram|.
+// Both's bucket are Carrier IDs |mcc_mnc|.
+// The other histogram counts the total number, |HTTP(S)_histogram| "_Total".
+// which only has one bucket, 0.
+#define UMA_REPORT(is_secure_scheme, HTTP_histogram, HTTPS_histogram, mcc_mnc) \
bengr 2014/07/02 17:31:00 Unless you've seen this pattern in other UMA repor
xingx 2014/07/06 03:18:20 Done.
+ do { \
+ if (is_secure_scheme) { \
bengr 2014/07/02 17:31:00 Is the scheme always https if |is_secure_scheme| i
xingx 2014/07/06 03:18:19 Done.
+ UMA_HISTOGRAM_SPARSE_SLOWLY(HTTPS_histogram, mcc_mnc); \
+ UMA_HISTOGRAM_SPARSE_SLOWLY(HTTPS_histogram "_Total", 0); \
bolian 2014/07/02 23:47:37 Should use UMA_HISTOGRAM_COUNTS here.
xingx 2014/07/06 03:18:19 Done.
+ } else { \
+ UMA_HISTOGRAM_SPARSE_SLOWLY(HTTP_histogram, mcc_mnc); \
+ UMA_HISTOGRAM_SPARSE_SLOWLY(HTTP_histogram "_Total", 0); \
bolian 2014/07/02 23:47:37 same here, UMA_HISTOGRAM_COUNTS
xingx 2014/07/06 03:18:19 Done.
+ }\
+ } while (0)
+
+// Utility function, exposed for unittest.
+// Return MD5 value for a given string |input|.
+std::string GetMD5(const std::string& input);
bengr 2014/07/02 17:31:00 I don't think you should expose such a function to
xingx 2014/07/06 03:18:19 Done.
+
+// Utility function, exposed for unittest.
+// Return all the values of a header field |header_name| of the
+// response header |headers|, as a vector.
+std::vector<std::string> GetHeaderValues(
bengr 2014/07/02 17:31:00 Do you really need this? HttpResponseHeaders parse
xingx 2014/07/06 03:18:19 Discussed with you, reason is I need to sort the v
+ const net::HttpResponseHeaders* headers, const std::string& header_name);
+
+// Utility function, exposed for unittest.
+// Check whether values of a header field |values| contains the Chrome-Proxy
+// header's fingerprint (starts with |kTamperDetectFingerprintChromeProxy|).
+// If there is, return true, and save Chrome-Proxy header's fingerprint to
+// |chrome_proxy_fingerprint|;
+// and save other fingerprints (starts with |kTamperDetectFingerprintOther|)
+// to |other_fingerprints|.
+// Return false if there is no Chrome-Proxy header's fingerprint found.
+bool ContainsTamperDetectFingerprints(std::vector<std::string>& values,
bengr 2014/07/02 17:31:00 Don't use non-const references.
xingx 2014/07/06 03:18:19 The function checks whether there is chrome-proxy
+ std::string& chrome_proxy_fingerprint,
+ std::string& other_fingerprints);
+
+// The main function for detecting tamper.
bengr 2014/07/02 17:31:00 Fill out comments to the 80-char limit.
xingx 2014/07/06 03:18:19 Done.
+// It takes two parameters as input,
+// 1. a pointer to HttpResponseHeaders,
+// 2. a boolean variable indicates whether the connection
+// between Chrome and data reduction proxy is on HTTPS or not.
+// For such response, the function checks whether there is a tamper detect
+// request (contains fingerprints) from data reduction proxy, if so, it checks
+// whether there are tampers and report the results to UMA.
+void CheckResponseFingerprint(const net::HttpResponseHeaders*, const bool);
+
+
+
+// The class for detecting tamper.
+// It wraps up the functionalities for tamper detection.
+// For each fingerprint, we need to implement two functions:
+// * checking function: returns tamper or not for such fingerprint;
+// (function name starts with Check...)
+// * reporting function: reporting results to corresponding UMA
+// when there are tampers detected.
+// (function name starts with Report...)
+class DataReductionProxyTamperDetect {
+ public:
+ DataReductionProxyTamperDetect(const net::HttpResponseHeaders*, const bool,
+ const unsigned, std::vector<std::string>*);
+ virtual ~DataReductionProxyTamperDetect();
+
+ // For Chrome-Proxy header tamper detection...
bolian 2014/07/02 23:47:37 Let's simplify and reformat the doc of this func a
xingx 2014/07/06 03:18:20 Done.
+ // Check whether values of data reduction proxy's header Chrome-Proxy
+ // have been tampered or not.
+ // It takes one parameters as input,
+ // 1. fingerprint received from data reduction proxy
+ // Returns true if it has been tampered.
+ bool CheckHeaderChromeProxy(const std::string&);
bengr 2014/07/02 17:31:00 Can this function be const? What about others belo
xingx 2014/07/06 03:18:19 Done.
+
+ // For Via header tamper detection...
bengr 2014/07/02 17:31:00 Use complete sentences in comments.
xingx 2014/07/06 03:18:19 Done.
+ // Check whether there are proxies/middleboxes between Chrome
+ // It takes one parameters as input,
+ // 1. fingerprint received from data reduction proxy
+ // Returns true if there are.
+ bool CheckHeaderVia(const std::string&);
bengr 2014/07/02 17:30:59 What does this function do?
xingx 2014/07/06 03:18:19 Done.
+ // Reporting function for Via header tampering.
+ void ReportHeaderVia();
+
+ // For other headers tamper detection...
+ // Check whether values of a predefined list of headers have been tampered.
+ // It takes one parameters as input,
+ // 1. fingerprint received from data reduction proxy
+ // Returns true if tamper detected for these headers.
+ bool CheckHeaderOtherHeaders(const std::string&);
+ // Reporting function for tampering of values of the list of headers.
+ void ReportHeaderOtherHeaders();
+
+ // For Content-Length tamper detection...
+ // Check whether the Content-Length value is different from what
+ // data reduction proxy sees. This is an indicator that the response body
+ // have been modified.
+ // It takes one parameters as input,
+ // 1. fingerprint received from data reduction proxy
+ // Returns true if different Content-Length value is observed.
+ bool CheckHeaderContentLength(const std::string&);
+ // Reporting function for Content-Length tamper detected.
+ void ReportHeaderContentLength();
+
+
+ // Function calls checking and reporting function for tamper detect.
+ // (i.e., above defined function pairs)
+ // Fingerprint type is specified by fingerprint name |key|
+ // (e.g., |kTamperDetectFingerprintVia|), and fingerprint from
+ // data reduction proxy is |fingerprint|.
+ // call it's corresponding check function as well as report function,
+ void CheckReportFingerprint(const std::string& key,
+ const std::string& fingerprint);
+
+
+ // Function pointer to checking function.
+ typedef bool (DataReductionProxyTamperDetect::*CheckTamper)(
bengr 2014/07/02 17:31:00 Why do you need function pointers?
xingx 2014/07/06 03:18:19 removed.
+ const std::string&);
+
+ // Function pointer to reporting function.
+ typedef void (DataReductionProxyTamperDetect::*ReportTamper)();
+
+ // Struct contains a pair of function pointers for one fingerprint:
+ // checking function pointer and one reporting function pointer.
+ struct CheckReportFuncs {
+ CheckTamper check_tamper_func;
bengr 2014/07/02 17:31:00 variable names should not be abbreviated. E.g., th
xingx 2014/07/06 03:18:19 Done.
+ ReportTamper report_tamper_func;
+ };
+
+ private:
+ // Response header.
+ const net::HttpResponseHeaders* response_headers;
bengr 2014/07/02 17:31:00 Add a blank line after each variable.
xingx 2014/07/06 03:18:19 Done.
+ // HTTPS or HTTP.
+ const bool is_secure_scheme;
+ // Carrier ID.
+ const unsigned mcc_mnc;
+ // Values for Chrome-Proxy header, with |kTamperDetectFingerprintChromeProxy|
+ // removed. Save it as temporary result so we don't need to parse
+ // Chrome-Proxy header twice.
+ std::vector<std::string>* clean_chrome_proxy_header_values;
+ // The checking function and reporting function pointers map, which maps
+ // a fingerprint name to |CheckReportFuncs| which contains pointers to
+ // corresponding checking function and reporting function.
+ std::map<std::string, CheckReportFuncs> check_report_func_map;
+};
+
+} // namespace data_reduction_proxy
+#endif // COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_TAMPER_DETECT_H_

Powered by Google App Engine
This is Rietveld 408576698