Метод Exception#to\_s може використовуватися для обходу перевірки $SAFE, що дозволяє ненадійним кодам модифікувати довільні рядки.

### Детальний опис

У семантиці $SAFE Ruby, рівень безпеки 4 використовується для запуску
ненадійного коду (такого як плагін). Тому на вищих рівнях безпеки деякі види операцій
заборонені, щоб запобігти ненадійним кодам атакувати зовнішні (надійні)
дані.

Exception#to\_s виявився проблематичним навколо цього. Метод може
обдурити механізм рівня безпеки та деструктивно модифікує нетаїнтований
рядок, щоб стати таїнтованим. З цим зловмисник може модифікувати довільні
нетаїнтовані рядки, як це:

    $secret_path = "foo"

    proc do
        $SAFE = 4
        Exception.new($secret_path).to_s
        $secret_path.replace "/etc/passwd"
    end.call

    open($secret_path) do
      ...
    end

### Зачеплені версії

На щастя, ця атака неефективна для серії 1.9.x ruby. Зачеплені
версії обмежені до:

* Ruby 1.8.6 рівень патчу 420 та всі попередні версії
* Ruby 1.8.7 рівень патчу 330 та всі попередні версії
* Версії розробки Ruby 1.8 (1.8.8dev)

### Рішення

Будь ласка, оновіться до новішої версії.

### Оновлення

* 1\.8.7-334 випущено для виправлення цієї проблеми. Користувачів 1.8.7 заохочується
  оновитися.
  * [https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p334.tar.gz][1]
  * [https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p334.tar.bz2][2]
  * [https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p334.zip][3]




[1]: https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p334.tar.gz
[2]: https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p334.tar.bz2
[3]: https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p334.zip
