Renforcer votre site web : vulnérabilité SSL Beast

Alors voilà, vous avez votre nouveau site tout neuf ou votre e-boutique en ligne.
Pour la partie sécurisée, vous avez acheté votre certificat, configuré votre serveur web, le petit cadenas apparaît sans message d'erreur avec les principaux navigateurs.

Vous soufflez un peu en vous disant "mission accomplie" ?

Pas si vite !

Une fausse impression de sécurité est parfois pire que pas de sécurité du tout...
En effet, avez vous testé l'implémentation de SSL sur votre site Web ?

Avez vous notamment vérifié que votre site n'étais pas vulnérable à l'attaque "Beast", qui exploite certaines failles de SSL / TLS et sa capacité de renégociation, et qui permet de casser le chiffrage de SSL ?

Non ? Alors suivez le guide !

Beast ?

Beast (Browser Exploit Against SSL/TLS) est une attaque contre le protocole TLS 1.0 (et ses prédécesseurs comme SSL v3) qui a été démontrée de façon théorique dès 2001.

Elle a été considérée à l'origine inexploitable, mais quelques publications ont été fait à son sujet au milieu des années 2000.
A l'été 2011, l'outil "Beast" a été publié et permet de mettre en pratique cette attaque, démontrant que la vulnérabilité est finalement exploitable.
Un correctif a été apporté à TLS 1.1 pour combler cette faille (TLS 1.1+) et elle n'est pas présente non plus dans la version 1.2 de TLS.

La solution la plus évidente serait donc de migrer votre serveur web pour n'acepter que TLS 1.2. Cela aurait été trop facile !

2 petits soucis à celà :

  • Si votre serveur web utilise OpenSSL pour gérer le cryptage, il y a des chances que vous utilisiez une version 0.9.8 stable, et seules les dernières beta d'OpenSSL 1.x supportent TLS au delà de la version 1.0, et pas de façon officiellement stable.
  •  La plupart des navigateurs n'acceptent que SSL v2, SSL v3 et TLS 1.0

Que faire alors ?

