Bỏ qua taint của đối tượng trong DL và Fiddle trong Ruby (CVE-2013-2065)
Đăng bởi usa vào 14 May 2013
Có một lỗ hổng trong DL và Fiddle trong Ruby trong đó các chuỗi bị taint có thể được sử dụng bởi các lệnh gọi hệ thống bất kể mức $SAFE được đặt trong Ruby. Lỗ hổng này đã được gán mã CVE CVE-2013-2065.
Ảnh hưởng
Các hàm native được expose cho Ruby với DL hoặc Fiddle không kiểm tra giá trị taint được đặt trên các đối tượng truyền vào. Điều này có thể dẫn đến việc các đối tượng bị taint được chấp nhận làm đầu vào khi lẽ ra ngoại lệ SecurityError phải được ném ra.
Mã DL bị ảnh hưởng sẽ trông giống như thế này:
def my_function(user_input)
handle = DL.dlopen(nil)
sys_cfunc = DL::CFunc.new(handle['system'], DL::TYPE_INT, 'system')
sys = DL::Function.new(sys_cfunc, [DL::TYPE_VOIDP])
sys.call user_input
end
$SAFE = 1
my_function "uname -rs".taintMã Fiddle bị ảnh hưởng sẽ trông giống như thế này:
def my_function(user_input)
handle = DL.dlopen(nil)
sys = Fiddle::Function.new(handle['system'],
[Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
sys.call user_input
end
$SAFE = 1
my_function "uname -rs".taintTấ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.
Lưu ý rằng điều này không ngăn các offset bộ nhớ dạng số được sử dụng làm giá trị con trỏ. Số không thể bị taint, vì vậy mã truyền offset bộ nhớ dạng số không thể được kiểm tra. Ví dụ:
def my_function(input)
handle = DL.dlopen(nil)
sys = Fiddle::Function.new(handle['system'],
[Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
sys.call input
end
$SAFE = 1
user_input = "uname -rs".taint
my_function DL::CPtr[user_input].to_iTrong trường hợp này, vị trí bộ nhớ được truyền, và tính taint của đối tượng không thể được xác định bởi DL / Fiddle. Trong trường hợp này, vui lòng kiểm tra tính taint của đầu vào người dùng trước khi truyền vị trí bộ nhớ:
user_input = "uname -rs".taint
raise if $SAFE >= 1 && user_input.tainted?
my_function DL::CPtr[user_input].to_iGiải pháp thay thế
Nếu bạn không thể nâng cấp Ruby, monkey patch này có thể được sử dụng như giải pháp thay thế:
class Fiddle::Function
alias :old_call :call
def call(*args)
if $SAFE >= 1 && args.any? { |x| x.tainted? }
raise SecurityError, "tainted parameter not allowed"
end
old_call(*args)
end
endPhiên bản bị ảnh hưởng
- Tất cả phiên bản ruby 1.9 trước ruby 1.9.3 patchlevel 426
- Tất cả phiên bản ruby 2.0 trước ruby 2.0.0 patchlevel 195
- Trước trunk revision 40728
Các phiên bản ruby 1.8 không bị ảnh hưởng.
Ghi nhận
Cảm ơn Vit Ondruch đã báo cáo vấn đề này.
Lịch sử
- Được công bố lần đầu vào 2013-05-14 13:00:00 (UTC)
Tin mới nhất
Phát hành Ruby 3.2.10
Ruby 3.2.10 đã được phát hành.
Đăng bởi hsbt vào 14 Jan 2026
Phát hành Ruby 4.0.1
Ruby 4.0.1 đã được phát hành.
Đăng bởi k0kubun vào 13 Jan 2026
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