依赖 DLL 或 EXE 中的版本信息的安全风险



这个Stackoverflow问题询问了如何修改现有二进制文件(DLL或EXE(中的版本信息。答案是使用Visual Studio。我尝试使用电脑供应商提供给我们的第三方 DLL 来读取系统指标(例如电池电压或主板温度(。供应商忽略了向 DLL 添加任何版本信息。事实证明,这很容易做到,并且查看文件属性时的版本信息看起来绝对合法。

这个超级用户问题展示了如何使用一个名为自动运行的出色实用程序来查看计算机上正在启动和运行的内容。其中一个高评价的答案表明对发布服务器未知或空白的 DLL 或 EXE 持怀疑态度。

现在我自己运行了自动运行,并识别了一个当前未加载到内存中的 Java DLL。DLL被加载到VS中,"公司名称"从"Oracle Corporation"修改为"HonkyTonks"。正在重新加载自动运行...你瞧,"出版商"现在显示"HonkyTonks"!在Windows资源管理器中将鼠标悬停在DLL上还会显示版本信息以及我想要进行的任何修改。

所以我的问题是:

1( 寻找公司名称/出版商的建议是否有用(在安全性方面(?

2(在我看来,这看起来像一个安全漏洞,因为许多其他有能力的计算机用户可能会在版本信息中看到"Microsoft公司"或类似内容,并假设该文件是合法的。这是一个已知的漏洞吗?如果是的话,它是否适用于所有版本的Windows和其他操作系统?我只是落后于时代,永远不应该相信这些信息吗?

3( 能否以编程方式检测版本信息是否已以这种方式修改?

4(您能否将版本信息锁定在我们自己的二进制文件中,以便其他人无法轻易修改?

谢谢。

  1. 在安全性方面,版本信息大多无用。它仅提供有关发布者的基本信息,以及提到的很容易伪造。

  2. 是的,这就是为什么在Microsoft的.Net Framework中,您可以对程序集和可执行文件进行数字签名。在这种情况下,即使修改版本信息也会导致拒绝执行或加载已签名的二进制文件。伪造程序集的唯一方法是窃取用于签名的私钥集会。

  3. 不。仅当已对可执行文件或 DLL 进行签名时,才有可能。但在经典Windows(不是MS .Net(中,这几乎是不可能的。因为您需要将用于验证的密钥的公共部分存储在安全的地方。否则,黑客可以用自己的公钥替换公钥,您的验证程序将无法检测到假货。

  4. 您可以对二进制文件进行签名,并将数字签名放入其中或单独的文件中。并在加载之前根据二进制文件验证签名。并且您必须保护公钥存储。

最新更新