Authenticode 是否仍然可以脱机工作并使用“假”证书

信息安全 证书 电子签名 代码签名
2021-08-31 13:44:35

这是我们的故事:我们正在开发一些软件(用 C#/.NET 编写)并且我们已经使用强名称对程序集进行签名,我在 Visual Studio 中使用受密码保护的 pfx 文件执行此操作。

作为一个附加的安全步骤,我想用 Authenticode 对程序集或至少是可执行文件进行签名。

问题是:我们部署的目标将无法访问互联网,我们目前也无法获得自己的 CA 验证证书。我们在部署阶段完全控制了部署目标,我们选择硬件,安装操作系统等,但是一旦我们的产品(因此是硬件和软件的组合)“存在”,我们希望提供尽可能多的安全保障。

我们当然明白,我们无法控制它在野外发生的事情,但我们也采取了措施,能够查看硬件是否被篡改。如果有,我们知道我们不能信任该软件并且我们不会查看它。

回到我们的主要问题:创建我们自己的“假”(不可验证)证书来签署程序集是否有意义?我们是否需要将这些证书放入 Windows 商店?我试图保护我们的可执行文件不被其他可执行文件替换,比如通过 USB 闪存驱动器或类似的东西。

处理这个问题的最佳方法是什么?提前致谢。

1个回答

当使用 Authenticode 对代码进行签名时,Windows 会根据嵌入证书中包含的公钥检查签名,并根据操作系统在“根”存储中维护的“受信任的 CA”验证该证书。对于在机器上拥有管理员权限的任何人(这或多或少包括对机器具有物理访问权限的任何人),向该存储添加自定义 CA 都是非常可行的。仅当我们假设攻击者将无法重新计算与链接到受信任 CA 之一的假证书相关的假签名时,对您的代码进行签名才能防止任何事情。

因此,签署代码不会阻止有权访问机器的人进行更改。顺便说一句,这是一种非常普遍的情况:防止实际拥有硬件的人更改软件一直是游戏供应商和媒体内容出版商的圣杯。封闭式硬件(例如游戏机)取得了一些有限的成功,但在 PC 上,这是注定的。(有些人正在想办法做到这一点,但事实证明这在技术上和政治上都很困难。)

充其量,您的代码签名可能会阻止不费心制作假证书的攻击者(即一些低级恶意软件)的无声更改,但不会阻止坚定的攻击者。

注意:代码签名可能有法律上的好处,但是:如果强制执行代码签名,这可能有助于证明,在试用期间,修改代码的人完全知道它是被许可证禁止的。不过,不要相信我的话,因为我不是律师,任何与法律相关的答案都不太可能适用于全球存在的所有法律体系(毕竟有大约 200 个主权国家,因此至少许多名义上相互独立的法律制度)。