BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Marshal.ReleaseComObject存安全隐患

| 作者 Abel Avram 关注 7 他的粉丝 ,译者 王波 关注 0 他的粉丝 发布于 2010年4月5日. 估计阅读时间: 4 分钟 | GMTC大前端的下一站,PWA、Web框架、Node等最新最热的大前端话题邀你一起共同探讨。

Visual Studio团队版首席开发工程师Paul Harrington撰文指出,在调用Marshal.ReleaseComObject()方法处理来自托管代码的COM对象时,会产生安全隐患并建议大家不要使用该函数。 Harrington使用Marshal.ReleaseComObject方法把Visual2010部分组件、Windows管理器、命令行栏和文本编辑器由本地代码转换成托管代码时发现了该问题。 VS 2005和2008已用本地代码编写这些组件,他们过去也能正常运行,直到把它们转换为托管代码时才出现问题。

在托管代码要使用COM功能时,它会通过COM Interop来完成。在调用COM对象的时候,CLR返回封装在运行时可调用封装器(RCW)中的对象,它服从托管对象规则和垃圾回收规则(GC)。这表示在GC决定要清理时,就会释放RCW。如果应用程序使用的资源不多,那么GC可能很迟都不会进行清理工作,甚至要到应用程序关闭才会采取行动。在那段时间内,RCW也许会占用一个待处理的庞大COM对象,如果应用程序关闭且GC还没运行的话,该漏洞就会存在风险。

要避免遗留未处理的COM对象,COM Interop已提供Marshal.ReleaseComObject方法,它降低RCW引用计数器的使用次数,该计算器用于计算有多少客户调用该对象。该方法返回引用次数的新值,该值“在运行时可调用封装器对封装的COM对象仅剩一个引用时通常为零,而不管当前托管客户端正调用它的次数”。与此同时,COM对象消耗的底层资源也因此释放。

这个机制在Visual Studio之前的版本非常奏效,Visual Studio可多次调用Marshal.ReleaseComObject。 但是某些控件被重写为托管代码时却发生变化。为了保持与其余代码的兼容性,新组件经由COM可调用封装器通过Interop层进行访问。所以,调用器会认为自己正处理本地COM对象,而事实上它正使用托管对象。一切运行正常,直到调用Marshal.ReleaseComObject函数,它最初是用于释放COM资源的。运行时会抛出ArgumentException异常,提示信息为“该对象的类型必须是__ComObject或继承至__ComObject”。问题在于要释放的是COM对象而非托管对象。
 
使用Marshal.ReleaseComObject还会产生另一个问题。调用该方法后,一般会释放COM资源并通常返回零。那表示COM对象由RCW封装器释放。如果其它客户要调用同样的COM对象,他就会得到InvalidComObjectException异常,提示信息为“COM对象已从底层RCW中分离,不能使用”,这是由于缓存的RCW对象未被垃圾回收。那么,程序员必须确保特定的COM对象对Marshal.ReleaseComObject的调用不再被使用。
 
要在VS2010团队版中解决该问题必须禁用Marshal.ReleaseComObject。他们还为此编写了VS2005和VS2008的托管包的框架修订版,以便在加载VS2010的时候不再遇到ReleaseComObject的问题。在使用VS 2010出现问题的时候,你会看到这些修订版在Microsoft.VisualStudio.Shell和Microsoft.VisualStudio.Shell.9.0.中绑定devenv.exe.config文件,这也许会普遍出现在使用COM Interop对象的项目当中。
 

查看英文原文:Marshal.ReleaseComObject Is Considered Dangerous
 

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT