近期发现的三个Windows 0day漏洞分析及临时修复方案

栏目: 编程工具 · 发布时间: 5年前

内容简介:在近期,我们发现了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系统。

大家可以在下面的视频中看到微补丁的运行情况:

https://youtu.be/W-HZDu-yv0c

微补丁的源代码如下:

;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中。

大家可以在下面的视频中看到微补丁的运行情况:

https://youtu.be/or0jrSL9YIM

微补丁的源代码如下。其中包含四个小程序,每个小程序都有一条指令。

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显示恶意联系人卡片时启动微补丁,并且点击链接,最终的运行结果会与原来有所不同。

https://youtu.be/64GUaO9aSGI

微补丁的源代码如下:

;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]。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C语言进阶

C语言进阶

牟海军 / 机械工业出版社 / 2012-7 / 59.00元

C语言是编程语言中的一朵奇葩,虽已垂垂老矣,但却屹立不倒,诞生了数十年,仍然是最流行的编程语言之一。C语言看似简单,却不易吃透,想要运用好,更是需要积淀。本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,旨在让读者真正掌握C语言,从而编写出更高质量......一起来看看 《C语言进阶》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具