我正在构建一个Windows(服务)应用程序,简而言之,它由一个“引导程序”和一个“引擎”(一个由引导程序加载的对象,它将控制转移到它,然后执行的实际任务)组成。应用)。引导程序是一个非常基本的启动例程,几乎没有可能更改的功能。但是安装后引擎本身可能会升级,我正在实现一种机制,以便它可以自行升级 - 通过联系“主服务器”并检查其版本号与“最新”版本。如果有更新版本的引擎可用,它会将其下载到指定的文件夹中并调用引导程序中的方法以“重新启动”。
因此,每当引导程序启动时,它都会使用MEF“扫描”适当的目录以实现IEngine,比较它们的引导程序兼容性数字并选择最新的兼容引擎版本。然后它将控制转移到引擎(然后,然后执行更新检查等)。如果没有符合条件的IEngine - 或者MEF在合成期间失败 - 它将回退到IEngine的默认内置实现。
此应用程序将在远程服务器(或多个)上运行,其背后的全部原因是将手动应用程序维护保持在最低限度(无需卸载/下载新版本/重新安装等)。
所以,问题是:由于引导程序有效地将程序执行转移到IEngine对象上的方法,因此以某种方式找到应用程序扫描文件夹的恶意IEngine实现(或模仿器)基本上会对服务器造成严重破坏。它被加载并被发现是最符合条件的引擎版本。
我正在寻找一种机制来验证IEngine实现是否“真实” - 正如由适当的权威机构发布的那样。我一直在玩一些家庭brewn“解决方案”(IEngine暴露了一个传递“挑战”的Validate函数,并且必须以各种方式返回正确的“响应” - 比如让引导程序产生随机字符串加密并传递给引擎候选者,后者必须解密并修改字符串,然后对其进行哈希处理,加密哈希值并将其返回给引导程序,引导程序将对其随机字符串执行类似的字符串修改,然后对其进行哈希并比较哈希到候选等的解密响应(哈希),但我确定.Net中有功能来执行这种验证?我只看了Strong Naming,但似乎这不是一个动态加载但没有想到dll的系统的最佳方式..
非常感谢输入。
答案 0 :(得分:6)
可以使用私钥对程序集进行数字签名。结果称为strong named assembly。
当加载强命名程序集时,.NET会自动检查其签名是否与嵌入的公钥匹配。因此,当加载了一个强大的命名程序集时,您可以保证作者拥有与该公钥对应的私钥。
您可以致电Assembly .GetName() .GetPublicKey()获取公钥,然后将其与预期的公钥进行比较,即您的公钥。
您可以扫描插件程序集,为每个插件程序集创建一个AssemblyCatalog
,使用正确的公钥(拒绝其他公钥),最后将它们汇总到AggregateCatalog
并构建CompositionContainer
用它。
这基本上是格伦·布洛克在this thread中解释的内容。 (最好忽略Bnaya关联的博客文章,他对StrongNameIdentityPermission
的解释是不正确的。)
编辑并回复评论栏:
为了得到那个公钥,我做了 控制台应用程序输出公共 关键字节数组到某个地方。我嵌入了 我的宿主应用程序中的字节数组, 然后用它来比较 反对插件的公钥 候选人。那会是方法吗? 做到了吗?
是的,但有一种更简单的方法来提取公钥。查看sn.exe的-Tp
选项。
这种机制是否会自动阻止恶意插件程序集暴露出来 正确,但“伪造”的公钥?如同,是否有一些机制取消任何集会资格 已签名,但其公开的公钥与其内部公钥不匹配 私钥,完全被加载/运行?
据我所知,支票会自动发生。如果签名错误,则无法加载(甚至动态)强名称程序集。否则强名就没用了。要对此进行测试,可以在十六进制编辑器中打开强名称程序集,更改某些内容(例如程序集中嵌入的const string
中的字符)并验证是否无法再加载程序集。
我想我所指的是类似于此处描述的黑客/破解的类型: http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-security/407/Signed-assemblies-easily-cracked 在这里:http://blogs.msdn.com/b/shawnfa/archive/2008/05/14/strong-name-bypass.aspx
[...更多评论......]
然而,这显然可以通过简单的篡改来绕过(如第一个链接所示,>并在此处解释更多):grimes.demon.co.uk/workshops/fusionWSCrackOne.htm
您所指的“攻击”分为三类:
结论:强名称适合用于身份验证(至少从.NET 2.0开始)
答案 1 :(得分:2)
我写了一篇博文,其中包含目录的源代码,该目录仅加载包含您指定的键的程序集:How to control who can write extensions for your MEF application