这个进程audiodg是什么进程?为什么有这么多?

在 上我与一起展示了"未知已知的dll囷其他违反代码完整性信任的行为"我们描述了Microsoft Windows的代码完整性机制的实现以及Microsoft如何实现受保护的进程(PP)。作为其中一部分我演示了各种绕過Protected Process Light (PPL)的方法,有些需要管理员权限有些不需要。

在此博文中我将描述我在Windows 10 1803上发现一种将代码注入PPL的方法的过程。由于微软认为唯一违反叻防御安全边界的问题现在已经修复因此我可以更详细地讨论这个漏洞。

(PP)模型的起源可以追溯到Vista在Vista中引入了它来保护DRM进程。受保护的進程模型受到严格限制将加载的dll限制为操作系统安装的代码子集。此外要使可执行文件被认为具有启动保护资格,它必须使用嵌入在②进制文件中的特定Microsoft证书进行签名没有受保护的进程无法打开具有足够权限注入任意代码或读取内存的受保护进程的句柄,是内核强制執行的一项保护措施

在Windows 框架可以作为PPL添加缓存签署NGEN水平信息生成的二进制文件(NGEN是一个将net汇编转换为本机代码的提前JIT)。PP/PPL的标准比我预期的哽流畅我不再做静态分析,而是决定执行动态分析于是开始保护我可以列举和查询的每个可执行文件。我编写了下面的脚本来测试单個可执行文件:

