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

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

Issue 2226523002: Add separate plumbing for subresources with certificate errors (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix typo 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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 if (ran_insecure_content && displayed_insecure_content) 80 if (ran_insecure_content && displayed_insecure_content)
81 return SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT; 81 return SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT;
82 if (ran_insecure_content) 82 if (ran_insecure_content)
83 return SecurityStateModel::RAN_MIXED_CONTENT; 83 return SecurityStateModel::RAN_MIXED_CONTENT;
84 if (displayed_insecure_content) 84 if (displayed_insecure_content)
85 return SecurityStateModel::DISPLAYED_MIXED_CONTENT; 85 return SecurityStateModel::DISPLAYED_MIXED_CONTENT;
86 86
87 return SecurityStateModel::NO_MIXED_CONTENT; 87 return SecurityStateModel::NO_MIXED_CONTENT;
88 } 88 }
89 89
90 SecurityStateModel::ContentWithCertErrorsStatus GetContentWithCertErrorsStatus(
91 const SecurityStateModel::VisibleSecurityState& visible_security_state) {
92 bool ran = visible_security_state.ran_content_with_certificate_errors;
93 bool displayed =
94 visible_security_state.displayed_content_with_certificate_errors;
95 if (ran && displayed)
96 return SecurityStateModel::
97 RAN_AND_DISPLAYED_CONTENT_WITH_CERTIFICATE_ERRORS;
98 if (ran)
99 return SecurityStateModel::RAN_CONTENT_WITH_CERTIFICATE_ERRORS;
100 if (displayed)
101 return SecurityStateModel::DISPLAYED_CONTENT_WITH_CERTIFICATE_ERRORS;
102
103 return SecurityStateModel::NO_CONTENT_WITH_CERTIFICATE_ERRORS;
104 }
105
90 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest( 106 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest(
91 const SecurityStateModel::VisibleSecurityState& visible_security_state, 107 const SecurityStateModel::VisibleSecurityState& visible_security_state,
92 SecurityStateModelClient* client, 108 SecurityStateModelClient* client,
93 const scoped_refptr<net::X509Certificate>& cert, 109 const scoped_refptr<net::X509Certificate>& cert,
94 SecurityStateModel::SHA1DeprecationStatus sha1_status, 110 SecurityStateModel::SHA1DeprecationStatus sha1_status,
95 SecurityStateModel::MixedContentStatus mixed_content_status) { 111 SecurityStateModel::MixedContentStatus mixed_content_status,
112 SecurityStateModel::ContentWithCertErrorsStatus
113 content_with_cert_errors_status) {
96 DCHECK(visible_security_state.initialized); 114 DCHECK(visible_security_state.initialized);
97 GURL url = visible_security_state.url; 115 GURL url = visible_security_state.url;
98 switch (visible_security_state.initial_security_level) { 116 switch (visible_security_state.initial_security_level) {
99 case SecurityStateModel::NONE: { 117 case SecurityStateModel::NONE: {
100 if (!client->IsOriginSecure(url) && url.IsStandard()) 118 if (!client->IsOriginSecure(url) && url.IsStandard())
101 return GetSecurityLevelForNonSecureFieldTrial(); 119 return GetSecurityLevelForNonSecureFieldTrial();
102 return SecurityStateModel::NONE; 120 return SecurityStateModel::NONE;
103 } 121 }
104 122
105 case SecurityStateModel::SECURITY_ERROR: 123 case SecurityStateModel::SECURITY_ERROR:
106 return SecurityStateModel::SECURITY_ERROR; 124 return SecurityStateModel::SECURITY_ERROR;
107 125
108 case SecurityStateModel::SECURITY_WARNING: 126 case SecurityStateModel::SECURITY_WARNING:
109 case SecurityStateModel::SECURITY_POLICY_WARNING: 127 case SecurityStateModel::SECURITY_POLICY_WARNING:
110 return visible_security_state.initial_security_level; 128 return visible_security_state.initial_security_level;
111 129
112 case SecurityStateModel::SECURE: 130 case SecurityStateModel::SECURE:
113 case SecurityStateModel::EV_SECURE: { 131 case SecurityStateModel::EV_SECURE: {
114 // Major cert errors and active mixed content will generally be 132 // Major cert errors and active mixed content will generally be
115 // downgraded by the embedder to SECURITY_ERROR and handled above, 133 // downgraded by the embedder to SECURITY_ERROR and handled above,
116 // but downgrade here just in case. 134 // but downgrade here just in case.
117 net::CertStatus cert_status = visible_security_state.cert_status; 135 net::CertStatus cert_status = visible_security_state.cert_status;
118 if (net::IsCertStatusError(cert_status) && 136 if (net::IsCertStatusError(cert_status) &&
119 !net::IsCertStatusMinorError(cert_status)) { 137 !net::IsCertStatusMinorError(cert_status)) {
120 return SecurityStateModel::SECURITY_ERROR; 138 return SecurityStateModel::SECURITY_ERROR;
121 } 139 }
122 if (mixed_content_status == SecurityStateModel::RAN_MIXED_CONTENT || 140 if (mixed_content_status == SecurityStateModel::RAN_MIXED_CONTENT ||
123 mixed_content_status == 141 mixed_content_status ==
124 SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT) { 142 SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT ||
143 content_with_cert_errors_status ==
144 SecurityStateModel::RAN_CONTENT_WITH_CERTIFICATE_ERRORS ||
145 content_with_cert_errors_status ==
146 SecurityStateModel::
147 RAN_AND_DISPLAYED_CONTENT_WITH_CERTIFICATE_ERRORS) {
125 return SecurityStateModel::kRanInsecureContentLevel; 148 return SecurityStateModel::kRanInsecureContentLevel;
126 } 149 }
127 150
128 // Report if there is a policy cert first, before reporting any other 151 // Report if there is a policy cert first, before reporting any other
129 // authenticated-but-with-errors cases. A policy cert is a strong 152 // authenticated-but-with-errors cases. A policy cert is a strong
130 // indicator of a MITM being present (the enterprise), while the 153 // indicator of a MITM being present (the enterprise), while the
131 // other authenticated-but-with-errors indicate something may 154 // other authenticated-but-with-errors indicate something may
132 // be wrong, or may be wrong in the future, but is unclear now. 155 // be wrong, or may be wrong in the future, but is unclear now.
133 if (client->UsedPolicyInstalledCertificate()) 156 if (client->UsedPolicyInstalledCertificate())
134 return SecurityStateModel::SECURITY_POLICY_WARNING; 157 return SecurityStateModel::SECURITY_POLICY_WARNING;
135 158
136 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR) 159 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR)
137 return SecurityStateModel::SECURITY_ERROR; 160 return SecurityStateModel::SECURITY_ERROR;
138 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR) 161 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR)
139 return SecurityStateModel::NONE; 162 return SecurityStateModel::NONE;
140 163
141 // Active mixed content is handled above. 164 // Active mixed content is handled above.
142 DCHECK_NE(SecurityStateModel::RAN_MIXED_CONTENT, mixed_content_status); 165 DCHECK_NE(SecurityStateModel::RAN_MIXED_CONTENT, mixed_content_status);
143 DCHECK_NE(SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT, 166 DCHECK_NE(SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT,
144 mixed_content_status); 167 mixed_content_status);
145 if (mixed_content_status == SecurityStateModel::DISPLAYED_MIXED_CONTENT) 168 if (mixed_content_status == SecurityStateModel::DISPLAYED_MIXED_CONTENT ||
169 content_with_cert_errors_status ==
170 SecurityStateModel::DISPLAYED_CONTENT_WITH_CERTIFICATE_ERRORS)
146 return SecurityStateModel::kDisplayedInsecureContentLevel; 171 return SecurityStateModel::kDisplayedInsecureContentLevel;
147 172
148 if (net::IsCertStatusError(cert_status)) { 173 if (net::IsCertStatusError(cert_status)) {
149 // Major cert errors are handled above. 174 // Major cert errors are handled above.
150 DCHECK(net::IsCertStatusMinorError(cert_status)); 175 DCHECK(net::IsCertStatusMinorError(cert_status));
151 return SecurityStateModel::NONE; 176 return SecurityStateModel::NONE;
152 } 177 }
153 if (net::SSLConnectionStatusToVersion( 178 if (net::SSLConnectionStatusToVersion(
154 visible_security_state.connection_status) == 179 visible_security_state.connection_status) ==
155 net::SSL_CONNECTION_VERSION_SSL3) { 180 net::SSL_CONNECTION_VERSION_SSL3) {
(...skipping 16 matching lines...) Expand all
172 SecurityStateModel::SecurityInfo* security_info) { 197 SecurityStateModel::SecurityInfo* security_info) {
173 if (!visible_security_state.initialized) { 198 if (!visible_security_state.initialized) {
174 *security_info = SecurityStateModel::SecurityInfo(); 199 *security_info = SecurityStateModel::SecurityInfo();
175 return; 200 return;
176 } 201 }
177 security_info->cert_id = visible_security_state.cert_id; 202 security_info->cert_id = visible_security_state.cert_id;
178 security_info->sha1_deprecation_status = 203 security_info->sha1_deprecation_status =
179 GetSHA1DeprecationStatus(cert, visible_security_state); 204 GetSHA1DeprecationStatus(cert, visible_security_state);
180 security_info->mixed_content_status = 205 security_info->mixed_content_status =
181 GetMixedContentStatus(visible_security_state); 206 GetMixedContentStatus(visible_security_state);
207 security_info->content_with_cert_errors_status =
208 GetContentWithCertErrorsStatus(visible_security_state);
182 security_info->security_bits = visible_security_state.security_bits; 209 security_info->security_bits = visible_security_state.security_bits;
183 security_info->connection_status = visible_security_state.connection_status; 210 security_info->connection_status = visible_security_state.connection_status;
184 security_info->cert_status = visible_security_state.cert_status; 211 security_info->cert_status = visible_security_state.cert_status;
185 security_info->scheme_is_cryptographic = 212 security_info->scheme_is_cryptographic =
186 visible_security_state.url.SchemeIsCryptographic(); 213 visible_security_state.url.SchemeIsCryptographic();
187 security_info->pkp_bypassed = visible_security_state.pkp_bypassed; 214 security_info->pkp_bypassed = visible_security_state.pkp_bypassed;
188 security_info->is_secure_protocol_and_ciphersuite = 215 security_info->is_secure_protocol_and_ciphersuite =
189 (net::SSLConnectionStatusToVersion(security_info->connection_status) >= 216 (net::SSLConnectionStatusToVersion(security_info->connection_status) >=
190 net::SSL_CONNECTION_VERSION_TLS1_2 && 217 net::SSL_CONNECTION_VERSION_TLS1_2 &&
191 net::IsSecureTLSCipherSuite(net::SSLConnectionStatusToCipherSuite( 218 net::IsSecureTLSCipherSuite(net::SSLConnectionStatusToCipherSuite(
192 security_info->connection_status))); 219 security_info->connection_status)));
193 220
194 security_info->sct_verify_statuses = 221 security_info->sct_verify_statuses =
195 visible_security_state.sct_verify_statuses; 222 visible_security_state.sct_verify_statuses;
196 223
197 security_info->security_level = 224 security_info->security_level = GetSecurityLevelForRequest(
198 GetSecurityLevelForRequest(visible_security_state, client, cert, 225 visible_security_state, client, cert,
199 security_info->sha1_deprecation_status, 226 security_info->sha1_deprecation_status,
200 security_info->mixed_content_status); 227 security_info->mixed_content_status,
228 security_info->content_with_cert_errors_status);
201 } 229 }
202 230
203 } // namespace 231 } // namespace
204 232
205 const SecurityStateModel::SecurityLevel 233 const SecurityStateModel::SecurityLevel
206 SecurityStateModel::kDisplayedInsecureContentLevel = 234 SecurityStateModel::kDisplayedInsecureContentLevel =
207 SecurityStateModel::NONE; 235 SecurityStateModel::NONE;
208 const SecurityStateModel::SecurityLevel 236 const SecurityStateModel::SecurityLevel
209 SecurityStateModel::kRanInsecureContentLevel = 237 SecurityStateModel::kRanInsecureContentLevel =
210 SecurityStateModel::SECURITY_ERROR; 238 SecurityStateModel::SECURITY_ERROR;
211 239
212 SecurityStateModel::SecurityInfo::SecurityInfo() 240 SecurityStateModel::SecurityInfo::SecurityInfo()
213 : security_level(SecurityStateModel::NONE), 241 : security_level(SecurityStateModel::NONE),
214 sha1_deprecation_status(SecurityStateModel::NO_DEPRECATED_SHA1), 242 sha1_deprecation_status(SecurityStateModel::NO_DEPRECATED_SHA1),
215 mixed_content_status(SecurityStateModel::NO_MIXED_CONTENT), 243 mixed_content_status(SecurityStateModel::NO_MIXED_CONTENT),
244 content_with_cert_errors_status(
245 SecurityStateModel::NO_CONTENT_WITH_CERTIFICATE_ERRORS),
216 scheme_is_cryptographic(false), 246 scheme_is_cryptographic(false),
217 cert_status(0), 247 cert_status(0),
218 cert_id(0), 248 cert_id(0),
219 security_bits(-1), 249 security_bits(-1),
220 connection_status(0), 250 connection_status(0),
221 is_secure_protocol_and_ciphersuite(false), 251 is_secure_protocol_and_ciphersuite(false),
222 pkp_bypassed(false) {} 252 pkp_bypassed(false) {}
223 253
224 SecurityStateModel::SecurityInfo::~SecurityInfo() {} 254 SecurityStateModel::SecurityInfo::~SecurityInfo() {}
225 255
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 289
260 SecurityStateModel::VisibleSecurityState::VisibleSecurityState() 290 SecurityStateModel::VisibleSecurityState::VisibleSecurityState()
261 : initialized(false), 291 : initialized(false),
262 initial_security_level(SecurityStateModel::NONE), 292 initial_security_level(SecurityStateModel::NONE),
263 cert_id(0), 293 cert_id(0),
264 cert_status(0), 294 cert_status(0),
265 connection_status(0), 295 connection_status(0),
266 security_bits(-1), 296 security_bits(-1),
267 displayed_mixed_content(false), 297 displayed_mixed_content(false),
268 ran_mixed_content(false), 298 ran_mixed_content(false),
269 pkp_bypassed(false) {} 299 pkp_bypassed(false),
300 displayed_content_with_certificate_errors(false),
301 ran_content_with_certificate_errors(false) {}
270 302
271 SecurityStateModel::VisibleSecurityState::~VisibleSecurityState() {} 303 SecurityStateModel::VisibleSecurityState::~VisibleSecurityState() {}
272 304
273 bool SecurityStateModel::VisibleSecurityState::operator==( 305 bool SecurityStateModel::VisibleSecurityState::operator==(
274 const SecurityStateModel::VisibleSecurityState& other) const { 306 const SecurityStateModel::VisibleSecurityState& other) const {
275 return (url == other.url && 307 return (url == other.url &&
276 initial_security_level == other.initial_security_level && 308 initial_security_level == other.initial_security_level &&
277 cert_id == other.cert_id && cert_status == other.cert_status && 309 cert_id == other.cert_id && cert_status == other.cert_status &&
278 connection_status == other.connection_status && 310 connection_status == other.connection_status &&
279 security_bits == other.security_bits && 311 security_bits == other.security_bits &&
280 sct_verify_statuses == other.sct_verify_statuses && 312 sct_verify_statuses == other.sct_verify_statuses &&
281 displayed_mixed_content == other.displayed_mixed_content && 313 displayed_mixed_content == other.displayed_mixed_content &&
282 ran_mixed_content == other.ran_mixed_content && 314 ran_mixed_content == other.ran_mixed_content &&
283 pkp_bypassed == other.pkp_bypassed); 315 pkp_bypassed == other.pkp_bypassed &&
316 displayed_content_with_certificate_errors ==
317 other.displayed_content_with_certificate_errors &&
318 ran_content_with_certificate_errors ==
319 other.ran_content_with_certificate_errors);
284 } 320 }
285 321
286 } // namespace security_state 322 } // namespace security_state
OLDNEW
« no previous file with comments | « components/security_state/security_state_model.h ('k') | content/browser/site_per_process_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698