我的公司最近收购了另一家公司,我们目前正在研究制作新收购的常规版本之一的问题。该产品是第三方软件产品的插件;该插件提供了功能(查询有价值的数据集的能力),这也是通过专用应用程序提供的,这是新收购的另一个版本。
在与专用应用程序共享的代码中,我们通过要求调用我们的代码的程序集必须使用我们的证书进行签名来防御从卷中提取的数据。这是通过检查程序集的FullName中的公钥是否具有正确的值(证书的公钥的字符串表示)来完成的。我对安全相关问题没有很好的理解,但我已经看到一些资源特别禁止出于安全目的使用“强命名”,这让我担心这可能不是一个有意义的安全措施。 / p>
在插件中,该功能通过Plugin类公开,该类继承自我们由宿主应用程序开发人员提供的DLL中定义的基类。 (用于主机/插件系统的框架是.net标准库中System.AddIn命名空间中的内容;插件作为单独的进程运行。)不幸的是,这些DLL未由主机的开发人员签名。因此,我们无法签署我们的插件,我们的安全检查将阻止插件工作,除非它已签名。 (我们被告知主机应用程序可执行文件已签名。)
对调用程序集的FullName属性中包含的公钥的检查是否实际完成了任何操作?如果他们想要破解我们的申请,有人会欺骗它吗?如果它实际上确实完成了某些事情(如果它使得欺骗签名调用程序集不可行)那么我们如何解决这个事实,即我们无法签署我们的DLL?也就是说,我们如何让我们的插件在宿主应用程序中工作,同时保持对代码执行方式的控制?仅将用于签署主机应用程序的公钥“列入白名单”是不够的,因为它作为一个单独的进程运行。
该软件的先前版本被认为已禁用此检查,但显然这是不可取的;要么检查没有添加任何值,我们应该在任何地方删除它,或者它确实增加了价值,我们宁愿不从任何东西中删除它。
答案 0 :(得分:0)
如果您确认强名称与您期望的名称相匹配(包括公开签名),那么您将验证它是否未被篡改。
那就是你要验证装配是你所期望的,但是除非你确切知道装配是做什么的,否则你不应该相信它。
只要私钥保持安全,这就成立了。如果这在任何时候都被泄露,那么攻击者就可以使用它来签署另一个程序集。
有关详细信息,请参阅this answer。