Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Ève

Drown, et quelques remarques sur la sécurité

Première rédaction de cet article le 1 mars 2016
Dernière mise à jour le 5 mars 2016


Aujourd'hui a été publiée la faille de sécurité Drown, touchant notamment la bibliothèque cryptographique OpenSSL. C'est l'occasion de se livrer à quelques réflexions sur Drown, TLS et la sécurité.

Le même jour, huit (!) failles de sécurité dans OpenSSL ont été publiées (Drown a été éclaté en deux failles, CVE-2016-0800 et CVE-2016-0703). Cela ne facilite pas le travail de ceux qui essaient de démêler tout cela mais Drown est très bien documenté sur son site officiel (très complet, avec logo et tout). Je recommande également le papier officiel, très clair. Il n'y a normalement donc pas besoin de ré-expliquer ce qu'est Drown.

Pourtant, je suis étonné de constater que certaines choses n'ont pas été comprises. Par exemple bien des gens croient que, puisque leur serveur HTTPS n'accepte pas SSLv2, ils sont en sécurité. Rien n'est plus faux et c'est bien expliqué dans la FAQ de Drown : pour effectuer cette attaque, il suffit que la clé du site visé soit disponible sur un autre site, qui, lui, accepte SSLv2. Et, c'est là un point qui m'a personnellement surpris, ce cas est assez fréquent. Comme le note l'article Drown, le modèle de financement des AC encourage à acheter le moins de certificats possibles, et donc à les utiliser sur plusieurs serveurs, ou bien sur le serveur de production et sur celui de développement.

Prenons un exemple : le serveur du journal quotidien Ouest-France n'est apparemment pas vulnérable, il ne gère pas SSLv2 :

%  openssl s_client -connect www.ouest-france.fr:443 -ssl2
CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 48 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : SSLv2
    Cipher    : 0000
...
    

Mais on trouve, sur un tout autre réseau, une machine 93.17.51.145 qui, elle, acceptait (elle a été réparée depuis) SSLv2 et a un certificat *.ouest-france.fr (les certificats avec joker sont évidemment les plus vulnérables à Drown puisqu'on les achète justement pour les mettre sur plusieurs machines) :

%  openssl s_client -connect 93.17.51.145:443 -ssl2
CONNECTED(00000003)
...
subject=/C=FR/postalCode=35000/ST=Ille-et-Vilaine/L=RENNES/street=10 rue Du Breil/street=ZI Rennes Sud-Est/O=SOCIETE OUEST FRANCE/OU=0002 377714654/CN=*.ouest-france.fr
...
SSL handshake has read 1609 bytes and written 367 bytes
---
New, SSLv2, Cipher is RC2-CBC-MD5
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : SSLv2
    Cipher    : RC2-CBC-MD5
    Session-ID: 6F1500003AE7F4EF421B7C964089D28B

Le journal Ouest-France est hébergé par SDV et cette 93.17.51.145 est apparemment dans les locaux du journal. Machine de développement ? Serveur utilisé pour des applications internes ? En tout cas, contrairement au site Web public, cette machine ne semble pas avoir fait l'objet de tests de sécurité et, à elle seule, elle rendait l'attaque Drown possible. En effet, il s'agit bien de la même clé (pas uniquement du même nom dans le certificat) :

% openssl s_client -connect 93.17.51.145:443 | openssl x509 -pubkey -noout
...
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu83rhWk01bad5z55tfKN
TlqWSdXou/QXTNVsk0J47FFEYCvumcd5TgrLtsRDjz23K1+8T9KXgIzNN4wXwWUc
7O1Hu0ddX4w0OOiSaq2rxPcXdzeF98Mth+MtclUliYZTPa94TXEMSM/xPeELkfmi
sAqJjVFfGqacFcuzI0QryQPkAAU4ts0JtAoaUhHDNc+3Mz2UnHtaYsLEh9cHdkKq
QzpggPPN4emqcEr3fbvTPl0JIYossH/mOI8E4NTyVaZaScimi8efklxF3JEc+/6w
AqzGXt8CL2/ce+E4BojHCfilGrxU4WEeo7e9sMXHuhWCQ/fxT/6o3yktI+sLSv61
RQIDAQAB
-----END PUBLIC KEY-----

% openssl s_client -connect www.ouest-france.fr:443 | openssl x509 -pubkey -noout 
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu83rhWk01bad5z55tfKN
TlqWSdXou/QXTNVsk0J47FFEYCvumcd5TgrLtsRDjz23K1+8T9KXgIzNN4wXwWUc
7O1Hu0ddX4w0OOiSaq2rxPcXdzeF98Mth+MtclUliYZTPa94TXEMSM/xPeELkfmi
sAqJjVFfGqacFcuzI0QryQPkAAU4ts0JtAoaUhHDNc+3Mz2UnHtaYsLEh9cHdkKq
QzpggPPN4emqcEr3fbvTPl0JIYossH/mOI8E4NTyVaZaScimi8efklxF3JEc+/6w
AqzGXt8CL2/ce+E4BojHCfilGrxU4WEeo7e9sMXHuhWCQ/fxT/6o3yktI+sLSv61
RQIDAQAB
-----END PUBLIC KEY-----
    

On trouvait d'ailleurs cette clé sur plein d'autres machines du réseau 93.17.51.128/26, presque toutes acceptant SSLv2 d'une façon ou d'une autre.

En revanche, si on regarde un autre domaine signalé sur le site Web de Drown, blockchain.com, on voit que le site Web public n'a pas du tout la même clé (ce n'est même pas le même algorithme) que la machine vulnérable (alors que le nom dans le certificat de la machine vulnérable est bien *.blockchain.com). Leur situation est donc moins grave (attention toutefois aux attaques actives) :

