依赖DLL或EXE中版本信息的安全风险
Security risks of relying on version information in DLL or EXE
此 Whosebug question 询问如何修改现有二进制文件(DLL 或 EXE)中的版本信息。答案是使用 Visual Studio。我尝试使用我们的 PC 供应商提供给我们的第 3 方 DLL 来读取系统指标(例如电池电压或主板温度)。供应商忽略了向 DLL 添加任何版本信息。事实证明,这非常容易做到,而且查看文件属性时的版本信息看起来绝对合法。
此 Superuser question shows how to use a fantastic utility called Autoruns 查看计算机上正在启动的内容和 运行。其中一个高评价的答案建议怀疑发布者未知或空白的 DLL 或 EXE。
现在我 运行 自动运行自己并识别出 Java 当前未加载到内存中的 DLL。 DLL 被加载到 VS 中,"Company Name" 由 "Oracle Corporation" 修改为 "HonkyTonks"。正在重新加载自动运行...你瞧,"Publisher" 现在显示 "HonkyTonks"!将鼠标悬停在 Windows Explorer 中的 DLL 上还会显示版本信息以及我想进行的任何修改。
所以我的问题是:
1) 寻找公司 Name/Publisher 的建议是否有用(在安全方面)?
2) 在我看来,这像是一个安全漏洞,因为许多其他有能力的计算机用户可能会在版本信息中看到 "Microsoft Corporation" 或类似内容,并认为该文件是合法的。这是一个已知的漏洞吗?如果是,它是否适用于 Windows 的所有版本以及可能的其他 OS?我是不是落伍了,永远不应该相信这些信息?
3)能否通过这种方式编程检测版本信息是否被修改?
4) 能否将版本信息锁定在我们自己的二进制文件中,以免其他人轻易修改?
谢谢。
在安全方面,版本信息大多没什么用。它
仅提供有关发布者的基本信息以及您
提到的很容易被伪造。
是的,这就是为什么在 Microsoft 的 .Net Framework 中您可以对程序集和可执行文件进行数字签名。在这种情况下,即使修改版本信息也会导致拒绝执行或加载已签名的二进制文件。伪造程序集的唯一方法是窃取用于签名的私钥
大会.
没有。仅当您已签署可执行文件或 DLL 时才有可能。但在经典 Windows(不是 MS .Net)中,这几乎是不可能的。因为您需要将用于验证的密钥的 public 部分存储在安全的地方。否则,黑客可以用自己的密钥替换 public 密钥,您的验证程序将无法检测到假冒的。
您可以签署二进制文件并将数字签名放在其中或单独的文件中。并在加载之前根据二进制文件验证签名。并且您必须保护 public 密钥存储。
此 Whosebug question 询问如何修改现有二进制文件(DLL 或 EXE)中的版本信息。答案是使用 Visual Studio。我尝试使用我们的 PC 供应商提供给我们的第 3 方 DLL 来读取系统指标(例如电池电压或主板温度)。供应商忽略了向 DLL 添加任何版本信息。事实证明,这非常容易做到,而且查看文件属性时的版本信息看起来绝对合法。
此 Superuser question shows how to use a fantastic utility called Autoruns 查看计算机上正在启动的内容和 运行。其中一个高评价的答案建议怀疑发布者未知或空白的 DLL 或 EXE。
现在我 运行 自动运行自己并识别出 Java 当前未加载到内存中的 DLL。 DLL 被加载到 VS 中,"Company Name" 由 "Oracle Corporation" 修改为 "HonkyTonks"。正在重新加载自动运行...你瞧,"Publisher" 现在显示 "HonkyTonks"!将鼠标悬停在 Windows Explorer 中的 DLL 上还会显示版本信息以及我想进行的任何修改。
所以我的问题是:
1) 寻找公司 Name/Publisher 的建议是否有用(在安全方面)?
2) 在我看来,这像是一个安全漏洞,因为许多其他有能力的计算机用户可能会在版本信息中看到 "Microsoft Corporation" 或类似内容,并认为该文件是合法的。这是一个已知的漏洞吗?如果是,它是否适用于 Windows 的所有版本以及可能的其他 OS?我是不是落伍了,永远不应该相信这些信息?
3)能否通过这种方式编程检测版本信息是否被修改?
4) 能否将版本信息锁定在我们自己的二进制文件中,以免其他人轻易修改?
谢谢。
在安全方面,版本信息大多没什么用。它 仅提供有关发布者的基本信息以及您 提到的很容易被伪造。
是的,这就是为什么在 Microsoft 的 .Net Framework 中您可以对程序集和可执行文件进行数字签名。在这种情况下,即使修改版本信息也会导致拒绝执行或加载已签名的二进制文件。伪造程序集的唯一方法是窃取用于签名的私钥 大会.
没有。仅当您已签署可执行文件或 DLL 时才有可能。但在经典 Windows(不是 MS .Net)中,这几乎是不可能的。因为您需要将用于验证的密钥的 public 部分存储在安全的地方。否则,黑客可以用自己的密钥替换 public 密钥,您的验证程序将无法检测到假冒的。
您可以签署二进制文件并将数字签名放在其中或单独的文件中。并在加载之前根据二进制文件验证签名。并且您必须保护 public 密钥存储。