我的公司最近接管了另一家公司,我们目前正在研究制作新收购的定期发布之一的问题。该产品是一个第三方软件产品的插件;该插件提供的功能(查询有价值的数据集的能力)也是通过一个专用应用程序提供的,该应用程序是新收购的另一个版本。
在与专用应用程序共享的代码中,我们通过要求调用我们的代码的程序集必须使用我们的证书签名来防御从应用程序中大量提取的数据。这是通过检查程序集的FullName中的公钥是否具有正确的值(我们的证书公钥的字符串表示)来完成的。我不太了解与保安有关的事宜,但我看到很多资源特别不鼓励为保安目的而使用“强命名”,这令我担心这可能不是一项有意义的保安措施。
在插件中,功能是通过一个插件类公开的,这个插件类继承了宿主应用程序的开发人员在DLL中定义的基类。(用于主机/插件系统的框架位于.net标准库的System.AddIn名称空间中;插件作为单独的进程运行。)不幸的是,这些DLL不是由宿主的开发人员签名的。因此,我们无法对插件进行签名,并且我们的安全检查将阻止插件工作,除非它被签名。(我们被告知主机应用程序可执行文件已签名。)
对调用程序集的FullName属性中包含的公钥的检查是否实际完成了什么?如果有人想要破解我们的应用程序,会不会有人对它进行欺骗?如果它确实完成了一些事情(如果它使得欺骗调用程序集的签名变得不可行),那么我们如何才能避免我们不能对DLL签名的事实呢?也就是说,我们如何让我们的插件在宿主应用程序中工作,同时保持对代码如何执行的控制?将用于对主机应用程序进行签名的公钥列入“白名单”是不够的,因为它是作为单独的进程运行的。
该软件的以前版本被认为禁用了此检查,但显然这是不可取的;要么检查没有任何价值,我们应该到处删除它,要么它确实增加了价值,我们不希望从任何东西中删除它。
发布于 2015-12-03 10:09:18
如果您正在验证强名称是否与您期望的名称匹配(包括公共签名),则您正在验证它是否未被篡改。
也就是说,您正在验证程序集是否为您所期望的,但是,除非您确切地知道该程序集在做什么,否则您不应该信任它。
只要私钥一直保持安全,这一点就是正确的。如果这是在任何时候泄漏的,那么攻击者可以使用它来对另一个程序集进行签名。
有关详细信息,请参阅this answer。
https://stackoverflow.com/questions/34048849
复制相似问题