# Machine vulnérable car acceptant SSLv2 dans certaines conditions
% openssl s_client  -connect  50.87.196.92:443 | openssl x509 -pubkey -noout 
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsXMk8xOJaaqKmz88RicY
Mt4e4VlY0uTVaUS7mbgnUGgd15wQ/tLH91RL5S9c1C1FFrcjBpomODJXBdgTXjWi
x4OVRl0sEe6OjIX1FLqBl15n+Lx++933lQUWinMSInEVLnBBjcr9If5+ozJvscRS
eF/hikjhDYW/rDwF1f7ivTiiok8f12zTa2lhlxOH4KxcFPaFklXDa45DccDjdCIZ
uVLpFSngo5iS3nney+LPK4afYYffEWK9aN2Rj9NE8zRm3hGoGDva2vNmKGbewd3w
1huqr3o7fc3WZyW9HZlM7PjZF6YLhgJnAI09XXDHD3t+G4ijcS6F4Rh9B36whuoo
CQIDAQAB
-----END PUBLIC KEY-----

# Serveur Web public
% openssl s_client  -connect  www.blockchain.com:443 | openssl x509 -pubkey -noout
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE8DGz/3DLSflRPxO5uHuiww7EbqEP
/S3VWfdw4PGs4WcuqWTtIGht1rwiuTjrU3Es1uxm3T+JfT1JOOhYut8IjA==
-----END PUBLIC KEY-----
    

Pour résumer ce point essentiel « Même si votre serveur n'accepte pas SSLv2, vous êtes peut-être quand même vulnérable ».

(Au passage, petite note technique : certains systèmes d'exploitation, et à juste titre, compilent OpenSSL sans SSLv2. La commande ci-dessus vous dira alors « unknown option -ssl2 ». Il faut utiliser un système non sécurisé, comme Arch Linux, ou bien prendre un OpenSSL qu'on a compilé soi-même. C'est à cause de ce problème que l'excellent script testssl.sh vient avec son propre OpenSSL.)

On voit d'ailleurs un effet négatif de la gamification popularisée, dans le monde HTTPS, par SSLlabs. Pendant que tout le monde s'amuse à obtenir la meilleure note possible pour s'en vanter sur les rézosocios (« j'ai un A sur SSLlabs alors que la banque Machin a uniquement un B, je suis trop un geek crypto-expert »), des machines comme ce pauvre serveur restent ignorés.

Autre question posée par Drown, pourquoi est-ce qu'il y a autant de machines qui acceptent encore SSLv2 ? Il a été officiellement abandonné en 2011 par le RFC 6176. Et le RFC est sorti bien tard, tous les experts savaient depuis longtemps que SSLv2 était cassé sans espoir de réparation. Mais les mises à jour ne se font, sur l'Internet, qu'à un rythme glacial (voir nul). Le problème n'est pas technique, il vient du fait que les mises à jour ne rapportent rien, n'ont pas de retour sur investissement, et ne sont donc en général jamais faites. Tout le monde s'indigne lorsqu'une faille comme Drown est publiée mais, en temps normal, personne ne s'en préoccupe. La prévention est toujours le parent pauvre de la sécurité. L'opérationnel et la sécurité concrète n'intéressent personne.

Compte-tenu de cela, est-ce que Drown représente un réel danger aujourd'hui, et faut-il patcher d'urgence ? Bien sûr, il faut patcher, c'est le B. A. BA de la sécurité pour une machine connectée à l'Internet. Mais le danger exact de Drown n'est pas facile à évaluer. On est dans le cas classique en sécurité du verre que l'optimiste voit à moitié plein alors que le pessimiste le voit à moitié vide. L'optimiste va faire remarquer que l'exploitation effective de Drown est très difficile, dans les conditions du monde réel (en laboratoire, ça marche toujours mieux). Le pessimiste rétorquera que les attaques ne vont toujours qu'en s'améliorant. Si Drown est difficile à exploiter aujourd'hui, cela ne durera pas éternellement. À noter que, pour la raison expliquée plus haut, cela ne sert à rien de patcher votre serveur principal : il faut patcher toutes les machines qui ont le certificat du serveur principal.

Je suggère d'ailleurs d'en tirer une leçon : ne jamais partager un certificat (et donc une clé privée) entre des machines qui ont des administrateurs différents : le risque est en effet très élevé que l'une d'elles soit moins sécurisée que les autres, permettant une attaque.

Ah, notez aussi que patcher OpenSSL ne servira que pour le futur : si un attaquant a utilisé Drown contre vous, et a réussi à obtenir des informations tels que vos mots de passe, il serait prudent de les changer...

Merci à Léo pour avoir signalé une grosse approximation dans l'article original.

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)