Вразливість відмови в обслуговуванні та небезпечного створення об'єктів у JSON (CVE-2013-0269)

Опублікував usa 22-02-2013
Переклав: Andrii Furmanets

Є вразливість відмови в обслуговуванні та небезпечного створення об’єктів у json, включеному з ruby. Цій вразливості присвоєно ідентифікатор CVE CVE-2013-0269. Ми настійно рекомендуємо оновити ruby.

Деталі

При парсингу певних документів JSON, gem JSON (включає включений з ruby) може бути примушений до створення символів Ruby в цільовій системі. Оскільки символи Ruby не збираються збирачем сміття, це може призвести до атаки відмови в обслуговуванні.

Та сама техніка може використовуватися для створення об’єктів у цільовій системі, які діють як внутрішні об’єкти. Ці об’єкти “як внутрішні” можуть використовуватися для обходу певних механізмів безпеки та можуть використовуватися як трамплін для атак SQL ін’єкції в Ruby on Rails.

Зачеплений код виглядає так:

JSON.parse(user_input)

Де змінна `user_input` матиме JSON документ, як це:

{"json_class":"foo"}

Gem 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 або gem JSON, змініть ваш код з цього:

JSON.parse(json)

На це:

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

Якщо ви не можете змінити використання `JSON.parse` (наприклад, ви використовуєте gem, який залежить від `JSON.parse`, як multi_json), тоді застосуйте цей monkey patch:

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 рівня патчу 392
  • Всі версії ruby 2.0 до ruby 2.0.0 рівня патчу 0
  • до ревізії trunk 39208

Подяка

Величезна подяка наступним людям за відповідальне розкриття цієї проблеми та роботу з командою Rails для її виправлення:

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

Історія

  • Спочатку опубліковано 2013-02-22 12:00:00 (UTC)

Останні новини

Вийшов Ruby 4.0.0

Ми раді повідомити про випуск Ruby 4.0.0. Ruby 4.0 представляє “Ruby Box” та “ZJIT”, а також додає багато покращень.

Опублікував naruse 25-12-2025

Більше новин...