内容简介:在近期,我们发现了3个0day漏洞,本文将主要分析这些0day漏洞,探讨攻击者利用这些漏洞可以实现的功能,并在最后给出修复建议。一、angrypolarbearbug漏洞该漏洞于上个月发布,由作者SandboxEscaper将其命名为“angrypolarberbug”,该漏洞允许本地无特权进程在系统上使用Windows错误报告XML文件中的内容,覆盖任何指定的文件。由于攻击者几乎无法控制该XML文件中的内容,因此SandboxEscaper提供的演示是破坏关键系统文件pci.sys从而导致本地拒绝服务,这
在近期,我们发现了3个0day漏洞,本文将主要分析这些0day漏洞,探讨攻击者利用这些漏洞可以实现的功能,并在最后给出修复建议。
一、angrypolarbearbug漏洞
该漏洞于上个月发布,由作者SandboxEscaper将其命名为“angrypolarberbug”,该漏洞允许本地无特权进程在系统上使用Windows错误报告XML文件中的内容,覆盖任何指定的文件。由于攻击者几乎无法控制该XML文件中的内容,因此SandboxEscaper提供的演示是破坏关键系统文件pci.sys从而导致本地拒绝服务,这样会阻止系统的启动。可以想象,如果我们能够发现覆盖某些文件会导致可以在更高权限(例如:SYSTEM或Administrator)下执行攻击者特定的代码,那么这一漏洞的危害程度将会更高。但是目前据我们所知,还没有发现此类漏洞利用方式。
该漏洞的关键在于,对于经过身份验证的用户来说(包括本地攻击者),Windows错误报告服务创建临时XML文件的C:\ProgramData\Microsoft\Windows\WER\Temp\文件夹具有包括读取、写入和删除访问权限的可继承权限。这意味着,当某人在没有指定权限的情况下创建新文件时,系统上的任何进程(包括低权限的恶意进程)都可以用另一个文件替换该文件。这就是SandboxEscaper的PoC所进行的操作:等待XML文件出现,然后用指向特定目标文件(例如:pci.sys)的硬链接快速替换它。当Windows错误报告服务随后重新打开这一XML文件并进行写入时,它实际上打开的是链接到的文件,并对其进行写入。
我们给出的修复方案稍有变化。当Windows错误报告服务创建XML文件时,它现在会被指定与以前完全相同的权限,但授权用户对该文件并没有删除权限。这样一来,可以使得错误报告继续正常工作,同时防止利用该漏洞删除XML文件(以及在其位置创建硬链接)。
我们已经将这个微补丁更新到Windows 10的1803版本中。请注意,由于错误报告的工作方式不同,这一漏洞似乎不会影响到Windows 7系统。
大家可以在下面的视频中看到微补丁的运行情况:
微补丁的源代码如下:
;Micropatch for wer.dll version 10.17134.471 ; ;How it works: ; a vulnerable call CreateFileW responsible for creating a temporary report XML file ; which inherits loose C:\ProgramData\Microsoft\Windows\WER\Temp\ permissions is replaced by ; a call to ConvertStringSecurityDescriptorToSecurityDescriptor which creates a new security ; descriptor from ACE string that gets supplied to a new CreateFileW call. ; The new security descriptor has no DELETE permissions for AuthenticatedUsers group ; on report XML so a regular user can no longer change it to a hard link. MODULE_PATH "..\AffectedModules\wer.dll_10.17134.471_64bit\wer.dll" PATCH_ID 344 PATCH_FORMAT_VER 2 VULN_ID 4657 PLATFORM win64 patchlet_start PATCHLET_ID 1 PATCHLET_TYPE 2 PIT kernel32.dll!CreateFileW,advapi32.dll!ConvertStringSecurityDescriptorToSecurityDescriptorA,kernel32.dll!LocalFree PATCHLET_OFFSET 0x00059bd7 JUMPOVERBYTES 11 N_ORIGINALBYTES 2 code_start mov qword [rsp+10h], r8 ; dwShareMode mov qword [rsp+8h], rdi ; storing a global variable mov qword [rsp], rcx ; lpFileName call arg0_StringSecurityDescriptor ; args for ConvertStringSecurityDescriptorToSecurityDescriptor ; we changed (A;;0x13019f;;;AU) to (A;;GRSD;;;AU) - meaning ; AuthenticatedUsers can Read and Delete only db "D:(A;;FA;;;BA)(A;;GRGW;;;AU)(A;;0x13019f;;;SU)(A;;0x13019f;;;LS)(A;;0x13019f;;;NS)(A;;0x13019f;;;WR)(A;;0x13019f;;;AC)(A;;0x13019f;;;S-1-15-2-2)",0 arg0_StringSecurityDescriptor: pop rcx ; rcx=arg0_StringSecurityDescriptor mov rdx, 01h ; arg1: StringSDRevision=SDDL_REVISION_1 ;arg2: this arg is part of SECURITY_ATTRIBUTES struct so we have to create this first ; sa requires 18h of space sub rsp, 20h ; but we're allocating 8 more than required nLength to keep stack alignment lea r8, [rsp+8h] ;arg2: SecurityDescriptor=&sa.lpSecurityDescriptor ;init sa: mov dword [rsp],18h ;sa.nLength = sizeof(SECURITY_ATTRIBUTES); mov dword [rsp+10h],1h ;sa.bInheritHandle=FALSE xor r9d,r9d ; SecurityDescriptorSize=NULL sub rsp, 20h ; allocate homespace call PIT_ConvertStringSecurityDescriptorToSecurityDescriptorA ;copy CreateFileW args 5,6 and 7 to a new stack frame mov rax, [rsp+60h] ; dwCreationDisposition mov qword [rsp],rax mov rax, [rsp+68h] ; dwFlagsAndAttributes mov qword [rsp+8h],rax mov rax, [rsp+70h] ; hTemplateFile mov qword [rsp+10h],rax ;obtain CreateFileW args 1,2,3,4 mov rcx, [rsp+40h] ; lpFileName mov edx, 0C0000000h ; dwDesiredAccess mov r8, [rsp+50h] ; dwShareMode lea r9,[rsp+20h] ;lpSecurityAttributes sub rsp, 20h ; alloc homespace call PIT_CreateFileW mov [rsp+28h],rax ; store result ;free the security descriptor: mov rcx,[rsp+48h] ; sa.lpSecurityDescriptor call PIT_LocalFree ;LocalFree(sa.lpSecurityDescriptor) mov rax,[rsp+28h] ;restore result mov rdi,[rsp+68h] ;restore the global variable add rsp, 60h ;restore stack code_end patchlet_end
二、Readfile漏洞
在上个月,SandboxEscaper也发布了“ Readfile ” 0day漏洞。该漏洞允许在Windows计算机上运行的非特权进程获取任意文件的内容,即使此类文件的权限已经设置了不允许对其进行读访问。在PoC中,演示了从用户桌面读取另一个用户desktop.ini文件的内容,但作者提出还可以尝试读取Office历史文件等内容(具有已知路径的其他索引文件或历史文件),这样可以进一步实现漏洞的利用。
该漏洞位于Windows Installer,更确切的说是其中的广告功能,可以使用MsiAdvertiseProduct函数触发。在这里,我们不打算深入说明漏洞的细节。但需要说明的是,在产品安装过程中(使用MSI安装包),以SYSTEM身份运行的Windows Installer将获取相应MSI文件,并对其进行解析,然后在C:\Windows\Installer文件夹中创建临时MSI文件,并复制原始MSI文件的内容。(实际上,会进行更多操作,但这些操作与漏洞无关,因此在这里省略。)SandboxEscaper注意到原始MSI文件被打开两次,并且可以在第一次打开时指向常规MSI文件的符号链接,但第二次打开时指向其他文件。这样就会导致后一个文件的内容被复制到临时MSI文件中。由于临时MSI文件的权限允许Everyone读取和访问,因此攻击者可以欺骗Windows Installer服务将任意文件的内容复制到临时的MSI文件中,然后读取该文件,以获取特定文件中的内容。
要对这个漏洞进行修复,需要我们熟悉Windows Installer的内部工作原理。事实证明,将源MSI文件复制到临时MSI文件的函数已经支持对临时文件设置两个不同的权限集:(1)继承权限;(2)源MSI文件的权限。它在进行产品的推荐时,使用了继承的权限(允许攻击者读取文件),因此我们需要采取一些小技巧,来强制它使用源MSI文件的权限。经过修复后,产品广告功能仍然正常工作,但由于临时MSI文件权限与正在复制的文件权限相同,因此攻击者就无法实现越权读取文件。
我们已经将这个微补丁更新到64位的Windows 10 1803版本和最新的Windows 7中。
大家可以在下面的视频中看到微补丁的运行情况:
微补丁的源代码如下。其中包含四个小程序,每个小程序都有一条指令。
MODULE_PATH "..\AffectedModules\msi.dll_5.0.17134.228_64bit.dll\msi.dll" ; Windows 10 version 1803 PATCH_ID 345 PATCH_FORMAT_VER 2 VULN_ID 4658 PLATFORM win64 patchlet_start PATCHLET_ID 1 PATCHLET_TYPE 2 PATCHLET_OFFSET 0x002edb76 ; Injecting after eax is set to FlagsAndAttributes ; in CMsiFileCopy::OpenDestination code_start or r12d, 0x8000 ; we set the 15th bit of FlagsAndAttributes, ; which will cause the execution to flow towards using ; source file's ACL code_end patchlet_end patchlet_start PATCHLET_ID 2 PATCHLET_TYPE 2 PATCHLET_OFFSET 0x002edbe9 ; Overwriting code that checks value #12 in ; MSI record, and setting eax to 1 JUMPOVERBYTES 20 code_start mov eax, 1 ; we set eax to 1 to simulate IsNull returning false code_end patchlet_end patchlet_start PATCHLET_ID 3 PATCHLET_TYPE 2 PATCHLET_OFFSET 0x002edd0e ; Overwriting code that checks value #12 in ; MSI record, and setting eax to 1 JUMPOVERBYTES 22 code_start mov eax, 1 ; we set eax to 1 to simulate IsNull returning false code_end patchlet_end patchlet_start PATCHLET_ID 4 PATCHLET_TYPE 2 PATCHLET_OFFSET 0x002edd61 ; Overwriting code that checks value #12 in ; MSI record, and setting eax to 1 JUMPOVERBYTES 6 code_start mov eax, 1 ; we set eax to 1 to simulate IsNull returning false code_end patchlet_end
三、Windows Contacts任意代码执行漏洞
该0day漏洞是由ZDI研究员John Page在向微软报告漏洞的90天后发布的。该漏洞最初被认为与VCF文件(默认与Windows Contacts应用程序关联)有关,但随后发现CONTACT文件(默认也与Windows Contacts关联)也可以进行漏洞利用。
该问题在于,几乎所有通过网站URL或电子邮件中提供的VCF或CONTACT文件,其中的字符串最终都将被用作ShellExecute调用的参数。尽管ShellExecute是用于在用户默认浏览器中打开URL的便捷功能,但在此操作之前,它还会尝试在本地计算机上“启动”提供的字符串。具体而言,在提供“www.microsoft.com”的情况下,ShellExecute将首先尝试查找并启动一个名为www.microsoft.com的本地可执行文件,只有在失败的情况下,才会在浏览器中打开这一网页。这样的行为,在此前已经造成了许多漏洞的出现,将来也毫无疑问会带来更多的问题。要利用这一漏洞,攻击者必须诱导用户打开恶意的VCF或CONTACT文件,然后单击显示的网站或电子邮件链接,这样会导致启动攻击者的可执行文件,该文件也必须存在于用户的计算机或网络共享上。
我们分析了在点击网站或电子邮件链接时发生的事件,会导致在wab32.dll中使用SafeExecute函数。该函数会对URL进行解析,从而允许mshelp:// URLs形式URL的执行,然后将调用ShellExecute。我们在调用之前,简单地添加了一些逻辑,以确保如果URL不以“mailto:”、“http://”或“https://”开头,那么将会使用“https://”前缀来防止任何可能的本地可执行文件启动。我们最初考虑的方法是在读取文件的代码中添加清理代码,但后来发现显示链接的代码很容易存在HTML注入的问题,这会使得清理过程变得异常复杂,并且可能会被绕过。
我们已经将这个微补丁更新到64位的Windows 10 1803版本和最新的Windows 7中。
大家可以在下面的视频中看到微补丁的运行情况。该视频同时还很好的演示了如何将微补丁应用到正在运行的进程中。我们在Windows Contacts显示恶意联系人卡片时启动微补丁,并且点击链接,最终的运行结果会与原来有所不同。
微补丁的源代码如下:
;Micropatch for wab32.dll version 6.1.7601.17699 ; ;How it works: ; in SafeExecute an unsanitized pszUrl - a user-controlled parameter is passed to ShellExecute. ; This patch adds a series of checks for valid pszUrl prefixes and eventually, ; if no valid prefix is found, adds a http:// prefix to pszUrl. MODULE_PATH "..\AffectedModules\wab32.dll_6.1.7601.17699\wab32.dll" PATCH_ID 347 PATCH_FORMAT_VER 2 VULN_ID 4656 PLATFORM win64 patchlet_start PATCHLET_ID 1 PATCHLET_TYPE 2 PATCHLET_OFFSET 0x00087f7a PIT SHLWAPI.dll!StrCmpNICW,msvcrt.dll!memmove JUMPOVERBYTES 0 N_ORIGINALBYTES 1 code_start ;store registers: push rsi push rcx push rdx push r8 push r8 ; extra space for prefix variable push rax ; store pszUrl ;check lpFile for valid prefixes: call mailto db __utf16__('mailto:'),0 mailto: pop rcx ; pszStr1 = "mailto:" mov rdx, rax ; pszStr2 = pszUrl mov r8, 07h ; nChar sub rsp, 20h ; homespace call PIT_StrCmpNICW test rax,rax jz skip ; if found, exit patch call https db __utf16__('https://'),0 https: pop rcx ; pszStr1 = "https://" mov rdx, [rsp+20h] ; pszStr2 = pszUrl mov r8, 08h ; nChar call PIT_StrCmpNICW test rax,rax jz skip ; if found, exit patch call http db __utf16__('http://'),0 http: pop rcx ; pszStr1 = "http://" mov [rsp+28h], rcx ; store prefix mov rdx, [rsp+20h] ; pszStr2 = pszUrl mov r8, 07h ; nChar call PIT_StrCmpNICW test rax,rax jz skip ; if found, exit patch mov r8, 1024h ; num mov rdx, [rsp+20h] ; Src = pszUrl lea rcx,[rdx+0eh] ; Dst call PIT_memmove ; moving pszUrl of max 1024h in size to *pszUrl+0eh mov rcx, [rsp+20h] ; Dst = pszUrl mov rdx, [rsp+28h] ; Src = "http://" mov r8, 0eh ; num call PIT_memmove ; copying http:// to *pszUrl skip: ;revert stack: add rsp, 20h ; revert homespace pop rax pop r8 ; blank pop pop r8 pop rdx pop rcx pop rsi code_end patchlet_end
四、总结
上述内容就是我们近期发现的3个0day漏洞,以及相应的临时修复方式。我们不清楚微软是否会对这些问题进行修复,也不清楚会在什么时间解决这些问题。如果用户已经安装并注册了我们的代理,那么这些微补丁将在计算机上安装,并应用于所有受影响的进程。否则,大家可以注册一个免费的0patch帐户,并安装0patch Agent以应用这些微补丁。如果此后微软修复了这些问题,则相关的微补丁将会立即停止运行并恢复到原有状态,因此用户无需担心微补丁会影响Windows Update正常更新。
需要注意的是,我们还没有将这些微补丁移植到所有Windows版本上。如果大家有修复特定版本Windows的需求,请联系[email protected]。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 漏洞分析:OpenSSH用户枚举漏洞(CVE-2018-15473)分析
- 【漏洞分析】CouchDB漏洞(CVE–2017–12635, CVE–2017–12636)分析
- 【漏洞分析】lighttpd域处理拒绝服务漏洞环境从复现到分析
- 漏洞分析:对CVE-2018-8587(Microsoft Outlook)漏洞的深入分析
- 路由器漏洞挖掘之 DIR-815 栈溢出漏洞分析
- Weblogic IIOP反序列化漏洞(CVE-2020-2551) 漏洞分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。