【问题标题】:Can a check on the FullName property of an assembly be defeated? Can a similar check be performed without the use of strong naming?可以否决对程序集的 FullName 属性的检查?可以在不使用强命名的情况下执行类似的检查吗?
【发布时间】:2015-12-02 17:12:31
【问题描述】:

我的公司最近收购了另一家公司,我们目前正在研究制作新收购的常规版本之一的问题。该产品是第三方软件产品的插件;该插件提供的功能(查询有价值的数据集的能力)也通过专用应用程序提供,该应用程序是新收购的另一个版本。

在与专用应用程序共享的代码中,我们要求调用我们的代码的程序集必须使用我们的证书进行签名,以防止从应用程序中大量提取数据。这是通过检查程序集的 FullName 中的公钥是否具有正确的值(我们证书的公钥的字符串表示)来完成的。我对与安全相关的问题没有很好的理解,但我看到许多资源特别不鼓励出于安全目的使用“强命名”,这让我有理由担心这可能不是一个有意义的安全措施。

在插件中,功能通过插件类公开,该类继承自宿主应用程序开发人员提供的 DLL 中定义的基类。 (用于主机/插件系统的框架是 .net 标准库中 System.AddIn 命名空间中的东西;插件作为单独的进程运行。)不幸的是,这些 DLL 没有由主机的开发人员签名。因此,我们无法签署我们的插件,并且我们的安全检查将阻止插件工作,除非它被签署。 (我们被告知主机应用程序可执行文件已签名。)

对调用程序集的 FullName 属性中包含的公钥的检查是否真的完成了任何事情?如果他们想破解我们的应用程序,有人可以恶搞它吗?如果它确实完成了某些事情(如果它使得欺骗调用程序集的签名变得不可行)那么我们如何才能绕过我们无法签署我们的 DLL 的事实呢?也就是说,我们如何才能让我们的插件在宿主应用程序中工作,同时控制我们的代码如何执行?将用于签署主机应用程序的公钥“列入白名单”是不够的,因为它作为一个单独的进程运行。

据信以前版本的软件已禁用此检查,但显然这是不可取的;要么检查没有增加价值,我们应该在任何地方删除它,或者它确实增加了价值,我们不希望将它从任何东西中删除。

【问题讨论】:

    标签: c# security .net-assembly signing


    【解决方案1】:

    如果您正在验证强名称与您期望的名称匹配(包括公共签名),那么您正在验证它没有被篡改。

    也就是说,您正在验证程序集是您所期望的,但是除非您确切知道该程序集在做什么,否则您不应该相信它。

    只要私钥保持安全,这就是正确的。如果这在任何时候被泄露,那么攻击者可能会使用它来签署另一个程序集。

    请参阅this answer 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 2022-06-27
      相关资源
      最近更新 更多