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

Side by Side Diff: components/security_state/security_state_model.cc

Issue 2224023003: Teach SecurityStateModel about subresources with cert errors (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/security_state/security_state_model.h" 5 #include "components/security_state/security_state_model.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/metrics/field_trial.h" 10 #include "base/metrics/field_trial.h"
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 static const int64_t kJanuary2017 = INT64_C(13127702400000000); 65 static const int64_t kJanuary2017 = INT64_C(13127702400000000);
66 if (cert->valid_expiry() >= base::Time::FromInternalValue(kJanuary2017)) 66 if (cert->valid_expiry() >= base::Time::FromInternalValue(kJanuary2017))
67 return SecurityStateModel::DEPRECATED_SHA1_MAJOR; 67 return SecurityStateModel::DEPRECATED_SHA1_MAJOR;
68 static const int64_t kJanuary2016 = INT64_C(13096080000000000); 68 static const int64_t kJanuary2016 = INT64_C(13096080000000000);
69 if (cert->valid_expiry() >= base::Time::FromInternalValue(kJanuary2016)) 69 if (cert->valid_expiry() >= base::Time::FromInternalValue(kJanuary2016))
70 return SecurityStateModel::DEPRECATED_SHA1_MINOR; 70 return SecurityStateModel::DEPRECATED_SHA1_MINOR;
71 71
72 return SecurityStateModel::NO_DEPRECATED_SHA1; 72 return SecurityStateModel::NO_DEPRECATED_SHA1;
73 } 73 }
74 74
75 SecurityStateModel::ContentStatus GetMixedContentStatus( 75 SecurityStateModel::ContentStatus GetContentStatus(bool displayed, bool ran) {
76 const SecurityStateModel::VisibleSecurityState& visible_security_state) { 76 if (ran && displayed)
77 bool ran_insecure_content = visible_security_state.ran_mixed_content;
78 bool displayed_insecure_content =
79 visible_security_state.displayed_mixed_content;
80 if (ran_insecure_content && displayed_insecure_content)
81 return SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN; 77 return SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN;
82 if (ran_insecure_content) 78 if (ran)
83 return SecurityStateModel::CONTENT_STATUS_RAN; 79 return SecurityStateModel::CONTENT_STATUS_RAN;
84 if (displayed_insecure_content) 80 if (displayed)
85 return SecurityStateModel::CONTENT_STATUS_DISPLAYED; 81 return SecurityStateModel::CONTENT_STATUS_DISPLAYED;
86
87 return SecurityStateModel::CONTENT_STATUS_NONE; 82 return SecurityStateModel::CONTENT_STATUS_NONE;
88 } 83 }
89 84
90 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest( 85 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest(
91 const SecurityStateModel::VisibleSecurityState& visible_security_state, 86 const SecurityStateModel::VisibleSecurityState& visible_security_state,
92 SecurityStateModelClient* client, 87 SecurityStateModelClient* client,
93 const scoped_refptr<net::X509Certificate>& cert, 88 const scoped_refptr<net::X509Certificate>& cert,
94 SecurityStateModel::SHA1DeprecationStatus sha1_status, 89 SecurityStateModel::SHA1DeprecationStatus sha1_status,
95 SecurityStateModel::ContentStatus mixed_content_status) { 90 SecurityStateModel::ContentStatus mixed_content_status,
91 SecurityStateModel::ContentStatus content_with_cert_errors_status) {
96 DCHECK(visible_security_state.initialized); 92 DCHECK(visible_security_state.initialized);
97 GURL url = visible_security_state.url; 93 GURL url = visible_security_state.url;
98 switch (visible_security_state.initial_security_level) { 94 switch (visible_security_state.initial_security_level) {
99 case SecurityStateModel::NONE: { 95 case SecurityStateModel::NONE: {
100 if (!client->IsOriginSecure(url) && url.IsStandard()) 96 if (!client->IsOriginSecure(url) && url.IsStandard())
101 return GetSecurityLevelForNonSecureFieldTrial(); 97 return GetSecurityLevelForNonSecureFieldTrial();
102 return SecurityStateModel::NONE; 98 return SecurityStateModel::NONE;
103 } 99 }
104 100
105 case SecurityStateModel::SECURITY_ERROR: 101 case SecurityStateModel::SECURITY_ERROR:
106 return SecurityStateModel::SECURITY_ERROR; 102 return SecurityStateModel::SECURITY_ERROR;
107 103
108 case SecurityStateModel::SECURITY_WARNING: 104 case SecurityStateModel::SECURITY_WARNING:
109 case SecurityStateModel::SECURITY_POLICY_WARNING: 105 case SecurityStateModel::SECURITY_POLICY_WARNING:
110 return visible_security_state.initial_security_level; 106 return visible_security_state.initial_security_level;
111 107
112 case SecurityStateModel::SECURE: 108 case SecurityStateModel::SECURE:
113 case SecurityStateModel::EV_SECURE: { 109 case SecurityStateModel::EV_SECURE: {
114 // Major cert errors and active mixed content will generally be 110 // Major cert errors and active mixed content will generally be
115 // downgraded by the embedder to SECURITY_ERROR and handled above, 111 // downgraded by the embedder to SECURITY_ERROR and handled above,
116 // but downgrade here just in case. 112 // but downgrade here just in case.
117 net::CertStatus cert_status = visible_security_state.cert_status; 113 net::CertStatus cert_status = visible_security_state.cert_status;
118 if (net::IsCertStatusError(cert_status) && 114 if (net::IsCertStatusError(cert_status) &&
119 !net::IsCertStatusMinorError(cert_status)) { 115 !net::IsCertStatusMinorError(cert_status)) {
120 return SecurityStateModel::SECURITY_ERROR; 116 return SecurityStateModel::SECURITY_ERROR;
121 } 117 }
122 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_RAN || 118 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_RAN ||
123 mixed_content_status == 119 mixed_content_status ==
120 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN ||
121 content_with_cert_errors_status ==
122 SecurityStateModel::CONTENT_STATUS_RAN ||
123 content_with_cert_errors_status ==
124 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN) { 124 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN) {
125 return SecurityStateModel::kRanInsecureContentLevel; 125 return SecurityStateModel::kRanInsecureContentLevel;
126 } 126 }
127 127
128 // Report if there is a policy cert first, before reporting any other 128 // Report if there is a policy cert first, before reporting any other
129 // authenticated-but-with-errors cases. A policy cert is a strong 129 // authenticated-but-with-errors cases. A policy cert is a strong
130 // indicator of a MITM being present (the enterprise), while the 130 // indicator of a MITM being present (the enterprise), while the
131 // other authenticated-but-with-errors indicate something may 131 // other authenticated-but-with-errors indicate something may
132 // be wrong, or may be wrong in the future, but is unclear now. 132 // be wrong, or may be wrong in the future, but is unclear now.
133 if (client->UsedPolicyInstalledCertificate()) 133 if (client->UsedPolicyInstalledCertificate())
134 return SecurityStateModel::SECURITY_POLICY_WARNING; 134 return SecurityStateModel::SECURITY_POLICY_WARNING;
135 135
136 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR) 136 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR)
137 return SecurityStateModel::SECURITY_ERROR; 137 return SecurityStateModel::SECURITY_ERROR;
138 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR) 138 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR)
139 return SecurityStateModel::NONE; 139 return SecurityStateModel::NONE;
140 140
141 // Active mixed content is handled above. 141 // Active mixed content is handled above.
142 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_RAN, mixed_content_status); 142 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_RAN, mixed_content_status);
143 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN, 143 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN,
144 mixed_content_status); 144 mixed_content_status);
145 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_DISPLAYED) 145 if (mixed_content_status ==
146 SecurityStateModel::CONTENT_STATUS_DISPLAYED ||
147 content_with_cert_errors_status ==
148 SecurityStateModel::CONTENT_STATUS_DISPLAYED)
146 return SecurityStateModel::kDisplayedInsecureContentLevel; 149 return SecurityStateModel::kDisplayedInsecureContentLevel;
147 150
148 if (net::IsCertStatusError(cert_status)) { 151 if (net::IsCertStatusError(cert_status)) {
149 // Major cert errors are handled above. 152 // Major cert errors are handled above.
150 DCHECK(net::IsCertStatusMinorError(cert_status)); 153 DCHECK(net::IsCertStatusMinorError(cert_status));
151 return SecurityStateModel::NONE; 154 return SecurityStateModel::NONE;
152 } 155 }
153 if (net::SSLConnectionStatusToVersion( 156 if (net::SSLConnectionStatusToVersion(
154 visible_security_state.connection_status) == 157 visible_security_state.connection_status) ==
155 net::SSL_CONNECTION_VERSION_SSL3) { 158 net::SSL_CONNECTION_VERSION_SSL3) {
(...skipping 15 matching lines...) Expand all
171 const scoped_refptr<net::X509Certificate>& cert, 174 const scoped_refptr<net::X509Certificate>& cert,
172 SecurityStateModel::SecurityInfo* security_info) { 175 SecurityStateModel::SecurityInfo* security_info) {
173 if (!visible_security_state.initialized) { 176 if (!visible_security_state.initialized) {
174 *security_info = SecurityStateModel::SecurityInfo(); 177 *security_info = SecurityStateModel::SecurityInfo();
175 return; 178 return;
176 } 179 }
177 security_info->cert_id = visible_security_state.cert_id; 180 security_info->cert_id = visible_security_state.cert_id;
178 security_info->sha1_deprecation_status = 181 security_info->sha1_deprecation_status =
179 GetSHA1DeprecationStatus(cert, visible_security_state); 182 GetSHA1DeprecationStatus(cert, visible_security_state);
180 security_info->mixed_content_status = 183 security_info->mixed_content_status =
181 GetMixedContentStatus(visible_security_state); 184 GetContentStatus(visible_security_state.displayed_mixed_content,
185 visible_security_state.ran_mixed_content);
186 security_info->content_with_cert_errors_status = GetContentStatus(
187 visible_security_state.displayed_content_with_cert_errors,
188 visible_security_state.ran_content_with_cert_errors);
182 security_info->security_bits = visible_security_state.security_bits; 189 security_info->security_bits = visible_security_state.security_bits;
183 security_info->connection_status = visible_security_state.connection_status; 190 security_info->connection_status = visible_security_state.connection_status;
184 security_info->cert_status = visible_security_state.cert_status; 191 security_info->cert_status = visible_security_state.cert_status;
185 security_info->scheme_is_cryptographic = 192 security_info->scheme_is_cryptographic =
186 visible_security_state.url.SchemeIsCryptographic(); 193 visible_security_state.url.SchemeIsCryptographic();
187 security_info->pkp_bypassed = visible_security_state.pkp_bypassed; 194 security_info->pkp_bypassed = visible_security_state.pkp_bypassed;
188 security_info->is_secure_protocol_and_ciphersuite = 195 security_info->is_secure_protocol_and_ciphersuite =
189 (net::SSLConnectionStatusToVersion(security_info->connection_status) >= 196 (net::SSLConnectionStatusToVersion(security_info->connection_status) >=
190 net::SSL_CONNECTION_VERSION_TLS1_2 && 197 net::SSL_CONNECTION_VERSION_TLS1_2 &&
191 net::IsSecureTLSCipherSuite(net::SSLConnectionStatusToCipherSuite( 198 net::IsSecureTLSCipherSuite(net::SSLConnectionStatusToCipherSuite(
192 security_info->connection_status))); 199 security_info->connection_status)));
193 200
194 security_info->sct_verify_statuses = 201 security_info->sct_verify_statuses =
195 visible_security_state.sct_verify_statuses; 202 visible_security_state.sct_verify_statuses;
196 203
197 security_info->security_level = 204 security_info->security_level = GetSecurityLevelForRequest(
198 GetSecurityLevelForRequest(visible_security_state, client, cert, 205 visible_security_state, client, cert,
199 security_info->sha1_deprecation_status, 206 security_info->sha1_deprecation_status,
200 security_info->mixed_content_status); 207 security_info->mixed_content_status,
208 security_info->content_with_cert_errors_status);
201 } 209 }
202 210
203 } // namespace 211 } // namespace
204 212
205 const SecurityStateModel::SecurityLevel 213 const SecurityStateModel::SecurityLevel
206 SecurityStateModel::kDisplayedInsecureContentLevel = 214 SecurityStateModel::kDisplayedInsecureContentLevel =
207 SecurityStateModel::NONE; 215 SecurityStateModel::NONE;
208 const SecurityStateModel::SecurityLevel 216 const SecurityStateModel::SecurityLevel
209 SecurityStateModel::kRanInsecureContentLevel = 217 SecurityStateModel::kRanInsecureContentLevel =
210 SecurityStateModel::SECURITY_ERROR; 218 SecurityStateModel::SECURITY_ERROR;
211 219
212 SecurityStateModel::SecurityInfo::SecurityInfo() 220 SecurityStateModel::SecurityInfo::SecurityInfo()
213 : security_level(SecurityStateModel::NONE), 221 : security_level(SecurityStateModel::NONE),
214 sha1_deprecation_status(SecurityStateModel::NO_DEPRECATED_SHA1), 222 sha1_deprecation_status(SecurityStateModel::NO_DEPRECATED_SHA1),
215 mixed_content_status(SecurityStateModel::CONTENT_STATUS_NONE), 223 mixed_content_status(SecurityStateModel::CONTENT_STATUS_NONE),
224 content_with_cert_errors_status(SecurityStateModel::CONTENT_STATUS_NONE),
216 scheme_is_cryptographic(false), 225 scheme_is_cryptographic(false),
217 cert_status(0), 226 cert_status(0),
218 cert_id(0), 227 cert_id(0),
219 security_bits(-1), 228 security_bits(-1),
220 connection_status(0), 229 connection_status(0),
221 is_secure_protocol_and_ciphersuite(false), 230 is_secure_protocol_and_ciphersuite(false),
222 pkp_bypassed(false) {} 231 pkp_bypassed(false) {}
223 232
224 SecurityStateModel::SecurityInfo::~SecurityInfo() {} 233 SecurityStateModel::SecurityInfo::~SecurityInfo() {}
225 234
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 268
260 SecurityStateModel::VisibleSecurityState::VisibleSecurityState() 269 SecurityStateModel::VisibleSecurityState::VisibleSecurityState()
261 : initialized(false), 270 : initialized(false),
262 initial_security_level(SecurityStateModel::NONE), 271 initial_security_level(SecurityStateModel::NONE),
263 cert_id(0), 272 cert_id(0),
264 cert_status(0), 273 cert_status(0),
265 connection_status(0), 274 connection_status(0),
266 security_bits(-1), 275 security_bits(-1),
267 displayed_mixed_content(false), 276 displayed_mixed_content(false),
268 ran_mixed_content(false), 277 ran_mixed_content(false),
278 displayed_content_with_cert_errors(false),
279 ran_content_with_cert_errors(false),
269 pkp_bypassed(false) {} 280 pkp_bypassed(false) {}
270 281
271 SecurityStateModel::VisibleSecurityState::~VisibleSecurityState() {} 282 SecurityStateModel::VisibleSecurityState::~VisibleSecurityState() {}
272 283
273 bool SecurityStateModel::VisibleSecurityState::operator==( 284 bool SecurityStateModel::VisibleSecurityState::operator==(
274 const SecurityStateModel::VisibleSecurityState& other) const { 285 const SecurityStateModel::VisibleSecurityState& other) const {
275 return (url == other.url && 286 return (url == other.url &&
276 initial_security_level == other.initial_security_level && 287 initial_security_level == other.initial_security_level &&
277 cert_id == other.cert_id && cert_status == other.cert_status && 288 cert_id == other.cert_id && cert_status == other.cert_status &&
278 connection_status == other.connection_status && 289 connection_status == other.connection_status &&
279 security_bits == other.security_bits && 290 security_bits == other.security_bits &&
280 sct_verify_statuses == other.sct_verify_statuses && 291 sct_verify_statuses == other.sct_verify_statuses &&
281 displayed_mixed_content == other.displayed_mixed_content && 292 displayed_mixed_content == other.displayed_mixed_content &&
282 ran_mixed_content == other.ran_mixed_content && 293 ran_mixed_content == other.ran_mixed_content &&
294 displayed_content_with_cert_errors ==
295 other.displayed_content_with_cert_errors &&
296 ran_content_with_cert_errors == other.ran_content_with_cert_errors &&
283 pkp_bypassed == other.pkp_bypassed); 297 pkp_bypassed == other.pkp_bypassed);
284 } 298 }
285 299
286 } // namespace security_state 300 } // namespace security_state
OLDNEW
« no previous file with comments | « components/security_state/security_state_model.h ('k') | components/security_state/security_state_model_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698