Security: Chrome ignores pinning errors from Enterprise Certificate Pinning
Reported by
biolizar...@gmail.com,
Sep 15
|
||||
Issue descriptionVULNERABILITY DETAILS Windows 10 includes a feature called "Enterprise Certificate Pinning", which modifies the behavior of the CertVerifyCertificateChainPolicy and WinVerifyTrust API calls. When Enterprise Certificate Pinning is enabled, both API calls check whether the certificate chain includes a trust anchor specified in the Enterprise Certificate Pinning configuration. More information about Enterprise Certificate Pinning is at https://docs.microsoft.com/en-us/windows/security/identity-protection/enterprise-certificate-pinning . As far as I can tell based on looking at verbose debug output of Microsoft's tools, Enterprise Certificate Pinning works by making the aforementioned API calls return the error code 0x80092010 (CRYPT_E_REVOKED) or 0x800b010f (CERT_E_CN_NO_MATCH), depending on whether Enterprise Certificate Pinning is configured to produce non-bypassable or bypassable errors, respectively. Chrome doesn't seem to notice when an Enterprise Certificate Pinning error occurs; while Edge shows a TLS error, Chrome loads the website without showing any errors. This occurs regardless of which of the two possible error codes Enterprise Certificate Pinning is configured to produce. It definitely looks like Chrome is calling the correct API's, because Enterprise Certificate Pinning does log the pinning failures to the Windows event log. I infer that Chrome is just ignoring the errors rather than canceling the TLS handshake. VERSION Chrome Version: Version 71.0.3553.2 (Official Build) canary (32-bit) Operating System: Windows 10 Pro, Version 1803, OS build 17134.285 REPRODUCTION CASE Save the attached PinRulesBitcoin.xml. Then create a subdirectory of the directory where PinRulesBitcoin.xml is placed, named "BitcoinCerts". Place a DER-encoded end-entity certificate in that directory that doesn't correspond to the www.bitcoin.org certificate (I used the end-entity certificate that's served when visiting https://www.badssl.com/ ). Then run the following two commands from a command prompt while in the working directory where PinRulesBitcoin.xml is located (the latter must be run as an elevated user): certutil -f -v -generatePinRulesCTL PinRulesBitcoin.xml PinRulesBitcoin.ctl certutil -setreg chain\PinRules @PinRulesBitcoin.ctl Then, visit https://www.bitcoin.org/ in both Edge and Chrome. EXPECTED BEHAVIOR Both Edge and Chrome should show a TLS error indicating that the certificate has been revoked. OBSERVED BEHAVIOR Edge behaves as expected; Chrome loads the website without showing any errors. ADDITIONAL NOTES I wasn't sure whether to submit this as a security bug or a general bug. Probably depends on whether correct behavior of OS-level certificate pinning is considered security-related by the Chromium project. If you think it's not a security bug, that's fine, feel free to reclassify accordingly -- I'd just rather that you make that call rather than me making it for you.
,
Sep 24
Sorry for the delay here. I think it seems reasonable to remove the security flags, and hopefully the lack of view restrictions will also allow more developers to take a look.
,
Sep 24
,
Sep 24
Marking WontFix. The API documentation clearly indicates it only applies to Internet Explorer and Edge - that is, it is *not* intended to block arbitrary applications. Given historic precedent, it's likely that an additional flag has been introduced (similar to Microsoft's SHA-1 deprecation) to indicate that the application (in this case, Edge or IE) is aware of and desires the specified semantics. Chrome is in the process of removing support for pinning - it is, generally speaking, a dangerous feature that does more harm than good. This is also the consensus of the authors of RFC 7469. While this is nominally a feature request, it's one there are no plans to implement, particularly as we move away from using the CAPI APIs entirely. |
||||
►
Sign in to add a comment |
||||
Comment 1 by rsesek@chromium.org
, Sep 17Components: Internals>Network>SSL
Labels: OS-Windows
Status: Untriaged (was: Unconfirmed)