Posté par Jean-Denis Vauguet le 2012-02-16
Dans OpenSSL, l'option SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
pour les
connections SSL est utilisée pour se prémunir d'une vulnérabilité de
TLS-CBC-IV. Il s'agit d'une faille bien connue de TLSv1/SSLv3, qui
est revenue sur le devant de la scène sous le nom d'attaque BEAST
(CVE-2011-3389). Les discussions à ce sujet sont consultables sur le
Ruby Bug Tracker.
Jusqu'à présent, l'extension OpenSSL de Ruby utilisait l'option
SSL_OP_ALL
, qui correspond à un ensemble d'options apportés par des
correctifs successifs, la plupart mineurs. Cette option s'applique à
toutes les connections SSL par défaut. Les utilisateurs ne peuvent
qu'ajouter de nouvelles options à cette base, mais jamais retirer des
options de la palette SSL_OP_ALL
, notamment l'option
SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
. Il s'agit d'un choix établi,
visant entre autre à ne pas exposer des options telles que
SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
. Toutefois, pour contrer l'attaque
BEAST, il s'avère que Ruby doit laisser la possibilité aux utilisateurs
de désactiver cette option SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
en
particulier, pour permettre à Ruby OpenSSL d'insérer des fragments
vides à début des connections SSL (le fameux "0/n splitting").
Ce correctif définit des constantes supplémentaires et autorise les
utilisateurs à désactiver des options de SSL_OP_ALL
. Par défault,
l'état est toujours celui de SSL_OP_ALL
, mais vous pouvez configurer
SSLSocket
pour réaliser le "0/n splitting" en prévention de
l'attaque BEAST, comme ceci :
ctx = SSLContext.new
ctx.options = OP_ALL & ~OP_DONT_INSERT_EMPTY_FRAGMENTS
ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER
SSLSocket.new(socket, ctx)
Merci à Apple d'avoir rapporté ce problème.
NOTE : certains endpoints SSL sont connus pour ne pas gérer correctement le "0/n splitting". En réaction, OpenSSL et l'implémentation Ruby ont décidé de ne pas l'activer par défaut. Il vous est conseillé de tester votre connectivité SSL avant de l'activer en production. Si l'autre endpoint de connection ne supporte pas le "0/n splitting", vous devrez utiliser un autre correctif, par exemple forcer l'utilisation de RC4 pour le cipher. Pour plus de détails, renseignez-vous sur CVE-2011-3389.