如何针对其他应用程序/ COM对象验证Windows应用程序

时间:2010-08-16 19:06:42

标签: security authentication com windows-7

我的系统中有3个组件:

  1. COM对象 - 为具有 func1(),func2()
  2. 的应用程序提供服务
  3. App1 - 需要使用com对象funcs(1和2)的受信任应用程序
  4. App2 - 恶意应用程序,未授权使用func1(),可以使用 func2()它无害。
  5. COM对象如何“验证” App1 并允许它使用 func1() func2()< / em>并拒绝从 App2 访问 func1()

    执行此操作的一种方法是仅允许管理员用户访问 func1(),但由于安全性最佳做法,这不是一个好的解决方案:使用权限最低的用户运行。 App1 只需要管理员访问COM对象, App1 中的任何安全漏洞都会为攻击者提供管理员访问权限。

    如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

一般来说,您应该更准确地定义如何您想要分配(识别)允许从其他“坏”应用程序使用COM对象的“好”应用程序。

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

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

答案 1 :(得分: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对象。

答案 2 :(得分:0)

Windows安全性是基于用户的,因此我不相信您能够在应用程序级别执行此操作。如果用户可以执行该功能,则两个程序都能够执行该功能。