Уязвимость проверки имени хоста в SSL клиенте (CVE-2013-4073)

Уязвимость в SSL клиенте Ruby, которая может позволить man-in-the-middle (человек-посередине) атаки, чтобы обмануть SSL сервера через использование валидного сертификата, выданного доверенным центром сертификации.

Этой уязвимости был назначен CVE идентификатор CVE-2013-4073.

Суммарно

SSL клиент Ruby проводит проверку имени хоста, но он не может верно отсеивать хосты в сертификатах, которые содержат ноль байт.

Детали

OpenSSL::SSL.verify_certificate_identity воспроизводит RFC2818 проверку сервера для SSL клиента Ruby, но он не верно отсеивает хосты в subjectAltName X509 расширении, которое содержит ноль байт.

Существующий код в lib/openssl/ssl.rb использует OpenSSL::X509::Extension#value для получения идентификации от subjectAltName. Extension#value зависит от функции OpenSSL X509V3_EXT_print() и для dNSName из subjectAltName она утилизирует sprintf(), что известно, как “null byte unsafe”. Как результат, Extension#value возвращает ‘www.ruby-lang.org’, если subjectAltName равно ‘www.ruby-lang.org\0.example.com’ и OpenSSL::SSL.verify_certificate_identity неверно идентифицирует сертификат, как один из сертификатов для ‘www.ruby-lang.org’.

Когда CA, который проверен клиентом SSL, разрешает запросить сертификат сервера, который имеет ноль байт в subjectAlnName, удаленные злоумышленники могут получить сертификат для ‘www.ruby-lang.org\0.example.com’ из CA, чтобы обмануть ‘www.ruby-lang.org’ и сделать атаку человек-посредине между SSL клиентом Ruby и SSL серверами.

Затронутые версии

  • Все версии ruby 1.8 до ruby 1.8.7 patchlevel 374
  • Все версии ruby 1.9 до ruby 1.9.3 patchlevel 448
  • Все версии ruby 2.0 до ruby 2.0.0 patchlevel 247
  • транк до ревизии 41671

Решение

Всем пользователям рекомендуется обновиться до Ruby 2.0.0-p247, 1.9.3-p448 или 1.8.7-p374.

Благодарность

Уязвимость обнаружил William (B.J.) Snow Orvis и координировал через security@ruby-lang.org David Thiel из iSec Partners.

История

  • Оригинал опубликован 2013-06-27 11:00:00 (UTC)