由 nahi 發表於 2013-06-27
翻譯: Juanito Fatas
這是 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()
函數決定。subjectAltName
的 dNSName
使用了 sprintf()
,這對於空位元組來說是不安全的。如果 subjectAltName
等於 'www.ruby-lang.org\0.example.com'
的話,OpenSSL::SSL.verify_certificate_identity
把 subjectAltName
誤判為 '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)