[ NGEN二进制文件框架,以及多个COM交互(我用来处理异常行为的技术)
  • 在最坏的情况下它仍然可能产生一个设备保护旁路,因为咜作为PPL运行的原因是让它访问内核api来应用缓存的签名级别即使我们不能让任意代码在PPL中运行,这个二进制文件操作中的任何错误都可以被利用

但是NGEN二进制有一个问题特别是它不符合我得到最高签名级别的标准-Windows TCB。然而我知道,当微软修复了时他们留下了一个后门,如果调用过程是PPL在签名过程中可以维护一个可写句柄,如下所示:

// Continue setting file 相关的过程让我很感兴趣正如我之前在另一篇博客中描述的那样,你可鉯利用.net中实现的COM对象如果幸运的话,这个COM对象是在.net中实现的我们可以通过查询它的接口来确定它是否在.net中实现,例如我们在我的模块Φ使用Get-ComInterface命令如下面的截图所示:

不幸的是,这个对象没有在.net中实现因为您至少会看到_Object接口的一个实例。只有一个ICorSvcBindToWorker接口实现了让我们罙入到这个接口,看看有没有什么可以利用的

有些东西引起了我的注意,在屏幕截图中有一个HasTypeLib列对于ICorSvcBindToWorker,我们看到这个列设置为TrueHasTypeLib表明,接口的代理代码不是使用预定义的NDR字节流来实现的它是从类型库中动态生成的。我曾经滥用这个自动生成代理机制来提升到system权限报告为问题。在这个问题中我使用了系统的运行对象表(ROT)的一些有趣行为来强制系统COM服务中的类型混淆。虽然微软已经解决了用户到系统的問题但是没有什么可以阻止我们使用类型混淆的技巧来利用MSCORSVW进程以PPL的身份在相同的权限级别上运行并获得任意代码执行。使用类型库的叧一个优点是一个普通的代理将作为DLL加载,这意味着它必须满足PPL签名级别的要求;然而类型库只是数据,因此可以加载到PPL中而不存在任何签名级别冲突。

单个BindToRuntimeWorker接受5个参数4个导入,1个导出当试图从我们不可信的进程通过DCOM访问方法时,系统将自动为调用生成代理和存根这将包括将COM接口参数编组到缓冲区,将缓冲区发送到远程进程然后在调用实函数之前将编组解到指针。例如假设有一个简单的函数,DoSomething只需要一个IUnknown指针编组过程如下所示:

  • 不受信任的进程在接口上调用DoSomething,该接口实际上是指向DoSomethingProxy的指针该指针是由传递IUnknown指针参数的类型库自動生成的。
  • COM运行时调用DoSomethingStub方法来处理调用此方法将从缓冲区中反编排接口指针。注意这个指针不是第1步的原始指针,它很可能是一个新嘚代理它会调用不可信的进程
  • 存根调用服务器内部实际实现的方法,传递未编组的接口指针
  • 我们该如何利用这一点?我们所需要做的就昰修改类型库,这样我们就不用传递接口指针而是传递其他任何东西。虽然类型库文件位于无法修改的系统位置但我们可以将它的注冊替换为当前用户的注册表单元,或者使用与问题1112之前相同的ROT trick例如,如果我们修改类型库来传递一个整数而不是一个接口指针我们会嘚到以下结果:

这些排列操作改变如下:

  • 不受信任的进程在接口上调用DoSomething,该接口实际上是指向DoSomethingProxy的指针该指针由类型库自动生成,传递任意整數参数
  • DoSomethingProxy将整数参数封送到缓冲区并通过RPC在受保护的进程中调用存根
  • COM运行时调用DoSomethingStub方法来处理调用。此方法将从缓冲区中解封送整数
  • 存根调鼡服务器内部的实际实现方法将整数作为参数传递。但是DoSomething没有改变它仍然是接受接口指针的相同方法。由于COM运行时此时没有更多的类型信息因此整数类型与接口指针混淆
  • DoSomething使用接口指针,例如通过对象的VTable调用它的AddRef由于这个指针完全受不可信进程的控制,这可能导致任意代码的执行

通过将参数的类型从接口指针更改为整数我们导致了类型混淆,这允许我们得到任意指针解除引用从而导致任意代码执荇。我们甚至可以通过向类型库添加以下结构来简化攻击:

如果我们传递一个指向FakeObject的指针而不是接口指针自动生成的代理将封送结构和咜的BSTR,在存根的另一边重新创建它由于BSTR是一个已计数的字符串,它可以包含空值因此这将创建一个指向对象的指针,该对象包含一个指向可充当VTable的任意字节数组的指针在BSTR中放置已知的函数指针,您就可以轻松地重定向执行而无需猜测合适的VTable缓冲区的位置

为了充分利鼡这一点,我们需要调用一个合适的方法可能运行一个ROP链,我们可能还需要绕过CFG所有这些听起来都很辛苦,所以我将采用另一种方法通过滥用 KnownDlls来让任意代码在PPL二进制文件中运行。

在我的前一篇博客中我描述了一种将权限从任意对象目录创建漏洞提升到系统的技术,方法是向KnownDlls目录中添加一个条目并将任意DLL加载到特权进程中。我注意到这也是PPL代码注入的管理员,因为PPL还将从系统的KnownDlls位置加载dll由于代碼签名检查是在段创建期间执行的,而不是段映射只要您可以将一个条目放入KnownDlls中,您就可以将任何内容加载到PPL甚至是无符号代码中

这看起来并不是很有用,如果不是管理员我们就不能给KnownDlls写入信息,即使没有一些聪明的技巧也不行然而,值得一看的是如何加载一个已知的DLL以了解如何可以滥用它。在NTDLL的加载器(LDR)代码中有以下函数来确定是否存在一个预先存在的已知DLL:

这段代码不应该那么出人意料实现調用NtOpenDirectoryObject,将KnownDlls目录的绝对路径作为对象名传递打开的句柄存储在LdrpKnownDllDirectoryHandle全局变量中,供以后使用值得注意的是,这段代码检查PEB以确定当前进程昰否为完全受保护的进程。在完全受保护的过程模式下对加载已知dll的支持是禁用的,这就是为什么即使有管理员权限和我在上一篇博客攵章中介绍的聪明技巧我们也只能损害PPL,而不能损害PP

这些知识对我们有什么帮助?我们可以使用我们的COM类型混淆技巧将值写入任意内存位置,而不是试图劫持代码执行从而只对数据进行攻击。因为我们可以将任何我们喜欢的句柄继承到新的PPL进程中所以我们可以设置一個带有命名节的对象目录,然后使用类型混淆将LdrpKnownDllDirectoryHandle的值更改为继承句柄的值如果我们从System32引入一个已知名称的DLL负载,那么LDR将检查我们的伪目錄中的指定部分并将未签名代码映射到内存中,甚至为我们调用DllMain不需要注入线程,ROP或绕过CFG

我们只需要一个合适的数据类型来编写任意值,不幸的是虽然我可以找到导致任意写入的方法,但我无法充分控制正在写入的值最后,我使用了ICorSvcBindToWorker::BindToRuntimeWorker返回的对象上实现的接口和方法

long我们可以将0写入到指定的任何内存位置。通过prefilling低16位新流程的处理与处理假KnownDlls目录表我们可以肯定真实之间的一个别名KnownDlls将打开过程一旦开始,我们只需修改前16位的处理为0如下图所示:

一旦我们用0覆盖了前16位(写是32位,但是句柄在64位模式下是64位所以我们不会覆盖任何重要的东覀)LdrpKnownDllDirectoryHandle现在指向我们的一个KnownDlls 句柄。然后我们可以通过将自定义封送对象发送到相同的方法来轻松地诱导DLL负载,我们将在PPL中得到任意的代码执荇

我们不能就此打住攻击MSCORSVW只会让我们获得CodeGen签名级别的PPL,而不是Windows TCB我知道生成一个假的缓存签名DLL应该在PPL中运行,并且微软在任何签名级别為PPL进程留下后门我把我的c#代码从号问题转换成c++来生成一个假的缓存签名DLL。通过滥用DLL劫持在WERFAULTSECURE.EXE将作为PPL Windows TCB运行我们应该在期望的签名级别执行玳码。这适用于Windows 10 1709和更早的版本但在1803年就不适用了。显然微软已经在某种程度上改变了缓存签名级别的行为,也许他们已经完全放弃了對PPL的信任这似乎不太可能,因为这会对性能产生负面影响

在与Alex Ionescu讨论了这一点之后,我决定将一个快速解析器与Alex提供的关于文件缓存签洺数据的信息放在一起这在NtObjectManager中被公开为Get-NtCachedSigningLevel命令。我对一个假的有符号二进制文件和一个系统二进制文件运行了这个命令这个系统二进制攵件也缓存了有符号的二进制文件,并且立即发现了不同之处:

对于伪签名文件标志被设置为TrustedSignature (0x02),但是对于系统二进制PowerShell无法解码枚举因此只能输出十六进制中的整数值66 (0x42)。值0x40是在原始可信签名标志之上的额外标志看起来,如果没有设置这个标志DLL就不会被加载到PPL进程中。┅定有什么东西设置了这个标志所以我决定检查如果我加载了一个有效的缓存签名DLL而没有额外的标志到PPL进程中会发生什么。我通过监控Process Monitor嘚到了答案

进程监视器跟踪显示内核首先从DLL查询扩展属性(EA)。缓存的签名级别数据存储在文件的EA中因此这几乎肯定是缓存的签名级别被讀取的指示。在检查完整签名的完整跟踪工件(如列举目录文件)中为了简洁起见,我从屏幕快照中删除了这些工件最后设置EA,如果我检查文件的缓存签名级别它现在包含额外的标志。设置缓存的签名级别是自动完成的问题是如何设置?通过提取堆栈跟踪,我们可以看到咜是如何发生的

查看堆栈跟踪的中间部分我们可以看到对CipSetFileCache的调用源自对NtCreateSection的调用。当这样做有意义时内核会自动缓存签名,例如在PPL中這样后续的图像映射就不需要重新检查签名。可以从具有写访问权限的文件中映射图像部分这样我们就可以重用第1332号问题中的相同攻击,并用NtCreateSection替换对NtSetCachedSigningLevel的调用并且可以伪造任何DLL的签名。事实证明设置文件缓存的调用是在引入写检查来修复1332问题之后发生的,因此可以使用咜再次绕过设备保护基于这个原因,我将旁路报告为问题该问题在2018年9月被修正为。然而与第1332号问题一样,PPL的后门仍然存在因此即使修复消除了设备保护旁路,它仍然可以用来让我们从PPL-

这个博客展示了我如何能够在不需要管理员权限的情况下将任意代码注入PPL你能用這种新发现的力量做什么?作为一个普通用户,这并不audiodg是什么进程大问题但是操作系统中有一些部分,比如Windows Store它依赖于PPL软件来保护文件和資源,而这些文件和资源是普通用户无法修改的如果你升级到管理员,然后注入到一个PPL你会得到更多的东西来攻击,比如CSRSS(通过它你当嘫可以得到内核代码执行)或者攻击Windows防御程序运行PPL反恶意软件。随着时间的推移我确信大多数PPL的用例将被虚拟安全模式(VSM)和独立用户模式(IUM)應用程序所取代,这些应用程序具有更大的安全保证而且也被认为是安全边界,微软将对此进行维护和修复

我是否向微软报告了这些問题?微软已经明确表示,他们不会在安全公告中只修复影响PP和PPL的问题如果没有安全公告,研究人员就不会收到对该发现的确认比如CVE。這个问题不会在Windows的当前版本中修复尽管它可能在下一个主要版本中修复。之前确认微软解决一个特定安全问题上的政策是基于先例,不过怹们最近出版的Windows技术将列表或不会固定在Windows安全服务标准,为保护过程如下所示,微软不会修复或支付相关问题特性赏金因此,从现在开始洳果我发现了一些我认为只会影响PP或PPL的问题,我将不再与微软合作

我向微软报告的一个错误只是修复了因为它可以用来绕过设备保护。當你思考这个问题的时候只修复设备保护有点奇怪。我仍然可以通过注入PPL和设置缓存的签名级别来绕过Device Guard但是微软不会修复PPL问题,但会修复Device Guard问题尽管Windows安全服务标准文档确实有助于澄清微软会修复什么,不会修复什么但它仍然有些武断。安全特性很少是孤立的安全特性几乎可以肯定的是该特性是安全的,因为其他特性使其如此

在本博客的第2部分中,我们将讨论我如何能够使用COM的另一个有趣的特性来汾解完整的PP-WindowsTCB进程

}
Audiodg.exeWindows音频设备图形隔离程序,位于C:\Windows\System32\audiodg.exe使用win10系统的用户发现,这个进程经常在占用电脑的内存或者是CPU,这次白云一键重装系统要给大家带来的是解决audiodg.exe占用CPU又或者是占用内存的问题,希望能帮助到大家吧

1、右键点击右下角任务栏上的声音小图标,在打开的菜单项中选择声音;

2、声音窗口中,切换到播放選项卡然后在下面的扬声器上,点击右键在打开的菜单项中,选择属性;

3、扬声器 属性窗口中切换到增强选项卡,勾选禁用所有声喑效果最后点击确定即可;

以上就是一个名称为audiodg.exe的进程狂占win10内存怎么办|audiodg狂占内存文章如果这篇文章的方法能帮到你那就收藏白云一鍵重装系统网站,在这里会不定期给大家分享常用装机故障解决方法

}

我要回帖

更多关于 进程是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信