2010-08-16 84 views
1

我在我的系统3个部分组成:如何验证与其他应用程序/ COM对象的Windows应用程序

  1. COM对象 - 提供服务的应用程序,具有FUNC1(),FUNC2()
  2. App1的 - 可信需要使用COM对象funcs中的应用(1和2)
  3. App2的 - 恶意应用,没有被授权使用的func1(),u能se func2()这是没有害的。

如何能在COM对象可以 “认证” 应用1,并允许它使用FUNC1()FUNC2()应用2拒绝FUNC1()访问?

一种方法是通过只允许管理员用户访问func1(),但由于安全最佳实践,这不是一个好的解决方案:以最少特权用户运行。 App1只需要管理员访问COM对象,App1中的任何安全漏洞都会给攻击者Admin访问权限。

这怎么解决?

回答

1

一般而言,您应该更确切地定义如何分配(识别)允许使用来自其他“不良”应用程序的COM对象的“良好”应用程序。

如果你的COM对象是进程内服务器(这将在使用它的应用程序的地址空间中加载的DLL),那么你可以让“快&脏”的解决方案:内的DllMain可以测试加载你的DLL的exe文件的名称。您可以将GetModuleFileNameNULL作为第一个参数。如果一个“错误”的exe文件试图加载你的dll,DllMain可以返回FALSE。您可以使用您的任何方法执行相同的测试,而不是DllMain

解决问题的最佳方法(我所看到的最好的方法)将是添加一个额外的方法到你的COM对象,你可以用它来授权调用者。例如,要使用诸如func1()之类的任何“秘密”功能,您可以要求呼叫方在之前调用另一个authorize()函数。调用者给你的COM对象作为输入参数authorize()一些可用于验证调用者权限的信息。如果授权正常,authorize()将返回一个授权令牌(cookie),该授权令牌可以是您以后可以轻松验证的任何内容。最好的令牌应该基于像digitaly签名这样的密码算法。函数func1()可以有一个附加参数 - 从authorize1()收到的令牌(cookie)。这样你就可以实现你想要的任何类型的授权。这种方式适用于任何类型的COM对象(不仅适用于进程内服务器)。

0

Windows安全性是基于用户的,所以我不相信你可以在应用程序级别这样做。如果用户可以执行该功能,则两个程序都可以执行该功能。

+0

你有什么建议吗我们还能做什么? – Baget 2010-08-19 08:12:17

+0

您将需要依赖用户级权限。也许将你的代码分成2个dll并设置不同的文件级权限。您还可以为您的界面设置注册表权限,以限制谁可以访问它。 – Mike 2010-08-20 17:50:54

1

我认为@quip指的是支持许可的IClassFactory2接口集合。在这里看到:

http://msdn.microsoft.com/en-us/library/ms680095(v=VS.85).aspx

文章每台机器许可证倒是(这是不是你想要的)和这听起来像你所寻找的运行许可证密钥。

问题是,被授权的App1应该调用CoGetClassObject()来获得一个实现IClassFactory2的对象,然后调用IClassFactory2 :: CreateInstanceLic()传递一个秘密密钥,让COM服务器知道它是授权的。这将依次使用适当的标志实例化COM对象,该标志指示可用于完全使用(假设有效的键)。如果传入的密钥无效,请初始化您的COM对象以供未经授权的客户端使用。

未授权的App2将调用标准CoCreateInstance(),该函数在封面下调用CoGetClassObject()以获取实现IClassFactory的对象,然后调用IClassFactory :: CreateInstance()。这个实现应该实例化你的COM对象,为未经授权的客户设置标志。

相关问题