在2024年10月,有境外APT组织在github上发布恶意Visual Studio代码,针对我国网络安全领域的研究者进行攻击,其具体时间线和更多细节可以参考微步在线研究响应中心的文章:
https://mp.weixin.qq.com/s/ih36z93y6BazatjeoGjp1A
本文援引这次投毒事件并不是为了分析其用到的漏洞的技术细节,而是在于这个漏洞的另一个有趣特性——微软不认为这是一个漏洞:
https://www.theregister.com/2023/10/13/fresh_visual_studio_rce_exploit/
该漏洞在过去也没有引起太大的关注,相信绝大部分师傅也是在这段时间才普遍认识到这个漏洞对于开发者和安全研究人员的威胁。正是这种信息差给了境外APT组织有机可乘的空间。且由于微软并不打算修复这种漏洞(仅仅只是添加“可信位置”机制,且不是默认开启,有种掩耳盗铃的感觉),因此在可预见的未来,这个漏洞还会不断用来拷打安全意识不太好的师傅们。
于是,大家可能难免会担忧。如果下一次攻击者用了别的漏洞呢?Visual Studio还有没有别的类似的安全问题呢?除了通过.sln文件触发,还有没有可能通过别的文件触发?这也就引出了本文的主题,在去年12月初,笔者也曾发现过一个类似的问题,它无需点击.sln触发,而是通过打开aspx/asmx/ashx等ASP.NET相关文件触发(也可以做成拖拽文件夹触发或点击.sln触发的变种),对于国内的WEB开发者、WEB安全研究人员以及红队危害更大。后文会涉及到这个漏洞在多个场景下的利用方法,以及对其原理进行分析。如果只是想看看笔者的漏洞能实现什么效果,可以直接拉到第三部分,绝对有趣。
2.漏洞成因
如果要挖掘一个漏洞,那么可以先从目标以前曾经出现过的类似漏洞开始研究。在以前,我们介绍过resx的反序列化安全问题。在查阅相关资料的时候,我注意到Visual Studio曾经出现过一个漏洞,那就是在用Visual Studio直接打开.resx文件的时候,会直接触发反序列化漏洞,算是一个1click恶意代码执行,并且与后来的各种VS的1click代码执行、命令执行被忽略的命运不同的是,这个问题被Visual Studio处理过了,现在直接打开.resx文件什么事情都不会发生
继续了解,发现Visual Studio与resx文件的爱恨情仇其实也不止于此,参考.NET安全矩阵相关的内容:
https://mp.weixin.qq.com/s/bfWCOn2PAxeK-CvlIijv-w
虽然打开.resx直接触发恶意代码执行的漏洞被修复了,但是,通过构造WindowsForms项目,并引入恶意的resx文件,在打开这个项目的时候,依然会触发反序列化
不过上述漏洞的触发都比较依赖开发者打开.sln文件,在经过这段时间的风波后,相信大家也不会随便打开.sln文件了。但是,从上面的种种信息中,我们可以看出,这个.resx文件其实还是非常关键的,就数它导致的Visual Studio 1click RCE最多(包括本文的漏洞),因此我们可以把它作为一个关键点去看。那么.resx文件又为何会导致这种问题呢?在本公众号之前的文章中分析过resx反序列化的问题,以及要如何去构造一个恶意resx文件:
https://mp.weixin.qq.com/s/uACjJfdKu4EmbLeM_chdHA
简单来说,ResXResourceReader()在处理resx文件内容时,会获取data节点的mimetype,决定后续反序列化行为使用的Formatter
例如我们下面的恶意resx文件的mimetype就符合ResXResourceWriter.BinSerializedObjectMimeType的值
这个exe中的逻辑导致了1click本地代码执行,注意调用栈中有一个方法:
System.Web.dll!System.Web.Compilation.BuildManager.CompileResourcesDirectory()
从名字来看,这个方法就和Resources文件以及Resources相关文件夹有关,我们跟进查看这个方法:
这里就看到一个熟悉的关键词App_GlobalResources,也即我们前面提到过的一个特殊文件夹,这也就意味着Microsoft.VisualStudio.Web.Host.exe的执行流程中,也要对这个文件夹进行一些操作?这里还有一个特殊的属性
ResourcesDirectoryVirtualPath
这个看名字就可以猜到和Resources路径有关,这里传入CompileCodeDirectory()方法,跟进:
又进入CodeDirectoryCompiler.GetCodeDirectoryAssembly(),然后这中间又经过几层调用,直接来看到GenerateCode()方法
这里会获取到一些和Resources有关的文件的信息,然后GetResourceReader()方法获取到ResXResourceReader()类的对象,一并传入GenerateResourceFile()方法
再跟进GenerateResourceFile()方法,前面应该是在读取相关恶意文件的内容
接着就是漏洞的触发点:
注意这里对reader变量调用foreach()进行遍历,foreach()会触发ResXResourceReader类中的GetEnumerator()方法调用,最终一路执行到GenerateObjectFromDataNodeInfo(),其中存在BinaryFormatter反序列化操作,触发漏洞。
这里先放一个最终的调用栈,看这个拖动条的长度可以看出这个漏洞还是有点点复杂的。接下来我们要探寻两个问题。第一,Microsoft.VisualStudio.Web.Host.exe文件在什么条件下会被调用。第二,需要满足什么条件,才能让这个文件运行到上文的恶意逻辑
这里就不卖关子了,直接来到漏洞利用。
3.漏洞利用
我们需要构建下面这个结构的文件夹来进行后续的漏洞利用:
C:USERSXXXXDESKTOPTESTGZWEBAPPLICATION6
| About.aspx //一个用于触发漏洞的aspx/asmx/ashx文件,内容是什么不重要
| Web.config //一个web.config文件,在VS中新建WebForms项目即可得到
|
+---App_GlobalResources
| test.resx //恶意resx文件,其中存放序列化payload,具体内容详见往期文章
|
---bin
Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll //触发流程所需的依赖,在VS中新建WebForms项目即可得到
需要两个文件夹,四个文件。其中一个bin目录,存放导致该问题的Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll。一个App_GlobalResources,用于存放恶意resx文件。一个.aspx文件,用于触发漏洞。一个Web.config文件,告诉Visual Studio这是一个web项目。只需要这样简单的文件组合即可,这甚至都不能算Visual Studio项目,只是一些文件被恰到好处的放在了一起。而当你在上面这种目录结构中打开ASP.NET相关的文件的时候,Visual Studio会自动调用Microsoft.VisualStudio.Web.Host.exe文件,并走到上文分析过的resx反序列化点,加载恶意resx文件并触发反序列化。那么,它又能实现什么效果呢?请看VCR。
①通过点击aspx/ashx/asmx等ASP.NET后缀文件触发漏洞
与各位先辈的VS 1click漏洞不同,这个漏洞并不需要通过点击.sln文件触发。上述恶意代码实现的第一个效果就是,当你双击打开aspx/ashx/asmx等ASP.NET相关的文件时,就会触发反序列化。
这里我们演示一下,下图可以看出,在这个恶意目录下使用Visual Studio打开aspx/ashx/asmx文件,会直接触发漏洞。由于Visual Studio会自动关联aspx/asmx文件,因此用户只需要双击这些文件就可以打开
前文介绍过,上述我们构建的文件结构甚至都不能算是一个Visual Studio项目,所以它可以很大程度上伪装成普通的WEB源码,或者是把上述结构夹杂在正常的WEB代码里等待受害者触发。我承认读者现在可能对Visual Studio的项目有所警惕,但假如它都不是一个Visual Studio的项目呢?因此其第一个应用场景就是用来攻击.NET WEB开发者和.NET WEB安全研究人员,以及反制红队。假设你某一天水群的时候,看见有人在传播某某系统的源码,想下载回来审计一下,然后使用Visual Studio打开了aspx文件。再比如在一场攻防演练中,你找到目标网站的www.zip泄露,然后用Visual Studio打开了其中的的源码。上述这些行为都会导致你的主机沦陷。
②通过将恶意文件夹拖拽到Visual Studio中触发
现在读者可能会想,如果我不点击这些乱七八糟的文件呢?你还有办法攻击我吗?实际上上面这种姿势也不止局限于点击.aspx等文件才能触发。如果你把上述恶意目录拖到Visual Studio里打开,也一样能触发,例如下面这样:
或者
这个姿势还可以演变出一个变种,那就是我隐藏.aspx和web.config文件,保留.cs文件,让开发者认为这就是一个普通的Visual Studio的源码,降低警惕性:
如上图,在隐藏aspx和web.config文件的情况下,把SimpleWebApplication6这个目录拖拽到Visual Studio中,也一样可以触发漏洞。这个变种攻击方法可以用来攻击普通的开发者。
③借助sln文件触发
与各位先辈们一样的是,上述流程也可以借助sln文件触发。因为sln文件有一个好玩的特性,就是你通过sln打开一个项目,然后在这个项目里打开一个文件,然后直接关闭Visual Studio。实际上Visual Studio会保存你的打开状态,等我们下一次用sln打开项目的时候,会还原你上一次关闭前的状态。因此可以利用这个小特性去保存.aspx文件的打开状态,当用户点击.sln文件后,重新打开.aspx文件,触发漏洞流程。
这里我随便创建一个sln文件,先打开这个sln文件:
然后把aspx文件拖拽到项目里打开,这里会触发一次漏洞
然后我们直接关闭Visual Studio。待这个.vs目录生成后,我们的恶意项目也制作完成了
我们可以把这个恶意项目打包发给受害者,当受害者打开sln文件,恶意流程再次触发:
这个方法也可以用来攻击普通开发者。
综上,上述漏洞有三种不同的攻击方式,分别适用于一些不同的场景:
①点击aspx/ashx/asmx等文件触发:可用于攻击.NET WEB开发者、安全研究人员,还可用于投毒或反制红队
②拖拽文件夹触发:除了攻击.NET WEB开发者和安全研究人员,还可以用来攻击使用Visual Studio的其他领域的开发者
③点击.sln文件触发:除了攻击.NET WEB开发者和安全研究人员,还可以用来攻击使用Visual Studio的其他领域的开发者
为了保(避)护(免)同(铁)行(拳),上述项目的demo暂时不会公开,不过本文也分析的比较详细了,对.NET安全稍有了解的师傅应该很容易能复现出来,至于更加武器化的利用嘛,参考近期APT组织的手法咯。
4.悬于开发者头顶的剑
很遗憾,这个漏洞也和它的前辈们一样不被微软承认,微软对VS新增了一个“信任位置”的机制来缓解这类1click RCE漏洞,该机制并非默认开启。
这里选择始终需要信任判定。配置完后重启Visual Studio,这样,当你打开任何Visual Studio相关的文件时,会看到这样的提示:
不过,在我看来这个机制有掩耳盗铃的嫌疑,既然我都决定要打开相关源码了,那么说明我已经信任它了,再多加一个弹窗让用户确认又有什么用呢?和“请确认你是否年满18岁”是一个性质嘛。此外,即使是安全行业的从业者,也是在经历近期的钓鱼事件后才对来源不明的Visual Studio项目提高警惕,更何况是普通开发者呢?就以本文提到的安全问题为例,其有多种触发方式,还可以很好地伪装成正常的Visual Studio项目,可以分别针对不同类别的计算机领域从业者进行攻击,在本文没有发布之前,如果笔者在各大平台或群聊发布恶意源码,相信也会有很多师傅中招。因此,请务必保持对任何Visual Studio文件的警惕,谁也不知道下一波攻击事件何时来到,谁也不知道下一次到底是用sln文件还是其它文件触发。由于微软不再修复这类漏洞,它们也将成为一柄永远悬于开发者头顶的达摩克里斯之剑。
综上,我呼吁大家对一切Visual Studio相关的源码或文件保持警惕,尤其是一些从群聊中拿到的源码或者是从小众冷门github项目中拿到的源码。如果非要打开,建议清理.vs目录并排查所有.resx和.resources文件的内容。如果条件允许,最好在虚拟机中对项目进行查看和分析,避免攻击者利用其它类型的1click漏洞进行攻击。
5.参考和附录
参考:
https://mp.weixin.qq.com/s/ih36z93y6BazatjeoGjp1A
https://www.theregister.com/2023/10/13/fresh_visual_studio_rce_exploit/
https://mp.weixin.qq.com/s/bfWCOn2PAxeK-CvlIijv-w
https://mp.weixin.qq.com/s/uACjJfdKu4EmbLeM_chdHA
附录(本文提到的漏洞的完整调用栈):
> mscorlib.dll!System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(System.IO.Stream serializationStream) (IL=prolog, Native=0x00007FF99C6F86D0+0x0)
System.Windows.Forms.dll!System.Resources.ResXDataNode.GenerateObjectFromDataNodeInfo(System.Resources.DataNodeInfo dataNodeInfo, System.ComponentModel.Design.ITypeResolutionService typeResolver) (IL≈0x00C8, Native=0x00007FF93F5ECD60+0x313)
System.Windows.Forms.dll!System.Resources.ResXDataNode.GetValue(System.ComponentModel.Design.ITypeResolutionService typeResolver) (IL≈0x00CF, Native=0x00007FF93F5EC900+0x375)
System.Windows.Forms.dll!System.Resources.ResXResourceReader.ParseDataNode(System.Xml.XmlTextReader reader, bool isMetaData) (IL≈0x01C5, Native=0x00007FF93F5EB460+0x6E8)
System.Windows.Forms.dll!System.Resources.ResXResourceReader.ParseXml(System.Xml.XmlTextReader reader) (IL=0x004A, Native=0x00007FF93F5EA580+0x13C)
System.Windows.Forms.dll!System.Resources.ResXResourceReader.EnsureResData() (IL=0x00A1, Native=0x00007FF93F5E9390+0x208)
System.Windows.Forms.dll!System.Resources.ResXResourceReader.GetEnumerator() (IL=0x000D, Native=0x00007FF93F5E9320+0x33)
System.Web.dll!System.Web.Compilation.BaseResourcesBuildProvider.GenerateResourceFile(System.Web.Compilation.AssemblyBuilder assemblyBuilder, System.Resources.IResourceReader reader) (IL≈0x00DC, Native=0x00007FF93F5E8790+0x294)
System.Web.dll!System.Web.Compilation.BaseResourcesBuildProvider.GenerateCode(System.Web.Compilation.AssemblyBuilder assemblyBuilder) (IL=0x007E, Native=0x00007FF93F5E75F0+0x1FB)
System.Web.dll!System.Web.Compilation.AssemblyBuilder.AddBuildProvider(System.Web.Compilation.BuildProvider buildProvider) (IL=0x005F, Native=0x00007FF93F5E6EE0+0x18A)
System.Web.dll!System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders() (IL=0x023F, Native=0x00007FF93F4178A0+0x657)
System.Web.dll!System.Web.Compilation.BuildProvidersCompiler.PerformBuild() (IL=0x0006, Native=0x00007FF93F417320+0x22)
System.Web.dll!System.Web.Compilation.CodeDirectoryCompiler.GetCodeDirectoryAssembly(System.Web.VirtualPath virtualDir, System.Web.Compilation.CodeDirectoryType dirType, string assemblyName, System.Web.Util.StringSet excludedSubdirectories, bool isDirectoryAllowed) (IL≈0x0154, Native=0x00007FF93F40A930+0x345)
System.Web.dll!System.Web.Compilation.BuildManager.CompileCodeDirectory(System.Web.VirtualPath virtualDir, System.Web.Compilation.CodeDirectoryType dirType, string assemblyName, System.Web.Util.StringSet excludedSubdirectories) (IL≈0x003E, Native=0x00007FF93F40B010+0xDB)
System.Web.dll!System.Web.Compilation.BuildManager.CompileResourcesDirectory() (IL≈0x0006, Native=0x00007FF93F40B2A0+0x33)
System.Web.dll!System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() (IL=0x0091, Native=0x00007FF93F40B7B0+0x127)
System.Web.dll!System.Web.Compilation.BuildManagerHost.GenerateCodeCompileUnit(System.Web.VirtualPath virtualPath, string virtualFileString, out System.Type codeDomProviderType, out System.CodeDom.Compiler.CompilerParameters compilerParameters, out System.Collections.IDictionary linePragmasTable) (IL=0x0017, Native=0x00007FF93F40BB20+0x6F)
mscorlib.dll!System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage msg) (IL=???, Native=0x00007FF99D08A280+0x352)
mscorlib.dll!System.Runtime.Remoting.Messaging.ServerObjectTerminatorSink.SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage reqMsg) (IL≈0x0048, Native=0x00007FF99D09AEA0+0xAF)
mscorlib.dll!System.Runtime.Remoting.Messaging.ServerContextTerminatorSink.SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage reqMsg) (IL≈0x004F, Native=0x00007FF99D09AA50+0x120)
mscorlib.dll!System.Runtime.Remoting.Channels.CrossContextChannel.SyncProcessMessageCallback(object[] args) (IL≈0x0059, Native=0x00007FF99D0919A0+0x16A)
mscorlib.dll!System.Runtime.Remoting.Channels.CrossContextChannel.SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage reqMsg) (IL≈0x001F, Native=0x00007FF99D091BC0+0xBD)
mscorlib.dll!System.Runtime.Remoting.Channels.ChannelServices.SyncDispatchMessage(System.Runtime.Remoting.Messaging.IMessage msg) (IL≈0x0042, Native=0x00007FF99D0825D0+0xBA)
mscorlib.dll!System.Runtime.Remoting.Channels.CrossAppDomainSink.DoDispatch(byte[] reqStmBuff, System.Runtime.Remoting.Messaging.SmuggledMethodCallMessage smuggledMcm, out System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage smuggledMrm) (IL≈0x0047, Native=0x00007FF99D092E00+0x146)
mscorlib.dll!System.Runtime.Remoting.Channels.CrossAppDomainSink.DoTransitionDispatchCallback(object[] args) (IL≈0x0016, Native=0x00007FF99D0930A0+0x94)
[AppDomain 转换]
mscorlib.dll!System.Runtime.Remoting.Channels.CrossAppDomainSink.DoTransitionDispatch(byte[] reqStmBuff, System.Runtime.Remoting.Messaging.SmuggledMethodCallMessage smuggledMcm, out System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage smuggledMrm) (IL≈0x0002, Native=0x00007FF99D0931E0+0xA8)
mscorlib.dll!System.Runtime.Remoting.Channels.CrossAppDomainSink.SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage reqMsg) (IL≈0x0057, Native=0x00007FF99D0932E0+0xD2)
mscorlib.dll!System.Runtime.Remoting.Proxies.RemotingProxy.CallProcessMessage(System.Runtime.Remoting.Messaging.IMessageSink ms, System.Runtime.Remoting.Messaging.IMessage reqMsg, System.Runtime.Remoting.Contexts.ArrayWithSize proxySinks, System.Threading.Thread currentThread, System.Runtime.Remoting.Contexts.Context currentContext, bool bSkippingContextChain) (IL≈0x003A, Native=0x00007FF99D0892A0+0xAC)
mscorlib.dll!System.Runtime.Remoting.Proxies.RemotingProxy.InternalInvoke(System.Runtime.Remoting.Messaging.IMethodCallMessage reqMcmMsg, bool useDispatchMessage, int callType) (IL=???, Native=0x00007FF99D0894E0+0x40A)
mscorlib.dll!System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(ref System.Runtime.Remoting.Proxies.MessageData msgData, int type) (IL≈0x0155, Native=0x00007FF99D088940+0x475)
Microsoft.VisualStudio.Web.Host.exe!Microsoft.VisualStudio.Web.Host.RemoteCBMService.GetCompilerParams(string virtualPath, string virtualFileContents, outstring codeDOMProviderName, out System.CodeDom.Compiler.CompilerParameters compilerParams) (IL=0x004E, Native=0x00007FF93EA962B0+0x72)
[轻量级函数]
System.ServiceModel.dll!System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(object instance, object[] inputs, outobject[] outputs) (IL≈0x0222, Native=0x00007FF8F7C9F1C0+0x2D9)
System.ServiceModel.dll!System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(ref System.ServiceModel.Dispatcher.MessageRpc rpc) (IL≈0x00B3, Native=0x00007FF8F7C91D00+0x387)
System.ServiceModel.dll!System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(ref System.ServiceModel.Dispatcher.MessageRpc rpc) (IL=0x0048, Native=0x00007FF8F7C8A350+0xB1)
System.ServiceModel.dll!System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(ref System.ServiceModel.Dispatcher.MessageRpc rpc) (IL=epilog, Native=0x00007FF8F7C89E40+0x14E)
System.ServiceModel.dll!System.ServiceModel.Dispatcher.MessageRpc.Process(bool isOperationContextSet) (IL=0x0065, Native=0x00007FF8F7C90C20+0x133)
System.ServiceModel.dll!System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(System.ServiceModel.Channels.RequestContext request, bool cleanThread, System.ServiceModel.OperationContext currentOperationContext) (IL≈0x0239, Native=0x00007FF8F7C8FE60+0x66F)
System.ServiceModel.dll!System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(System.ServiceModel.Channels.RequestContext request, System.ServiceModel.OperationContext currentOperationContext) (IL≈0x00FE, Native=0x00007FF8F7C88D00+0x21B)
System.ServiceModel.dll!System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(System.IAsyncResult result) (IL≈0x0039, Native=0x00007FF8F7C88670+0x4C)
System.ServiceModel.dll!System.ServiceModel.Dispatcher.ChannelHandler.OnAsyncReceiveComplete(System.IAsyncResult result) (IL=epilog, Native=0x00007FF8F7C86CA0+0x5E)
System.ServiceModel.Internals.dll!System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(System.IAsyncResult result) (IL≈0x0000, Native=0x00007FF987F48740+0x2E)
System.ServiceModel.Internals.dll!System.Runtime.AsyncResult.Complete(bool completedSynchronously) (IL≈0x00C2, Native=0x00007FF987ED7C20+0xF0)
System.ServiceModel.dll!System.ServiceModel.Channels.TransportDuplexSessionChannel.TryReceiveAsyncResult.OnReceive(System.IAsyncResult result) (IL=epilog, Native=0x00007FF8F7C87540+0xB3)
System.ServiceModel.Internals.dll!System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(System.IAsyncResult result) (IL≈0x0000, Native=0x00007FF987F48740+0x2E)
System.ServiceModel.Internals.dll!System.Runtime.AsyncResult.Complete(bool completedSynchronously) (IL≈0x00C2, Native=0x00007FF987ED7C20+0xF0)
System.ServiceModel.dll!System.ServiceModel.Channels.SynchronizedMessageSource.ReceiveAsyncResult.OnReceiveComplete(object state) (IL=epilog, Native=0x00007FF8F7C87A30+0xB8)
System.ServiceModel.dll!System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(object state) (IL=epilog, Native=0x00007FF8F7CA6A30+0x17C)
System.ServiceModel.Internals.dll!System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(System.IAsyncResult result) (IL≈0x0000, Native=0x00007FF987F48740+0x2E)
System.dll!System.Net.LazyAsyncResult.Complete(System.IntPtr userToken) (IL≈0x003E, Native=0x00007FF99A273810+0x56)
System.dll!System.Net.LazyAsyncResult.ProtectedInvokeCallback(object result, System.IntPtr userToken) (IL≈0x0064, Native=0x00007FF99A2736E0+0xCA)
System.dll!System.Net.Security.NegotiateStream.ProcessFrameBody(int readBytes, byte[] buffer, int offset, int count, System.Net.AsyncProtocolRequest asyncRequest) (IL=0x0070, Native=0x00007FF99A7EDFF0+0xCA)
System.dll!System.Net.Security.NegotiateStream.ReadCallback(System.Net.AsyncProtocolRequest asyncRequest) (IL≈0x0048, Native=0x00007FF99A7EE210+0xD4)
System.dll!System.Net.AsyncProtocolRequest.CompleteRequest(int result) (IL=epilog, Native=0x00007FF99A2594D0+0x3E)
System.dll!System.Net.FixedSizeReader.CheckCompletionBeforeNextRead(int bytes) (IL=0x005D, Native=0x00007FF99A259490+0x28)
System.dll!System.Net.FixedSizeReader.ReadCallback(System.IAsyncResult transportResult) (IL≈0x001C, Native=0x00007FF99A2593A0+0x7F)
System.ServiceModel.Internals.dll!System.Runtime.AsyncResult.Complete(bool completedSynchronously) (IL≈0x00C2, Native=0x00007FF987ED7C20+0xF0)
System.ServiceModel.dll!System.ServiceModel.Channels.ConnectionStream.IOAsyncResult.OnAsyncIOComplete(object state) (IL=epilog, Native=0x00007FF8F88B1590+0x7A)
System.ServiceModel.dll!System.ServiceModel.Channels.PipeConnection.OnAsyncReadComplete(bool haveResult, int error, int numBytes) (IL=epilog, Native=0x00007FF8F7CA4340+0x234)
System.ServiceModel.dll!System.ServiceModel.Channels.OverlappedContext.CompleteCallback(uint error, uint numBytes, System.Threading.NativeOverlapped* nativeOverlapped) (IL=epilog, Native=0x00007FF8F7CA4900+0xCA)
System.ServiceModel.Internals.dll!System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(uint error, uint bytesRead, System.Threading.NativeOverlapped* nativeOverlapped) (IL≈0x0005, Native=0x00007FF987ED7530+0x3B)
mscorlib.dll!System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint errorCode, uint numBytes, System.Threading.NativeOverlapped* pOVERLAP) (IL=0x0078, Native=0x00007FF99C6E0D60+0x84)
[本机到托管的转换]
原文始发于微信公众号(HW专项行动小组):27.悬于开发者和安全研究人员头顶的剑 | 一类漏洞让Visual Studio项目变得不再可信
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论