| OLD | NEW |
| 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/core/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" |
| 11 #include "base/metrics/histogram_macros.h" | 11 #include "base/metrics/histogram_macros.h" |
| 12 #include "components/security_state/security_state_model_client.h" | 12 #include "components/security_state/core/switches.h" |
| 13 #include "components/security_state/switches.h" | |
| 14 #include "net/ssl/ssl_cipher_suite_names.h" | 13 #include "net/ssl/ssl_cipher_suite_names.h" |
| 15 #include "net/ssl/ssl_connection_status_flags.h" | 14 #include "net/ssl/ssl_connection_status_flags.h" |
| 16 | 15 |
| 17 namespace security_state { | 16 namespace security_state { |
| 18 | 17 |
| 19 namespace { | 18 namespace { |
| 20 | 19 |
| 21 // Do not change or reorder this enum, and add new values at the end. It is used | 20 // Do not change or reorder this enum, and add new values at the end. It is used |
| 22 // in the MarkHttpAs histogram. | 21 // in the MarkHttpAs histogram. |
| 23 enum MarkHttpStatus { NEUTRAL, NON_SECURE, HTTP_SHOW_WARNING, LAST_STATUS }; | 22 enum MarkHttpStatus { NEUTRAL, NON_SECURE, HTTP_SHOW_WARNING, LAST_STATUS }; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 return SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN; | 110 return SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN; |
| 112 if (ran) | 111 if (ran) |
| 113 return SecurityStateModel::CONTENT_STATUS_RAN; | 112 return SecurityStateModel::CONTENT_STATUS_RAN; |
| 114 if (displayed) | 113 if (displayed) |
| 115 return SecurityStateModel::CONTENT_STATUS_DISPLAYED; | 114 return SecurityStateModel::CONTENT_STATUS_DISPLAYED; |
| 116 return SecurityStateModel::CONTENT_STATUS_NONE; | 115 return SecurityStateModel::CONTENT_STATUS_NONE; |
| 117 } | 116 } |
| 118 | 117 |
| 119 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest( | 118 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest( |
| 120 const SecurityStateModel::VisibleSecurityState& visible_security_state, | 119 const SecurityStateModel::VisibleSecurityState& visible_security_state, |
| 121 SecurityStateModelClient* client, | 120 bool used_policy_installed_certificate, |
| 121 const SecurityStateModel::IsOriginSecureCallback& is_origin_secure_callback, |
| 122 SecurityStateModel::SHA1DeprecationStatus sha1_status, | 122 SecurityStateModel::SHA1DeprecationStatus sha1_status, |
| 123 SecurityStateModel::ContentStatus mixed_content_status, | 123 SecurityStateModel::ContentStatus mixed_content_status, |
| 124 SecurityStateModel::ContentStatus content_with_cert_errors_status) { | 124 SecurityStateModel::ContentStatus content_with_cert_errors_status) { |
| 125 DCHECK(visible_security_state.connection_info_initialized || | 125 DCHECK(visible_security_state.connection_info_initialized || |
| 126 visible_security_state.fails_malware_check); | 126 visible_security_state.fails_malware_check); |
| 127 | 127 |
| 128 // Override the connection security information if the website failed the | 128 // Override the connection security information if the website failed the |
| 129 // browser's malware checks. | 129 // browser's malware checks. |
| 130 if (visible_security_state.fails_malware_check) | 130 if (visible_security_state.fails_malware_check) |
| 131 return SecurityStateModel::DANGEROUS; | 131 return SecurityStateModel::DANGEROUS; |
| 132 | 132 |
| 133 GURL url = visible_security_state.url; | 133 GURL url = visible_security_state.url; |
| 134 | 134 |
| 135 bool is_cryptographic_with_certificate = | 135 bool is_cryptographic_with_certificate = |
| 136 (url.SchemeIsCryptographic() && visible_security_state.certificate); | 136 (url.SchemeIsCryptographic() && visible_security_state.certificate); |
| 137 | 137 |
| 138 // Set the security level to DANGEROUS for major certificate errors. | 138 // Set the security level to DANGEROUS for major certificate errors. |
| 139 if (is_cryptographic_with_certificate && | 139 if (is_cryptographic_with_certificate && |
| 140 net::IsCertStatusError(visible_security_state.cert_status) && | 140 net::IsCertStatusError(visible_security_state.cert_status) && |
| 141 !net::IsCertStatusMinorError(visible_security_state.cert_status)) { | 141 !net::IsCertStatusMinorError(visible_security_state.cert_status)) { |
| 142 return SecurityStateModel::DANGEROUS; | 142 return SecurityStateModel::DANGEROUS; |
| 143 } | 143 } |
| 144 | 144 |
| 145 // Choose the appropriate security level for HTTP requests. | 145 // Choose the appropriate security level for HTTP requests. |
| 146 if (!is_cryptographic_with_certificate) { | 146 if (!is_cryptographic_with_certificate) { |
| 147 if (!client->IsOriginSecure(url) && url.IsStandard()) { | 147 if (!is_origin_secure_callback.Run(url) && url.IsStandard()) { |
| 148 return GetSecurityLevelForNonSecureFieldTrial( | 148 return GetSecurityLevelForNonSecureFieldTrial( |
| 149 visible_security_state.displayed_password_field_on_http || | 149 visible_security_state.displayed_password_field_on_http || |
| 150 visible_security_state.displayed_credit_card_field_on_http); | 150 visible_security_state.displayed_credit_card_field_on_http); |
| 151 } | 151 } |
| 152 return SecurityStateModel::NONE; | 152 return SecurityStateModel::NONE; |
| 153 } | 153 } |
| 154 | 154 |
| 155 // Downgrade the security level for active insecure subresources. | 155 // Downgrade the security level for active insecure subresources. |
| 156 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_RAN || | 156 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_RAN || |
| 157 mixed_content_status == | 157 mixed_content_status == |
| 158 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN || | 158 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN || |
| 159 content_with_cert_errors_status == | 159 content_with_cert_errors_status == |
| 160 SecurityStateModel::CONTENT_STATUS_RAN || | 160 SecurityStateModel::CONTENT_STATUS_RAN || |
| 161 content_with_cert_errors_status == | 161 content_with_cert_errors_status == |
| 162 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN) { | 162 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN) { |
| 163 return SecurityStateModel::kRanInsecureContentLevel; | 163 return SecurityStateModel::kRanInsecureContentLevel; |
| 164 } | 164 } |
| 165 | 165 |
| 166 // Report if there is a policy cert first, before reporting any other | 166 // Report if there is a policy cert first, before reporting any other |
| 167 // authenticated-but-with-errors cases. A policy cert is a strong | 167 // authenticated-but-with-errors cases. A policy cert is a strong |
| 168 // indicator of a MITM being present (the enterprise), while the | 168 // indicator of a MITM being present (the enterprise), while the |
| 169 // other authenticated-but-with-errors indicate something may | 169 // other authenticated-but-with-errors indicate something may |
| 170 // be wrong, or may be wrong in the future, but is unclear now. | 170 // be wrong, or may be wrong in the future, but is unclear now. |
| 171 if (client->UsedPolicyInstalledCertificate()) | 171 if (used_policy_installed_certificate) |
| 172 return SecurityStateModel::SECURE_WITH_POLICY_INSTALLED_CERT; | 172 return SecurityStateModel::SECURE_WITH_POLICY_INSTALLED_CERT; |
| 173 | 173 |
| 174 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR) | 174 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR) |
| 175 return SecurityStateModel::DANGEROUS; | 175 return SecurityStateModel::DANGEROUS; |
| 176 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR) | 176 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR) |
| 177 return SecurityStateModel::NONE; | 177 return SecurityStateModel::NONE; |
| 178 | 178 |
| 179 // Active mixed content is handled above. | 179 // Active mixed content is handled above. |
| 180 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_RAN, mixed_content_status); | 180 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_RAN, mixed_content_status); |
| 181 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN, | 181 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 194 } | 194 } |
| 195 | 195 |
| 196 if ((visible_security_state.cert_status & net::CERT_STATUS_IS_EV) && | 196 if ((visible_security_state.cert_status & net::CERT_STATUS_IS_EV) && |
| 197 visible_security_state.certificate) { | 197 visible_security_state.certificate) { |
| 198 return SecurityStateModel::EV_SECURE; | 198 return SecurityStateModel::EV_SECURE; |
| 199 } | 199 } |
| 200 return SecurityStateModel::SECURE; | 200 return SecurityStateModel::SECURE; |
| 201 } | 201 } |
| 202 | 202 |
| 203 void SecurityInfoForRequest( | 203 void SecurityInfoForRequest( |
| 204 SecurityStateModelClient* client, | |
| 205 const SecurityStateModel::VisibleSecurityState& visible_security_state, | 204 const SecurityStateModel::VisibleSecurityState& visible_security_state, |
| 205 bool used_policy_installed_certificate, |
| 206 const SecurityStateModel::IsOriginSecureCallback& is_origin_secure_callback, |
| 206 SecurityStateModel::SecurityInfo* security_info) { | 207 SecurityStateModel::SecurityInfo* security_info) { |
| 207 if (!visible_security_state.connection_info_initialized) { | 208 if (!visible_security_state.connection_info_initialized) { |
| 208 *security_info = SecurityStateModel::SecurityInfo(); | 209 *security_info = SecurityStateModel::SecurityInfo(); |
| 209 security_info->fails_malware_check = | 210 security_info->fails_malware_check = |
| 210 visible_security_state.fails_malware_check; | 211 visible_security_state.fails_malware_check; |
| 211 if (security_info->fails_malware_check) { | 212 if (security_info->fails_malware_check) { |
| 212 security_info->security_level = GetSecurityLevelForRequest( | 213 security_info->security_level = GetSecurityLevelForRequest( |
| 213 visible_security_state, client, SecurityStateModel::UNKNOWN_SHA1, | 214 visible_security_state, used_policy_installed_certificate, |
| 215 is_origin_secure_callback, SecurityStateModel::UNKNOWN_SHA1, |
| 214 SecurityStateModel::CONTENT_STATUS_UNKNOWN, | 216 SecurityStateModel::CONTENT_STATUS_UNKNOWN, |
| 215 SecurityStateModel::CONTENT_STATUS_UNKNOWN); | 217 SecurityStateModel::CONTENT_STATUS_UNKNOWN); |
| 216 } | 218 } |
| 217 return; | 219 return; |
| 218 } | 220 } |
| 219 security_info->certificate = visible_security_state.certificate; | 221 security_info->certificate = visible_security_state.certificate; |
| 220 security_info->sha1_deprecation_status = | 222 security_info->sha1_deprecation_status = |
| 221 GetSHA1DeprecationStatus(visible_security_state); | 223 GetSHA1DeprecationStatus(visible_security_state); |
| 222 security_info->mixed_content_status = | 224 security_info->mixed_content_status = |
| 223 GetContentStatus(visible_security_state.displayed_mixed_content, | 225 GetContentStatus(visible_security_state.displayed_mixed_content, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 238 visible_security_state.sct_verify_statuses; | 240 visible_security_state.sct_verify_statuses; |
| 239 | 241 |
| 240 security_info->fails_malware_check = | 242 security_info->fails_malware_check = |
| 241 visible_security_state.fails_malware_check; | 243 visible_security_state.fails_malware_check; |
| 242 | 244 |
| 243 security_info->displayed_private_user_data_input_on_http = | 245 security_info->displayed_private_user_data_input_on_http = |
| 244 visible_security_state.displayed_password_field_on_http || | 246 visible_security_state.displayed_password_field_on_http || |
| 245 visible_security_state.displayed_credit_card_field_on_http; | 247 visible_security_state.displayed_credit_card_field_on_http; |
| 246 | 248 |
| 247 security_info->security_level = GetSecurityLevelForRequest( | 249 security_info->security_level = GetSecurityLevelForRequest( |
| 248 visible_security_state, client, security_info->sha1_deprecation_status, | 250 visible_security_state, used_policy_installed_certificate, |
| 251 is_origin_secure_callback, security_info->sha1_deprecation_status, |
| 249 security_info->mixed_content_status, | 252 security_info->mixed_content_status, |
| 250 security_info->content_with_cert_errors_status); | 253 security_info->content_with_cert_errors_status); |
| 251 } | 254 } |
| 252 | 255 |
| 253 } // namespace | 256 } // namespace |
| 254 | 257 |
| 255 const SecurityStateModel::SecurityLevel | 258 const SecurityStateModel::SecurityLevel |
| 256 SecurityStateModel::kDisplayedInsecureContentLevel = | 259 SecurityStateModel::kDisplayedInsecureContentLevel = |
| 257 SecurityStateModel::NONE; | 260 SecurityStateModel::NONE; |
| 258 const SecurityStateModel::SecurityLevel | 261 const SecurityStateModel::SecurityLevel |
| (...skipping 15 matching lines...) Expand all Loading... |
| 274 pkp_bypassed(false), | 277 pkp_bypassed(false), |
| 275 displayed_private_user_data_input_on_http(false) {} | 278 displayed_private_user_data_input_on_http(false) {} |
| 276 | 279 |
| 277 SecurityStateModel::SecurityInfo::~SecurityInfo() {} | 280 SecurityStateModel::SecurityInfo::~SecurityInfo() {} |
| 278 | 281 |
| 279 SecurityStateModel::SecurityStateModel() {} | 282 SecurityStateModel::SecurityStateModel() {} |
| 280 | 283 |
| 281 SecurityStateModel::~SecurityStateModel() {} | 284 SecurityStateModel::~SecurityStateModel() {} |
| 282 | 285 |
| 283 void SecurityStateModel::GetSecurityInfo( | 286 void SecurityStateModel::GetSecurityInfo( |
| 284 SecurityStateModel::SecurityInfo* result) const { | 287 SecurityStateModel::SecurityInfo* result, |
| 285 VisibleSecurityState new_visible_state; | 288 std::unique_ptr<VisibleSecurityState> visible_security_state, |
| 286 client_->GetVisibleSecurityState(&new_visible_state); | 289 bool used_policy_installed_certificate, |
| 287 SecurityInfoForRequest(client_, new_visible_state, result); | 290 IsOriginSecureCallback is_origin_secure_callback) const { |
| 288 } | 291 SecurityInfoForRequest(*visible_security_state, |
| 289 | 292 used_policy_installed_certificate, |
| 290 void SecurityStateModel::SetClient(SecurityStateModelClient* client) { | 293 is_origin_secure_callback, result); |
| 291 client_ = client; | |
| 292 } | 294 } |
| 293 | 295 |
| 294 SecurityStateModel::VisibleSecurityState::VisibleSecurityState() | 296 SecurityStateModel::VisibleSecurityState::VisibleSecurityState() |
| 295 : fails_malware_check(false), | 297 : fails_malware_check(false), |
| 296 connection_info_initialized(false), | 298 connection_info_initialized(false), |
| 297 cert_status(0), | 299 cert_status(0), |
| 298 connection_status(0), | 300 connection_status(0), |
| 299 key_exchange_group(0), | 301 key_exchange_group(0), |
| 300 security_bits(-1), | 302 security_bits(-1), |
| 301 displayed_mixed_content(false), | 303 displayed_mixed_content(false), |
| (...skipping 22 matching lines...) Expand all Loading... |
| 324 other.displayed_content_with_cert_errors && | 326 other.displayed_content_with_cert_errors && |
| 325 ran_content_with_cert_errors == other.ran_content_with_cert_errors && | 327 ran_content_with_cert_errors == other.ran_content_with_cert_errors && |
| 326 pkp_bypassed == other.pkp_bypassed && | 328 pkp_bypassed == other.pkp_bypassed && |
| 327 displayed_password_field_on_http == | 329 displayed_password_field_on_http == |
| 328 other.displayed_password_field_on_http && | 330 other.displayed_password_field_on_http && |
| 329 displayed_credit_card_field_on_http == | 331 displayed_credit_card_field_on_http == |
| 330 other.displayed_credit_card_field_on_http); | 332 other.displayed_credit_card_field_on_http); |
| 331 } | 333 } |
| 332 | 334 |
| 333 } // namespace security_state | 335 } // namespace security_state |
| OLD | NEW |