Windows PsSetLoadImageNotifyRoutine的0day漏洞(续)
网安服务商和内核开辟者必要留意,Windows内核的一个代码编写差错能够能让你无奈再运行中拿到是哪一个模块被加载了的信息。而且修复它不是你设想的那末简略。
疾速回想
在研讨windows内核过程当中,咱们碰到了一个风趣的成绩,对于PsSetLoadImageNotifyRoutine,便是关照模块加载的。在注册了一个加载PE模块的关照以后,内核回调函数能够会收到一个不合法的镜像名字。
在咱们曩昔宣布的博客中,咱们研讨了这个bug相干的分歧内核组件。在弄明确了缘故原由以后,咱们找到了一种办理它的办法。
怀疑:一个耐久的成绩
有一件事对咱们来说异常奇异,便是这个机制曾经异常老了,然则在咱们曩昔没有人碰到这个成绩。这么多年来一个文档化的普遍应用的windows内核机制怎样能够如许,没有修复这么一个显著的成绩,或许宣布新的文档。
颠末在线的一番与这个bug相干的信息的搜刮,咱们没有发明任何民间的文档,或许能够惹起的任何信息。咱们也在社区碰到一个相似成绩的特别阐明,它让咱们晓得了一些重要的工作:
a. 这个成绩,咱们也能够复现,似乎来源于异样的成绩
b. 一个对于回调关照的异样的bug在十年前乃至更早就曾经呈现了(咱们没有发如今2001年曩昔的信息了)
c. 微软应当也晓得这个成绩
差错的办理计划
在探求办理这个bug的计划时,咱们发明了几款对象试图经由过程分歧的办法办理它,但其实没什么用。有些应用ObQueryNameString或许各类API其实会有雷同的成果,在其余处所简略增长和FILE_OBJECT.FileName相干的DEVICE_OBJECT的名字,但其实在object的性命周期从来没有应用它。
咱们还在继承做
此时,咱们决议继承反省其余供应PE加载回调关照的函数,如PsSetCreateProcessNotifyRoutineEx,这个函数在Windows Vista Sp1以后能力应用。咱们想看看他能否也有异样的bug在内核中。
让咱们迷惑的是在这个函数中CreateInfo参数有一个特定flag,FileOpenNameAvailable,当设置为TRUE时,表现这个字符串指定的完备文件名字是要关上的可执行文件的名字。假如设置为FALSE,操作体系只是供应一部分名字。
在反省nt!PspInsertThread的反汇编代码是,这个flag显著被设置为FALSE,ImageFileName是FILE_OBJECT(过程的SECTION)的FileName字段。像咱们曩昔提到的加载镜像关照回调的成绩异样,这个flag注解这个穿拿来的参数的完备性是不可托任的。
图1. Nt!PspInsertThread – 在挪用注册的回调曩昔初始化CreateInfo.ImageFileName和CreateInfo.FileOpenNameAvailable
看起来微软像是留意到了这个成绩,至多卖力PsSetCreateProcessNotifyRoutineEx的开辟者留意到了。事实上,微软为何至今也没有办理PsSetLoadImageNotifyRoutine的bug仍然让人不解。
用微软的办法(险些精确)
在搜刮更多对于PsSetCreateProcessNotifyRoutineEx的文档的时刻,咱们找到了一篇2007年5月的文档,叫做“支撑Windows Server 2008的内核数据和过滤”,今朝曾经在微软的网站上曾经没有了(这里有援用)。这个文档指明在应用过程创立回调时,驱动能够经由过程过滤治理API获得额定的属性,好比FltGetFileNameINformationUnsafe。
依据这些信息咱们确认FltGetFielNameInformationUnsafe能够供应给咱们最优雅和简略的办理这个bug的计划。应用这个函数能够让咱们不消完成文件体系小过滤驱动就能够办理这个成绩。咱们从PsSetLoadImageNotifyRoutine回调中拿到FILE_OBJECT的办法和从PsSetCreateProcessNotifyRoutineEx回调中异常相似,所以在咱们的成绩中它看起来是一个可行的办理计划。
让咱们更宁神的是在某些Windows自己的组件中也应用了这个函数,好比Windows Defender和防火墙。
图2. Windows 10Redstone中Windows Defender(WdFilter.sys)和防火墙的回调
只管未尽明
在加载镜像关照回调中应用FltGetFileNameInformationUnsafe偶然会失败,前往STATUS_OBJECT_NAME_NOT_FOUND。在微软文档中这个差错没记载未这个函数能够的差错。
颠末一些试验,咱们找到能一直重现这个差错状况的精确的变乱序列。FltGetFileNameInformationUnsafe会在必定阶段挪用fltmgr!FltpExpandShortNames,这个是现试验证文件门路能否存在的函数。
图3. Fltmgr!FltGetFileNameINformationUnsafe中Fltmgr!FltpExpandShortNames的回调
成绩是这个验证仅仅是一部分:代码验证门路中一切目次能否存在,然则却疏忽了反省给定门路中文件自己能否存在。是以,咱们如今晓得它给出的差错代码只在文件以后不在他曩昔的目次中才是有用的,咱们至多能够获得到它关上的名字(在给FltGetFileNameInformationUnsafe通报恰当的flag的时刻)。
是以,咱们只要末了一件事必要处置:不论什么时刻FltGetFileNameInformationUnsafe挪用胜利,咱们必要确保拿到的门路是文件现实存在的。另有,咱们必要验证这个文件是和咱们在加载镜像回调中拿到的文件是同一个。
总结
实践上上一篇博客描写的这个Windows内核的bug,具备潜在的风险,用来诱骗依附关照机制供应信息的网安产物。这个缺点看起来来自于一个代码编写差错,从Windows2000最新的Windows10宣布版都邑收到影响。这意味着只要微软修复了这个bug,网安厂商在windows情况中开辟的产物不克不及依附回调关照供应的差错信息。网安厂商必需探求代替的更可托的办法来获得关照机制供应的不可靠信息,盼望能够用到本博客中供应的研讨内容。
网安服务商和内核开辟者必要留意,Windows内核的一个代码编写差错能够能让你无奈再运行中拿到是哪一个模块被加载了的信息。而且修复它不是你设想的那末简略。
疾速回想
在研讨windows内核过程当中,咱们碰到了一个风趣的成绩,对于PsSetLoadImageNotifyRoutine,便是关照模块加载的。在注册了一个加载PE模块的关照以后,内核回调函数能够会收到一个不合法的镜像名字。
在咱们曩昔宣布的博客中,咱们研讨了这个bug相干的分歧内核组件。在弄明确了缘故原由以后,咱们找到了一种办理它的办法。
怀疑:一个耐久的成绩
有一件事对咱们来说异常奇异,便是这个机制曾经异常老了,然则在咱们曩昔没有人碰到这个成绩。这么多年来一个文档化的普遍应用的windows内核机制怎样能够如许,没有修复这么一个显著的成绩,或许宣布新的文档。
颠末在线的一番与这个bug相干的信息的搜刮,咱们没有发明任何民间的文档,或许能够惹起的任何信息。咱们也在社区碰到一个相似成绩的特别阐明,它让咱们晓得了一些重要的工作:
a. 这个成绩,咱们也能够复现,似乎来源于异样的成绩
b. 一个对于回调关照的异样的bug在十年前乃至更早就曾经呈现了(咱们没有发如今2001年曩昔的信息了)
本文来自无奈人生安全网
c. 微软应当也晓得这个成绩
差错的办理计划
在探求办理这个bug的计划时,咱们发明了几款对象试图经由过程分歧的办法办理它,但其实没什么用。有些应用ObQueryNameString或许各类API其实会有雷同的成果,在其余处所简略增长和FILE_OBJECT.FileName相干的DEVICE_OBJECT的名字,但其实在object的性命周期从来没有应用它。
咱们还在继承做
此时,咱们决议继承反省其余供应PE加载回调关照的函数,如PsSetCreateProcessNotifyRoutineEx,这个函数在Windows Vista Sp1以后能力应用。咱们想看看他能否也有异样的bug在内核中。
让咱们迷惑的是在这个函数中CreateInfo参数有一个特定flag,FileOpenNameAvailable,当设置为TRUE时,表现这个字符串指定的完备文件名字是要关上的可执行文件的名字。假如设置为FALSE,操作体系只是供应一部分名字。
在反省nt!PspInsertThread的反汇编代码是,这个flag显著被设置为FALSE,ImageFileName是FILE_OBJECT(过程的SECTION)的FileName字段。像咱们曩昔提到的加载镜像关照回调的成绩异样,这个flag注解这个穿拿来的参数的完备性是不可托任的。
无奈人生安全网
图1. Nt!PspInsertThread – 在挪用注册的回调曩昔初始化CreateInfo.ImageFileName和CreateInfo.FileOpenNameAvailable
看起来微软像是留意到了这个成绩,至多卖力PsSetCreateProcessNotifyRoutineEx的开辟者留意到了。事实上,微软为何至今也没有办理PsSetLoadImageNotifyRoutine的bug仍然让人不解。
用微软的办法(险些精确)
在搜刮更多对于PsSetCreateProcessNotifyRoutineEx的文档的时刻,咱们找到了一篇2007年5月的文档,叫做“支撑Windows Server 2008的内核数据和过滤”,今朝曾经在微软的网站上曾经没有了(这里有援用)。这个文档指明在应用过程创立回调时,驱动能够经由过程过滤治理API获得额定的属性,好比FltGetFileNameINformationUnsafe。
依据这些信息咱们确认FltGetFielNameInformationUnsafe能够供应给咱们最优雅和简略的办理这个bug的计划。应用这个函数能够让咱们不消完成文件体系小过滤驱动就能够办理这个成绩。咱们从PsSetLoadImageNotifyRoutine回调中拿到FILE_OBJECT的办法和从PsSetCreateProcessNotifyRoutineEx回调中异常相似,所以在咱们的成绩中它看起来是一个可行的办理计划。
让咱们更宁神的是在某些Windows自己的组件中也应用了这个函数,好比Windows Defender和防火墙。
图2. Windows 10Redstone中Windows Defender(WdFilter.sys)和防火墙的回调
只管未尽明
在加载镜像关照回调中应用FltGetFileNameInformationUnsafe偶然会失败,前往STATUS_OBJECT_NAME_NOT_FOUND。在微软文档中这个差错没记载未这个函数能够的差错。
颠末一些试验,咱们找到能一直重现这个差错状况的精确的变乱序列。FltGetFileNameInformationUnsafe会在必定阶段挪用fltmgr!FltpExpandShortNames,这个是现试验证文件门路能否存在的函数。
图3. Fltmgr!FltGetFileNameINformationUnsafe中Fltmgr!FltpExpandShortNames的回调
成绩是这个验证仅仅是一部分:代码验证门路中一切目次能否存在,然则却疏忽了反省给定门路中文件自己能否存在。是以,咱们如今晓得它给出的差错代码只在文件以后不在他曩昔的目次中才是有用的,咱们至多能够获得到它关上的名字(在给FltGetFileNameInformationUnsafe通报恰当的flag的时刻)。 无奈人生安全网
是以,咱们只要末了一件事必要处置:不论什么时刻FltGetFileNameInformationUnsafe挪用胜利,咱们必要确保拿到的门路是文件现实存在的。另有,咱们必要验证这个文件是和咱们在加载镜像回调中拿到的文件是同一个。
总结
实践上上一篇博客描写的这个Windows内核的bug,具备潜在的风险,用来诱骗依附关照机制供应信息的网安产物。这个缺点看起来来自于一个代码编写差错,从Windows2000最新的Windows10宣布版都邑收到影响。这意味着只要微软修复了这个bug,网安厂商在windows情况中开辟的产物不克不及依附回调关照供应的差错信息。网安厂商必需探求代替的更可托的办法来获得关照机制供应的不可靠信息,盼望能够用到本博客中供应的研讨内容。
copyright 无奈人生