如何保护我的.NET应用程序免受DLL劫持?

时间:2010-09-18 13:17:45

标签: .net security dll

我们有一个带有注册扩展的.NET 3.5应用程序。我们如何保护它免受DLL劫持攻击?

由于传统和&设计问题强大的命名/签名现在不是一个选项

如果您不知道DLL劫持是什么的额外信息:

6 个答案:

答案 0 :(得分:4)

我遇到过类似的问题,我最终编写了自己的逻辑来验证dll。对我来说,我只是在LGPL时尚中使用该dll(我无法修改dll),但是想确保我的应用程序使用真正的dll(而不是高亮的dll)。

简单的解决方案:

  • 在开发应用程序时,创建dll的MD5校验和并在应用程序中对哈希进行硬编码
  • 每次启动应用程序时都使用相同的逻辑生成dll文件的MD5校验和,并将其与硬编码文件进行比较。
  • 您可能已经知道,但以下是如何有效地生成文件的校验和(请参阅答案:https://stackoverflow.com/a/1177744/392850

更好的解决方案:

  • 使用强哈希算法和盐
  • 生成dll的哈希值
  • 生成RSA密钥值对(私钥和公钥)
  • 使用您的私钥加密dll的哈希值
  • 在您的应用程序中嵌入公钥,“加密哈希”和salt
  • 应用程序启动时,使用您的公钥解密“加密哈希”
  • 在运行时使用相同的salt再次生成哈希值,并与使用公钥解密的哈希值进行比较

如果您拥有来自可靠CA的任何证书,例如verisign,您可以使用该证书而不是使用RSA密钥值对。

这样即使有人用破解的dll替换你的dll,哈希也不匹配,你的应用程序就会知道劫持企图。

这种方法可能比仅给dll一个强名称更好,因为可以通过运行来禁用强名称验证

SN -Vr HijackedAssembly

希望这可以帮助您,或者想要了解数字签名内部如何运作的人。

答案 1 :(得分:0)

看看这个thread ....它可以帮助你并给你洞察力....另外一件事,你当然可以查看EasyHook,拦截API createRemoteThread并查找如果DLL是未经授权的DLL之一....看看这个解释如何阻止dll注入的thread

答案 2 :(得分:0)

难道您不能将dll作为资源包含在运行时将其写入所需位置然后将dll加载到程序集中吗?我这样做了一次是因为我们想要分发为一个.exe但我认为它也可以解决这个问题,不是吗?

答案 3 :(得分:0)

罗伯特,

公平地对待Jim的问题"那将是什么样的设计"。通过回答,而不仅仅是说"它是什么"您可以让我们深入了解我们的建议/解决方案必须包含的限制。

换句话说,不知道为什么遗留代码阻止你以正确的方式做到这一点"很难为您的问题提供理想的解决方法。

除非您的架构阻止了Vishalgiri建议的MD5校验和构思,否则我建议接受他的建议。但是,虽然不知道哪些应用程序称这些DLL以及为什么它们无法签名,但很难知道这是否适合您。

我的想法可能要简单得多,但您是否可以调整应用程序以从预定义位置预加载DLL?例如,只允许它从主应用程序的BIN文件夹加载,并且失败 - 再也不尝试?

请参阅此链接,了解如何从不同路径加载:http://www.chilkatsoft.com/p/p_502.asp

这可能比编写所有MD5校验和代码更快。即使我也喜欢这个想法。

答案 4 :(得分:0)

如果要混淆您的应用程序,则在混淆之前先使用ILMerge将DLL与EXE合并,将提供针对DLL劫持的绝对保护,还可以消除未使用的代码,并为您提供独立的EXE。

答案 5 :(得分:-1)

如果您有文件夹/数据访问权限,您可以编写代码以主动去查看Windows在查找您的.DLL之前查找您的.DLL的相同位置,然后再调用您自己的.DLL(或搜索整个驱动​​器),并且您可以计算对你的合法DLL或其他模式匹配进行CRC检查,以比较你所定位的匹配DLL文件的legal.DLL,从而确保没有其他人劫持过你(将文件放在你自己之前搜索过的位置)位置 - 甚至任何位置)。对于各种搜索顺序,这可能需要对不同版本的Windows下的方法进行一些研究。然后,如果你发现劫持企图,你可以采取一些行动,取决于你是否有人试图劫持你的DLL ...重命名faker.DLL,删除它,通知用户,通知管理员,不要' t调用你的DLL等。