Недоступность сервиса и небезопасное создание объекта в JSON (CVE-2013-0269)

Уязвимость недоступности сервиса и небезопасного создания объекта во встроенном в ruby JSON. Этой уязвимости назначен CVE идентификатор CVE-2013-0269. Мы строго рекомендуем обновить ruby.

Детали

При прочтении JSON-документов, JSON гем (включая встроенный в ruby) может быть вынужден создать символы Ruby в атакуемой системе. Так как Ruby символы не уничтожаются при сборке мусора, это может служить причиной атаки недоступности сервиса (DoS).

Та же техника может быть использована для создания объектов в атакуемых системах, которые действуют как внутренние объекты. Эти “действующие как” объекты могут быть использованы для преодоления механизмов безопасности и как трамплин для SQL injection атак в Ruby on Rails.

Опасный код может выглядеть как-то так:

JSON.parse(user_input)

Где `user_input` переменная содержит документ типа такого:

{"json_class":"foo"}

JSON гем будет пытаться найти константу "foo". При попытке нахождения константы будет создан символ.

В JSON версии 1.7.x, объекты с произвольными аттрибутами могут быть созданы при помощи документов JSON следующим образом:

{"json_class":"JSON::GenericObject","foo":"bar"}

Документ создаст инстанс JSON::GenericObject с аттрибутом "foo", которому выставлено значение "bar". Создание этих объектов повлечет произвольное создание символов и в некоторых случаях может быть использование для преодоления механизмов безопасности.

ВНИМАНИЕ: это поведение не изменится если использовать `JSON.load`. Вы никогда не должны давать на вход `JSON.load` ввод из неизвестных источников. Если вы работаете с JSON из неизвестных источников, всегда используйте `JSON.parse`.

Все пользователи, использующие затронутые релизы, должны обновиться или использовать один из обходных путей.

Обходные пути

Пользователям, которые не могут обновить ruby или гем JSON, следует заменить свой код с:

JSON.parse(json)

на:

JSON.parse(json, :create_additions => false)

Если вы не можете заменить использование `JSON.parse` (например, вы используете гем, который зависит от `JSON.parse`, как multi_json), то примените следующий манкипатч:

module JSON
  class << self
    alias :old_parse :parse
    def parse(json, args = {})
      args[:create_additions] = false
      old_parse(json, args)
    end
  end
end

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

  • Все версии ruby 1.9 до ruby 1.9.3 patchlevel 392
  • Все версии ruby 2.0 до ruby 2.0.0 patchlevel 0
  • транк до ревизии 39208

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

Огромное спасибо следующим людям, отвественным за обнаружение и работу с командой Rails по починке данной проблемы:

  • Thomas Hollstegge of Zweitag (www.zweitag.de)
  • Ben Murphy

История

  • Оригинал опубликован 2013-02-22 12:00:00 (UTC)