Phân tích exploit CVE 2014-1776
Tiếp theo mã lỗi CVE-2013-1347 phân tích lần trước
Lần này mình phân tích lỗi CVE-2014-1776, một lỗi zero-day nghiêm trọng được phát hiện bởi FireEye.
Phân tích
Lỗ hổng này ảnh hưởng đến các phiên bản từ IE 6 tới IE 10. Mã khai thác đính kèm cùng bài viết để mọi người cùng phân tích thảo luận. Đây không phải là dạng lỗi BOF thông thường mà được xếp vào loại Use-after-free. Lỗ hổng tồn tại trong đối tượng MSHTML!CMarkup::IsConnectedToPrimaryMarkup+0x6 khi sử dụng lại con trỏ của đối tượng này gây ra lỗi.
Chạy poc, chương trình crash tại lệnh “mov”
Phân tích heap hiện tại cho thấy con trỏ esi trỏ đến một đối tượng đã được giải phóng
Đối tượng đã được giải phóng từ trước trong hàm MSHTML!Cmarkup:rivateRelease tại địa chỉ 623d4d1a. Tiến hành phân tích tại địa chỉ này cho thấy gọi hàm giải phóng HeapFree từ trước
Như vậy đối tượng này đã được giải phóng từ trước và được sử dụng lại tại:
MSHTML!CMarkup::IsConnectedToPrimaryMarkup+0x6 => lỗi use-after-free.
[h=2]Khai thác[/h]Trong mã poc phân tích, khai thác sử dụng Flash object để bypass qua ASLR và DEP. Mã khai thác html sẽ load một file Flash trước khi lỗi và gây tràn heap.
Để khai thác, đầu tiên cần xác định kích thước của đối tượng được cấp phát trên heap trước khi nó được giải phóng. Sau đó ta có thể cấp phát một đối tượng fake với cùng kích thước thông qua sử dụng heap spray.
Đặt bp tại MSHTML!CMarkup::IsConnectedToPrimaryMarkup và kiểm tra heap alloc trước khi crash
BP MSHTML!CMarkup::IsConnectedToPrimaryMarkup “!heap -p -a esi; g”
Kích thước của đối tượng là 0x428 và như vậy cần tạo một đối tượng khác thông qua việc sử dụng heap spray để khai thác.
Trong POC thông qua sử dụng lib vgx.dll (một thư viện trong xử lý ảnh cho IE) đã được sử dụng cho các đoạn spray ở nhiều lỗi zero-day khác. Việc sử dụng các thư viện khác cũng như kỹ thuật mình sẽ đề cập trong các bài viết sau.
Lần này mình phân tích lỗi CVE-2014-1776, một lỗi zero-day nghiêm trọng được phát hiện bởi FireEye.
Phân tích
Lỗ hổng này ảnh hưởng đến các phiên bản từ IE 6 tới IE 10. Mã khai thác đính kèm cùng bài viết để mọi người cùng phân tích thảo luận. Đây không phải là dạng lỗi BOF thông thường mà được xếp vào loại Use-after-free. Lỗ hổng tồn tại trong đối tượng MSHTML!CMarkup::IsConnectedToPrimaryMarkup+0x6 khi sử dụng lại con trỏ của đối tượng này gây ra lỗi.
Chạy poc, chương trình crash tại lệnh “mov”
Phân tích heap hiện tại cho thấy con trỏ esi trỏ đến một đối tượng đã được giải phóng
Đối tượng đã được giải phóng từ trước trong hàm MSHTML!Cmarkup:rivateRelease tại địa chỉ 623d4d1a. Tiến hành phân tích tại địa chỉ này cho thấy gọi hàm giải phóng HeapFree từ trước
Như vậy đối tượng này đã được giải phóng từ trước và được sử dụng lại tại:
MSHTML!CMarkup::IsConnectedToPrimaryMarkup+0x6 => lỗi use-after-free.
[h=2]Khai thác[/h]Trong mã poc phân tích, khai thác sử dụng Flash object để bypass qua ASLR và DEP. Mã khai thác html sẽ load một file Flash trước khi lỗi và gây tràn heap.
Để khai thác, đầu tiên cần xác định kích thước của đối tượng được cấp phát trên heap trước khi nó được giải phóng. Sau đó ta có thể cấp phát một đối tượng fake với cùng kích thước thông qua sử dụng heap spray.
Đặt bp tại MSHTML!CMarkup::IsConnectedToPrimaryMarkup và kiểm tra heap alloc trước khi crash
BP MSHTML!CMarkup::IsConnectedToPrimaryMarkup “!heap -p -a esi; g”
Mã:
address 21be4bd8 found in
_DPH_HEAP_ROOT @ 1f1000
in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize – VirtAddr VirtSize)
21a038bc: 21be4bd8 428 – 21be4000 2000
MSHTML!CMarkup::`vftable’
553b8e89 verifier!AVrfDebugPageHeapAllocate+0x00000229
77270d96 ntdll!RtlDebugAllocateHeap+0x00000030
7722af0d ntdll!RtlpAllocateHeap+0x000000c4
771d3cfe ntdll!RtlAllocateHeap+0x0000023a
60cc0ee7 MSHTML!CDoc::CreateMarkupFromInfo+0x00000158
60d0de89 MSHTML!CDoc::CreateMarkup+0x00000064
612a6329 MSHTML!RemoveDOMNodeHelper+0x00000093
60ed48a3 MSHTML!CElement::removeNode+0x00000033
611d87bf MSHTML!Method_IDispatchpp_oDoVARIANTBOOL+0x0000006f
61019697 MSHTML!CBase::ContextInvokeEx+0x000002b6
60e257a5 MSHTML!CElement::ContextInvokeEx+0x0000004c
61025e62 MSHTML!CElement::VersionedInvokeEx+0x0000002a
60d9f492 MSHTML!CBase::PrivateInvokeEx+0x0000006d
690c5ef6 jscript9!HostDispatch::CallInvokeEx+0x000000ae
690ce85a jscript9!HostDispatch::InvokeMarshaled+0x0000004b
690ce79a jscript9!HostDispatch::InvokeByDispId+0x000001cf
690ce5c3 jscript9!DispMemberProxy::DefaultInvoke+0x00000023
68fe7530 jscript9!Js::InterpreterStackFrame::Process+0x00001e3c
68fe7028 jscript9!Js::InterpreterStackFrame::InterpreterThunk+0x000001e8
address 21be4bd8 found in
_DPH_HEAP_ROOT @ 1f1000
in free-ed allocation ( DPH_HEAP_BLOCK: VirtAddr VirtSize)
21a038bc: 21be4000 2000
553b90b2 verifier!AVrfDebugPageHeapFree+0x000000c2
77271564 ntdll!RtlDebugFreeHeap+0x0000002f
7722ac29 ntdll!RtlpFreeHeap+0x0000005d
771d34a2 ntdll!RtlFreeHeap+0x00000142
769514ad kernel32!HeapFree+0x00000014
60df4d1a MSHTML!CMarkup::`vector deleting destructor’+0x00000025
60c60492 MSHTML!CBase::PrivateRelease+0x00000103
60c59909 MSHTML!CMarkup::PrivateRelease+0x0000002c
60f6f811 MSHTML!CMarkup::ProcessPeerTask+0x00000066
60fd88a1 MSHTML!CMarkup::ProcessPeerTaskContext+0x0000008e
60fd8803 MSHTML!CMarkup::ProcessPeerTasks+0x0000003f
60fd9016 MSHTML!CElement::VersionedGetDispID+0x0000008f
61037a70 MSHTML!CBase::PrivateGetDispID+0x00000041
690c5d1c jscript9!HostDispatch::GetDispID+0x00000091
69172421 jscript9!HostDispatch::EnsureDispIdForProperty+0x0000003d
69172544 jscript9!HostDispatch::PutValue+0x00000019
69172521 jscript9!HostDispatch::SetPropertyCore+0x00000046
69172686 jscript9!HostDispatch::SetProperty+0x00000032
68fe29e1 jscript9!Js::JavascriptOperators::SetProperty_Internal+0x0000005c
6901fde7 jscript9!Js::JavascriptOperators::OP_SetProperty+0x00000040
6901fe43 jscript9!Js::JavascriptOperators::PatchPutValueNoFastPath+0x0000004d
6901f931 jscript9!Js::InterpreterStackFrame::Process+0x0000319d
68fe7028 jscript9!Js::InterpreterStackFrame::InterpreterThunk+0x000001e8
(24c8.218c): Access violation – code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000000 ebx=00000000 ecx=21be4bd8 edx=0a4bad54 esi=21be4bd8 edi=00000000
eip=60e15956 esp=0a4bad84 ebp=0a4badd4 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00210246
MSHTML!CMarkup::IsConnectedToPrimaryMarkup+0x6:
60e15956 8b86a4000000 mov eax,dword ptr [esi+0A4h] ds:002b:21be4c7c=????????
Kích thước của đối tượng là 0x428 và như vậy cần tạo một đối tượng khác thông qua việc sử dụng heap spray để khai thác.
Trong POC thông qua sử dụng lib vgx.dll (một thư viện trong xử lý ảnh cho IE) đã được sử dụng cho các đoạn spray ở nhiều lỗi zero-day khác. Việc sử dụng các thư viện khác cũng như kỹ thuật mình sẽ đề cập trong các bài viết sau.
Chỉnh sửa lần cuối bởi người điều hành: