如何验证引用的程序集以检查它是否被篡改?

时间:2010-08-10 13:36:20

标签: .net assemblies

这个问题是关于验证程序集以检查它是否因恶意活动而被篡改。 创建程序集时,将生成元数据。元数据包括类型定义表,类型引用表和清单表等表。引用表包含每个程序集引用的条目,该条目包括引用的程序集,其公钥和哈希值。清单包括为每个程序集引用的程序集的详细信息,它包括程序集名称,其公钥和哈希算法。我还了解到,在加载程序集的运行时,它会生成程序集的数字签名,并在清单中嵌入公钥,并将其与已嵌入程序集中的数字签名进行比较。如果数字签名匹配则加载。  我的问题如下。

  1. 程序集参考元数据表包含HASH。还提到它没有被使用。那它的目的是什么?
  2. 每次装配时都会发生装配验证吗?
  3. 如果没有强类型,会发生什么?

2 个答案:

答案 0 :(得分:4)

  1. 好问题。
  2. 实际上,

      

    “公共语言运行时也执行哈希验证;   程序集清单包含组成该文件的所有文件的列表   汇编,包括每个文件的哈希,因为它存在时   清单已建成。在加载每个文件时,会对其内容进行哈希处理   并与清单中存储的哈希值进行比较。如果是两个   哈希不匹配,程序集无法加载。“   http://msdn.microsoft.com/en-us/library/ab4eace3.aspx

    但是...

      

    “每个条目(AssemblyRef元数据表)也包含一些标志   和哈希值。此哈希值旨在作为校验和   引用的程序集的位。 CLR完全忽略此哈希   价值,将来可能继续这样做。“   杰弗里里希特“通过C#CLR”第3版。

    根据我对.Net 4.0程序集的私人调查 - 在程序集绑定阶段实际上忽略了哈希值,即使程序集是由加密密钥签名的,因此具有强名称。

    过了一会儿,我意识到strong-name bypass feature导致了这种行为。 因此,您需要“在HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework键下创建名为 AllowStrongNameBypass 的值为0的DWORD条目”,以启用强名称(+ hashsum)验证。

答案 1 :(得分:1)

1:不,它被使用了。 Ecma-335,分区II,.file指令的第6.2.3章:

.hash之后的字节指定为文件计算的哈希值。 VES应在访问此文件之前重新计算此哈希值,如果不匹配则应生成异常。用于计算此哈希值的算法使用.hash算法指定(参见第6.2.1.1节)。

2:仅在启用强名称验证时。请注意,默认情况下,这是完全信任方案中的.NET 3.5 SP1。您必须使用caspol.exe

显式启用它

3:假设“强烈命名”,则无法进行验证。