Lỗ hổng từ chối dịch vụ và tạo đối tượng không an toàn trong JSON (CVE-2013-0269)

Đăng bởi usa vào 22 Feb 2013

Có một lỗ hổng từ chối dịch vụ và tạo đối tượng không an toàn trong json đi kèm với ruby. Lỗ hổng này đã được gán mã CVE CVE-2013-0269. Chúng tôi khuyến nghị mạnh mẽ việc nâng cấp ruby.

Chi tiết

Khi phân tích cú pháp một số tài liệu JSON nhất định, gem JSON (bao gồm bản đi kèm với ruby) có thể bị ép buộc tạo ra các Ruby symbol trong hệ thống đích. Vì Ruby symbol không được thu gom rác, điều này có thể dẫn đến một cuộc tấn công từ chối dịch vụ.

Kỹ thuật tương tự có thể được sử dụng để tạo các đối tượng trong hệ thống đích hoạt động giống như các đối tượng nội bộ. Các đối tượng "giống hệt" này có thể được sử dụng để vượt qua một số cơ chế bảo mật và có thể được sử dụng làm bàn đạp cho các cuộc tấn công SQL injection trong Ruby on Rails.

Mã bị ảnh hưởng trông như thế này:

JSON.parse(user_input)

Trong đó biến `user_input` sẽ có một tài liệu JSON như thế này:

{"json_class":"foo"}

Gem JSON sẽ cố gắng tra cứu hằng số "foo". Việc tra cứu hằng số này sẽ tạo ra một symbol.

Trong JSON phiên bản 1.7.x, các đối tượng với thuộc tính tùy ý có thể được tạo bằng tài liệu JSON như thế này:

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

Tài liệu này sẽ tạo ra một instance của JSON::GenericObject, với thuộc tính "foo" có giá trị "bar". Việc khởi tạo các đối tượng này sẽ dẫn đến việc tạo symbol tùy ý và trong một số trường hợp có thể được sử dụng để vượt qua các biện pháp bảo mật.

XIN LƯU Ý: hành vi này không thay đổi khi sử dụng `JSON.load`. `JSON.load` không bao giờ nên được cung cấp đầu vào từ các nguồn không xác định. Nếu bạn đang xử lý JSON từ một nguồn không xác định, luôn luôn sử dụng `JSON.parse`.

Tất cả người dùng đang chạy phiên bản bị ảnh hưởng nên nâng cấp hoặc sử dụng một trong các giải pháp thay thế ngay lập tức.

Giải pháp thay thế

Đối với người dùng không thể nâng cấp ruby hoặc gem JSON, hãy thay đổi mã của bạn từ:

JSON.parse(json)

Thành:

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

Nếu bạn không thể thay đổi cách sử dụng `JSON.parse` (ví dụ bạn đang sử dụng một gem phụ thuộc vào `JSON.parse` như multi_json), thì hãy áp dụng monkey patch này:

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

Phiên bản bị ảnh hưởng

  • Tất cả phiên bản ruby 1.9 trước ruby 1.9.3 patchlevel 392
  • Tất cả phiên bản ruby 2.0 trước ruby 2.0.0 patchlevel 0
  • Trước trunk revision 39208

Ghi nhận

Xin gửi lời cảm ơn lớn đến những người sau đây vì đã báo cáo vấn đề này một cách có trách nhiệm và làm việc với đội Rails để sửa lỗi:

  • Thomas Hollstegge của Zweitag (www.zweitag.de)
  • Ben Murphy

Lịch sử

  • Được công bố lần đầu vào 2013-02-22 12:00:00 (UTC)

Tin mới nhất

Phát hành Ruby 4.0.0

Chúng tôi vui mừng thông báo phát hành Ruby 4.0.0. Ruby 4.0 giới thiệu “Ruby Box” và “ZJIT”, cùng nhiều cải tiến khác.

Đăng bởi naruse vào 25 Dec 2025

Diện mạo mới cho tài liệu Ruby

Tiếp theo việc thiết kế lại ruby-lang.org, chúng tôi có thêm tin vui để kỷ niệm 30 năm Ruby: docs.ruby-lang.org có diện mạo hoàn toàn...

Đăng bởi Stan Lo vào 23 Dec 2025

Thêm Tin...