Closed
Bug 684815
(CVE-2011-2998)
Opened 13 years ago
Closed 13 years ago
Crash in the SpiderMonkey v.1.9.2 (FF 3.6.21) during regular expression evaluation
Categories
(Core :: JavaScript Engine, defect)
Tracking
()
RESOLVED
FIXED
Tracking | Status | |
---|---|---|
firefox6 | --- | unaffected |
firefox7 | --- | unaffected |
firefox8 | --- | unaffected |
firefox9 | --- | unaffected |
firefox10 | --- | unaffected |
blocking1.9.2 | --- | .23+ |
status1.9.2 | --- | .23-fixed |
People
(Reporter: mark.kaplan, Assigned: cdleary)
Details
(Keywords: crash, reporter-external, testcase, Whiteboard: [sg:critical] wanted-standalone-js)
Attachments
(2 files)
81.42 KB,
text/plain
|
Details | |
3.40 KB,
patch
|
dmandelin
:
review+
christian
:
approval1.9.2.23+
|
Details | Diff | Splinter Review |
User Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.854.0 Safari/535.2
Steps to reproduce:
Originally I browsed to attached regx.htm file using FireFox 3.6.21 on Windows 7 x64
Actual results:
Browser crashed with a crash stack like
mozcrt19.dll!memcpy(unsigned char * dst, unsigned char * src, unsigned long count) Line 188 Asm
js3250.dll!PushBackTrackState(REGlobalData * gData, REOp op, unsigned char * target, REMatchState * x, const unsigned short * cp, unsigned int parenIndex, unsigned int parenCount) Line 3477 + 0x17 bytes C++
js3250.dll!js_ExecuteRegExp(JSContext * cx, JSRegExp * re, JSString * str, unsigned int * indexp, int test, int * rval) Line 4897 + 0x8e bytes C++
js3250.dll!regexp_exec_sub(JSContext * cx, JSObject * obj, unsigned int argc, int * argv, int test, int * rval) Line 5716 + 0x3e bytes C++
js3250.dll!regexp_test(JSContext * cx, unsigned int argc, int * vp) Line 5741 + 0x71 bytes C++
js3250.dll!js_Interpret(JSContext * cx) Line 2208 + 0x1d bytes C++
mozcrt19.dll!arena_malloc_small(arena_s * arena, unsigned int size, int zero) Line 3737 C
mozcrt19.dll!malloc(unsigned int size) Line 5790 + 0x2f bytes C
js3250.dll!js_NewObjectWithGivenProto(JSContext * cx, JSClass * clasp, JSObject * proto, JSObject * parent, unsigned int objectSize) Line 2090 + 0x2d bytes C++
xul.dll!WrappedNative2WrapperMap::Add(WrappedNative2WrapperMap * head, JSObject * wrappedObject, JSObject * wrapper) Line 726 + 0x8 bytes C++
xul.dll!nsXPConnect::GetWrapperForObject(JSContext * aJSContext, JSObject * aObject, JSObject * aScope, nsIPrincipal * aPrincipal, unsigned int aFilenameFlags, int * _retval) Line 2478 + 0x96 bytes C++
xul.dll!XPC_WN_JSOp_ThisObject(JSContext * cx, JSObject * obj) Line 1471 C++
The same crash happened on Ubuntu Linux and on Debian Linux 5.0. The I took sources from http://hg.mozilla.org/releases/mozilla-1.9.2/, built SpiderMonkey 1.9.2 and its shell demonstrate the same crash when run on extracted from HTML file JavaScript:
#0 0x00529caf in memcpy () from /lib/libc.so.6
#1 0x08119f01 in PushBackTrackState (gData=0xbf88a32c, op=REOP_EOL, target=0xb6d6451b ".\035\0030",
x=0x9d28d50, cp=0x9d24310, parenIndex=0, parenCount=0) at ../jsregexp.cpp:3477
#2 0x0811a4a1 in ExecuteREBytecode (gData=0xbf88a32c, x=0x9d28d50) at ../jsregexp.cpp:4261
#3 0x0811fcdc in MatchRegExp (gData=0xbf88a32c, x=0x9d28d50) at ../jsregexp.cpp:4754
#4 0x0811fef7 in js_ExecuteRegExp (cx=0x9cfce18, re=0xb6d4d008, str=0x9d1a690, indexp=0xbf88a440, test=1,
rval=0x9d244a8) at ../jsregexp.cpp:4883
#5 0x0812098e in regexp_exec_sub (cx=0x9cfce18, obj=0x9d1d0e0, argc=1, argv=0x9d244b0, test=1, rval=0x9d244a8)
at ../jsregexp.cpp:5696
#6 0x08120a6e in regexp_test (cx=0x9cfce18, argc=1, vp=0x9d244a8) at ../jsregexp.cpp:5721
#7 0x081e39eb in js_Interpret (cx=0x9cfce18) at ../jsops.cpp:2208
#8 0x080c2cf6 in js_Execute (cx=0x9cfce18, chain=0x9d1d000, script=0x9d243b0, down=0x0, flags=0, result=0x0)
at ../jsinterp.cpp:1601
#9 0x0805b1b3 in JS_ExecuteScript (cx=0x9cfce18, obj=0x9d1d000, script=0x9d243b0, rval=0x0) at ../jsapi.cpp:4964
#10 0x080530dc in Process (cx=0x9cfce18, obj=0x9d1d000, filename=0xbf88c7a1 "regexe.js", forceTTY=0)
at ../../shell/js.cpp:442
#11 0x08053c7f in ProcessArgs (cx=0x9cfce18, obj=0x9d1d000, argv=0xbf88add8, argc=1) at ../../shell/js.cpp:849
#12 0x0805405f in main (argc=1, argv=0xbf88add8, envp=0xbf88ade0) at ../../shell/js.cpp:4853
(gdb) f 1
#1 0x08119f01 in PushBackTrackState (gData=0xbf88a32c, op=REOP_EOL, target=0xb6d6451b ".\035\0030",
x=0x9d28d50, cp=0x9d24310, parenIndex=0, parenCount=0) at ../jsregexp.cpp:3477
3477 sizeof(REProgState) * result->saveStateStackTop);
gdb) p/x result->saveStateStackTop
$4 = 0xfffffcea
(gdb) p sizeof(REProgState)
$5 = 24
For the best of my understanding this crash is exploitable, because memcpy function overrides both stack and heap - it tries to copy ~24*4GB of memory due to the integer underflow of result->saveStateStackTop and data to be copied is under control of web page author - both regular expression and string to search in. Before this crash happens valgrind reports about number of related invalid write(s) and read(s).
Expected results:
No crash
Reporter | ||
Comment 1•13 years ago
|
||
Updated•13 years ago
|
Assignee: general → cdleary
Whiteboard: [sg:critical]
Updated•13 years ago
|
blocking1.9.2: --- → ?
status1.9.2:
--- → wanted
status-firefox6:
--- → unaffected
status-firefox7:
--- → unaffected
status-firefox8:
--- → unaffected
status-firefox9:
--- → unaffected
Attachment #558437 -
Flags: review?(cdleary)
Updated•13 years ago
|
Attachment #558437 -
Flags: review?(cdleary) → review+
Comment on attachment 558437 [details] [diff] [review]
Proposed patch file
Approved for mozilla-1.9.2, please land asap.
Attachment #558437 -
Flags: approval1.9.2.23+
Status: UNCONFIRMED → RESOLVED
blocking1.9.2: ? → .23+
Closed: 13 years ago
Resolution: --- → FIXED
Updated•13 years ago
|
Whiteboard: [sg:critical] → [sg:critical] wanted-standalone-js
Updated•13 years ago
|
Updated•13 years ago
|
status-firefox10:
--- → unaffected
Updated•13 years ago
|
Group: core-security
Updated•9 months ago
|
Keywords: reporter-external
You need to log in
before you can comment on or make changes to this bug.
Description
•