Vulnérabilité dans le client SSL permettant de contourner la vérification du nom de domaine (CVE-2013-4073)

Une vulnérabilité a été trouvée dans le client SSL de Ruby. Elle permet à des attaquants d’opérer un man-in-the-middle pour se faire passer pour des serveurs SSL, via des certificats valides émis par une autorité de certification de confiance.

L’identifiant CVE-2013-4073 a été assigné à cette vulnérabilité.

Résumé

Le client SSL de Ruby implémente une vérification de l’identité des noms de domaine, mais il ne gère pas correctement les noms de domaine qui contiennent des caractères null dans le certificat.

Détails

OpenSSL::SSL.verify_certificate_identity implémente la vérification de l’identité des serveurs telle que décrite dans la RFC2818, mais elle ne gère pas correctement les noms de domaine dans l’extension X509 subjectAltName qui contiennent des caractères null.

Le code existant dans lib/openssl/ssl.rb utilise OpenSSL::X509::Extension#value pour extraire l’identité depuis le subjectAltName. Extension#value dépend de la fonction OpenSSL X509V3_EXT_print() et pour dNSName de subjectAltName, elle utilise sprintf() qui est connue pour n’être pas sûre avec les caractères null. Ainsi, Extension#value retourne ‘www.ruby-lang.org’ si le subjectAltName est ‘www.ruby-lang.org\0.example.com’ et OpenSSL::SSL.verify_certificate_identity va alors identifier incorrectement le certificat pour ‘www.ruby-lang.org’.

Quand une autorité de confiance pour le client SSL autorise à émettre un certificat serveur avec des caractères null dans le subjectAltName, les attaquants à distance peuvent de fait obtenir le certificat pour ‘www.ruby-lang.org\0.example.com’ depuis l’autorité de certification, pour se faire passer pour ‘www.ruby-lang.org’ et ainsi effectuer une attaque de type man-in-the-middle entre le client SSL de Ruby et les serveurs SSL.

Versions concernées

  • Toutes les versions de Ruby 1.8 antérieures à Ruby 1.8.7 patchlevel 374
  • Toutes les versions de Ruby 1.9 antérieures à Ruby 1.9.3 patchlevel 448
  • Toutes les versions de Ruby 2.0 antérieures à Ruby 2.0.0 patchlevel 247
  • Les révisions antérieures à 41671 du trunk

Solution

Tous les utilisateurs sont encouragés à mettre à jour Ruby vers les versions 2.0.0-p247, 1.9.3-p448 ou 1.8.7-p374.

Remerciement

Cette vulnérabilité a été trouvée par William (B.J.) Snow Orvis et la coopération avec security@ruby-lang.org a été effectuée par David Thiel d’iSEC Partners.

Histoire

  • Publié à l’origine à 2013-06-27 11:00:00 (UTC)