Première chose : éviter SSL v2, qui est décidément dépassé  (il n'est même plus activé par défaut à partir de IE 7).
Ensuite, vous pouvez régler votre serveur Web pour privilégier des méthodes de chiffrement qui sont plus résistantes à Beast, comme RC4.

Enfin vous pouvez changer de librairie SSL si votre systême le permet.
La librairie GnuTLS (et le mod_gnutls pour Apache) par exemple, sont disponibles sur certains environnements unix-like.
Attention toutefois, si vous n’acceptez pas au moins TLS 1.0, un grand nombre de navigateurs actuels seront incapables de se connecter à votre serveur HTTPS, de plus mod_tls pose des soucis si vous utilisez apache en reverse proxy.

Exemple

Passons aux choses pratiques, je prendrai comme exemple le serveur Apache 2 qui est un des plus répandus.
Si vous installez le mod_ssl, il y a des chances que les réglages SSL par défaut ressemblent à ça :

SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP

Si vous êtes un peu curieux, vous pouvez demander à OpenSSL de donner toutes les combinaisons acceptées pour ce paramétrage, en utilisant la commande openssl ciphers -v :

openssl ciphers -v 'ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP'
DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1
DHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1
AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1
DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1
DHE-DSS-AES128-SHA SSLv3 Kx=DH Au=DSS Enc=AES(128) Mac=SHA1
AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1
EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1
EDH-DSS-DES-CBC3-SHA SSLv3 Kx=DH Au=DSS Enc=3DES(168) Mac=SHA1
DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1
RC4-SHA SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=SHA1
RC4-MD5 SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5
EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH Au=RSA Enc=DES(56) Mac=SHA1
EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH Au=DSS Enc=DES(56) Mac=SHA1
DES-CBC-SHA SSLv3 Kx=RSA Au=RSA Enc=DES(56) Mac=SHA1
DES-CBC3-MD5 SSLv2 Kx=RSA Au=RSA Enc=3DES(168) Mac=MD5
RC2-CBC-MD5 SSLv2 Kx=RSA Au=RSA Enc=RC2(128) Mac=MD5
RC4-MD5 SSLv2 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5
DES-CBC-MD5 SSLv2 Kx=RSA Au=RSA Enc=DES(56) Mac=MD5
EXP-EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH(512) Au=RSA Enc=DES(40) Mac=SHA1 export
EXP-EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH(512) Au=DSS Enc=DES(40) Mac=SHA1 export
EXP-DES-CBC-SHA SSLv3 Kx=RSA(512) Au=RSA Enc=DES(40) Mac=SHA1 export
EXP-RC2-CBC-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export
EXP-RC4-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export
EXP-RC2-CBC-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export
EXP-RC4-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export

La liste indique tous les versions de protocoles que votre serveur web accepterait pour ce réglage (dans l'ordre de préférence).

Le début est bon (SSL v3 avec un chiffrement sur 256 bits) mais on descend progressivement vers du SSL v2 avec un chiffrement sur 40 bits, ce qui est tout à fait insuffisant.

La solution est donc de changer votre réglage dans Apache2, je vous propose donc ce réglage, issu des propositions de divers sites dédiés à SSL :

SSLHonorCipherOrder On
SSLCipherSuite RC4-SHA:HIGH:!ADH

Cette fois, moins de protocoles sont proposés, dont un seul pour SSL v2, dans une combinaison qui a priori n'est pas vulnérable à Beast :

openssl ciphers -v 'RC4-SHA:HIGH:!ADH'
RC4-SHA SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=SHA1
DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1
DHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1
AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1
DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1
DHE-DSS-AES128-SHA SSLv3 Kx=DH Au=DSS Enc=AES(128) Mac=SHA1
AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1
EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1
EDH-DSS-DES-CBC3-SHA SSLv3 Kx=DH Au=DSS Enc=3DES(168) Mac=SHA1
DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1
DES-CBC3-MD5 SSLv2 Kx=RSA Au=RSA Enc=3DES(168) Mac=MD5

Finalement c'est assez simple, vous n'avez eu qu'à changer une ligne dans votre configuration Apache 2 (en n'oubliant pas de le recharger), au pire ajouter deux lignes !
Attention si vous avez plusieurs sites HTTPS (grâce à SNI ou en utilisant un certificat UCC), il se peut que vous ayez à changer la configuration pour chaque site séparément.

Pour tester

Bien, vous avez fait votre modification de la configuration Apache, vous avez relancé le serveur, mais comment être sur que le soucis est réglé ?

Je ne saurait trop vous conseiller l'excellent site SSLLabs, édité par Qualys.
Vous y trouverez toute la littérature (en anglais) concernant SSL, et surtout, un outil pour tester votre site HTTPS !

Au delà de la vulnérabilité Beast, d'autres aspects sont testés (taille des clés, certificat, protocoles) et surtout une note est décerné à votre site !

Voyons donc la différence avant / après (cliquez sur les images pour agrandir) :

Avec le réglage par défaut, certaines encryptions 40 et 56 bits (trop faibles) sont possibles, et surtout le serveur est vulnérable à l'attaque Beast.

Le site obtient un niveau "C" avec un score de 61%

Avec le nouveau réglage, seules les encryptions à 128 bits et au dessus sont permises, et le serveur Web n'est plus vulnérable à l'attaque Beast.

Cette fois ci, la note "A" est obtenue avec un score de 85%, on passe dans le vert !

N'hésitez donc pas à tester votre site, au delà de cette vulnérabilité Beast, c'est l'ensemble de la sécurité SSL de votre site que vous allez pouvoir tester, et éventuellement améliorer.

Dans le cas d'une utilisation de SSL pour échanger des données privées ou des données de paiement, c'est loin d'être un luxe !

 

Pour aller plus loin :