Épinglez vos certificats !

Dans un article précédent, nous étudiions comment améliorer la sécurité des connexions HTTPS par l’utilisation des mécanismes HTTP Strict Transport Security (HSTS). Cependant, nous évoquions également les risques résiduels de déchiffrement des échanges par l’utilisation de “vrais-faux” certificats. Nous allons voir dans cet article comment mitiger ce risque, en utilisant une technique appelée “certificate pinning”, que l’on peut traduire – un peu maladroitement – par “épingler les certificats”.

HTTPS ou le règne de “la confiance aveugle”

Lorsqu’un utilisateur se connecte à un site internet via le protocole chiffré HTTPS, c’est le protocole SSL (Secure Socket Layer) qui se charge du chiffrement. Pour ce faire, des mécanismes de cryptographie asymétrique sont employés.

Le navigateur web de l’utilisateur va tenter de vérifier l’identité du serveur auquel il se connecte. Pour cela, le serveur présente au navigateur un certificat X.509, contenant notamment sa clé publique et une signature. Le navigateur va alors vérifier la validité de la signature, puis utiliser la clé publique afin d’échanger une clé de session qui sera utilisée pour chiffrer l’ensemble des communications de manière symétrique.

Le navigateur vérifie ensuite la validité de la signature en s’assurant de l’existence d’une chaîne de confiance (chain of trust) entre le certificat et l’une des autorités de certification de confiance. Qui sont ces autorités de confiance ? C’est en tentant de répondre à cette question que l’on réalise la fragilité du système actuel.

Pour que le navigateur accepte la connexion, il va remonter la chaîne de confiance jusqu’à l’autorité de confiance racine et s’assurer que celle-ci est présente dans le magasin de certificats.

Dans le cas de l’accès au moteur de recherche Google en HTTPS, l’autorité racine est Equifax.

Le navigateur Firefox, par exemple, dispose de son propre magasin de certificats auxquels il fait confiance. D’autres, comme Internet Explorer ou Chrome, se basent sur le magasin de certificats du système d’exploitation.

Et par défaut, ces magasins regorgent d’autorités de certification, de tous pays ! Le navigateur Firefox en compte plus d’une centaine.

Extrait des autorités de certifications racines auxquelles Firefox fait confiance par défaut

Il suffit donc qu’une seule de ces autorités de certification délivre, par erreur ou plus vraisemblablement suite à une attaque, un certificat valide pour “*.google.com” pour que des attaquants puissent mener une attaque de type Man-in-the-Middle. En se faisant passer pour un serveur légitime de Google, ils pourront intercepter et déchiffrer les échanges entre le navigateur et le serveur… Cette menace ne relève malheureusement pas du domaine de la science-fiction, comme le prouve l’exemple de Diginotar en 2010.

De plus, dans le cas d’échanges d’informations stratégiques, la menace étatique doit être prise en compte. Que se passerait-il si le gouvernement d’un pays demandait à l’une des autorités de certification de ce pays, faisant partie de la liste des autorités de confiance racine de Firefox, de signer un certificat valide pour mail.google.com ? Cette société serait-elle en position de refuser, ou de communiquer à ce sujet ? La réponse est, sans doute, non ; dans ce cas, le navigateur accepterait le vrai-faux certificat et n’afficherait aucune alerte à l’utilisateur.

Limiter la confiance dans les autorités de certification

Afin de se prémunir des deux scénarios envisagés, il est possible d’utiliser le protocole SSL d’une autre façon, en créant une association entre le nom de domaine d’un site (www.google.com) et le certificat ou l’autorité de certification attendus. Ainsi, seul le certificat attendu ou un certificat signé par l’une des autorités de certification attendues sera accepté et une alerte sera levée si un autre est présenté.

Il est alors nécessaire de disposer d’un référentiel de ces associations (site internet / certificat) valides, ou de le construire au fur et à mesure de la navigation sur les sites. Malheureusement, ce type de mécanisme n’est pas réellement pris en compte par les navigateurs. Il peut cependant se faire au moyen de modules additionnels, comme Certificate Patrol pour Firefox.

Google Chrome réalise déjà une validation de ce type, pour un nombre limité de sites. Le fichier qui contient la liste blanche des sites pour lesquels HSTS est activé par défaut contient également la liste des sites pour lesquels le pinning est activé :

{
   "pinsets": [
 […]
     {
       "name": "google",
       "static_spki_hashes": [
         "VeriSignClass3",
         "VeriSignClass3_G3",
         "Google1024",
         "Google2048",
         "GoogleBackup1024",
         "GoogleBackup2048",
         "EquifaxSecureCA",
         "GeoTrustGlobal"
       ],
       "bad_static_spki_hashes": [
         "Aetna",
         "Intel",
         "TCTrustCenter",
         "Vodafone"
       ]
     },
[…]
"entries": [
     // Dummy entry to test certificate pinning.
     { "name": "pinningtest.appspot.com", "include_subdomains": true, "pins": "test" },

     // (*.)google.com, if using SSL, must use an acceptable certificate.
     { "name": "google.com", "include_subdomains": true, "pins": "google" },

Extrait du fichier transport_security_state_static.json

Google Chrome va donc vérifier, lors de la connexion à un site du type “google.com”, que le certificat est valide et qu’il est signé par une des autorités de certification autorisées. Il semblerait de plus que cette information soit remontée aux serveurs de Google : c’est ainsi qu’a pu être découvert et rendu publique le cas du certificat intermédiaire distribué par Turktrust.

L’utilisation du pinning est la plupart du temps observée dans le cas d’applications mobiles, puisqu’il est alors facile pour le développeur d’inclure le certificat attendu dans le paquet de l’application. Pour les navigateurs internet, seul le recours aux modules additionnels est possible, à moins de modifier le fichier source en extrait ci-dessus et de recompiler, ce qui n’est sans doute pas la solution la plus simple.

L’OWASP a récemment publié une cheatsheet, ainsi qu’un article plus détaillé, sur la mise en œuvre technique du pinning, notamment dans le contexte du développement d’applications mobiles.

Bien que difficile à généraliser, l’utilisation du pinning semble une évolution logique pour répondre aux risques liés aux hiérarchies de confiance. Cette initiative est à conseiller pour les systèmes bien maîtrisés, comme les applications mobiles et les VPN.

Pour le déploiement dans les navigateurs internet, il faudra malheureusement attendre que les principaux acteurs intègrent cette fonctionnalité. On pourrait imaginer, dans un contexte professionnel, pouvoir indiquer au navigateur de n’accepter que les certificats issus de la PKI interne pour les sites d’entreprise.

Back to top