OpenSSL 繞過主機名檢查的風險(CVE-2013-4073)

這是 Ruby SSL 客戶端的一個風險,允許攻擊者得到證書授權機構發放的證書,來欺騙 SSL 伺服器,執行中間人攻擊。

這個風險的 CVE 識別號為 CVE-2013-4073。

總結

Ruby 的 SSL 客戶端實作了主機名檢查機制,但此機制不能夠妥善處理含有空位元組(null bytes)主機名的證書。

風險細節

OpenSSL::SSL.verify_certificate_identity 給 Ruby SSL 客戶端實作了,由 RFC2818 所定義的伺服器身分檢查。但並沒有妥善處理好由 subjectAltName X509 文件裡所述的,含有空位元組的主機名。

lib/openssl/ssl.rb 目前的程式碼使用 OpenSSL::X509::Extension#value ,從 subjectAltName 來取得識別名稱(identity)。而 Extension#value 的回傳值由 OpenSSL X509V3_EXT_print() 函數決定。subjectAltNamedNSName 使用了 sprintf() ,這對於空位元組來說是不安全的。如果 subjectAltName 等於 'www.ruby-lang.org\0.example.com' 的話,OpenSSL::SSL.verify_certificate_identitysubjectAltName 誤判為 'www.ruby-lang.org'。則 Extension#value 會回傳 'www.ruby-lang.org'

當一個由 SSL 客戶端信賴的證書授權機構,發放證書給 subjectAltName 含有空位元組的申請時,攻擊者可使用來自 'www.ruby-lang.org\0.example.com' 的證書,得到證書騙過 'www.ruby-lang.org',在 Ruby 客戶端與 SSL 伺服器做中間人攻擊。

受影響版本

  • ruby 1.8.7 patchlevel 374 先前所有的 1.8 版本。
  • ruby 1.9.3 patchlevel 448 先前所有的 1.9 版本。
  • ruby 2.0.0 patchlevel 247 先前所有的 2.0 版本。
  • trunk revision 41671 之前所有的 Ruby。

解決辦法

建議所有使用者升級至 Ruby 2.0.0-p247、1.9.3-p448 或 1.8.7-p374。

表揚

這個風險由 William (B.J.) Snow Orvis 發現,並經由來自 iSEC Partners 的 David Thiel 與 security@ruby-lang.org 協調下修復。

歷史

  • 最初發表於 2013-06-27 11:00:00 (UTC)