Ruby Hash算法爆出DoS(拒絕服務)攻擊漏洞
近日,Ruby 的 Hash 算法被爆出了一個安全漏洞,攻擊者可以據此發起 DoS(拒絕服務)攻擊。
該漏洞和計算復雜性相關,攻擊者通過碰撞字符串 hash 值,可以發現一些字符串序列,使用這些序列,攻擊者可以發起拒絕服務攻擊,例如,可以將它們作為你的 Rails 應用 HTTP 請求的 POST 參數。
詳細說明
該情況與 2003 年在 Perl 中發現的漏洞類似。在 Ruby 1.8 分支中,使用了一個確定性的 hash 函數用于 hash 字符串,“確定性”的意思是除了輸入的字符串自身外沒有其他的位參與生成 hash 值,因此你可以預先計算一個字符串的 hash 值。
通過收集一系列有相同 hash 值的字符串,攻擊者可以讓 Ruby 進程碰撞 hash 表(包括 hash 類實例)。Hash 表的 amortized O (1)屬性取決于 hash 值分布的均勻性。通過有針對性的輸入,攻擊者可以讓 hash 表工作比預期慢得多,也就是說構造一個n元素表的復雜度是O(n2)。
受影響的版本
Ruby 1.8.7-p352 及所有之前的版本。
Ruby 1.9 系列不會受到這種攻擊,它們的哈希實現與 Ruby 1.8 系列不同。
解決方案
目前的解決方案是通過一些 PRNG(偽隨機數發生器)生成的隨機位來擾亂字符串 hash 函數。通過這樣做,字符串的 hash 值將不再是確定的。這樣,String#hash 結果只和當前進程的生命周期一致,并會在下次啟動時產生一個不同值。針對這種情況,攻擊者必須創建一組針對這種混雜方式的健壯的字符串,但這是十分困難的。
請將 Ruby 升級到1.8.7 - P357 或更高版本。
Ruby 1.8.7 - P357 下載:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/391606
Via ruby-lang.org