BCL和CLR中的所有.NET程序集(之后仅使用CLR)都是强命名和数字签名。提供数字证书以提供一定程度的信任,表明程序集未被篡改或替换。然而,似乎.NET从未检查数字签名(它可以检查强名称,正如Hans 指出的那样)。
在程序集加载时进行检查是有缺陷的,因为修改过的CLR可能会伪造答案。我的想法是从.NET1的角度来看,唯一安全的检查地点是作为引导框架的非托管代码的一部分,在框架启动时进行检查。巨大的缺点是性能影响。
我从开发人员的角度考虑这个问题,换句话说,我如何知道我的应用程序没有被已拥有的CLR2破坏,或者换句话说,是否有任何方法让应用程序信任CLR?
所以我的问题是为什么.NET不验证CLR?是因为性能影响还是还有其他原因?1. 我关注的是.NET,可能会干扰Windows并破坏这个想法,但如果你已经拥有Windows,你不需要拥有.NET。 2. 例如,用户将密码输入应用程序,它存储在SecureString中,但BCL已被攻击者入侵,因此攻击者现在可以获取该信息。这使他们能够捕获其他内容的信息。我意识到,如果攻击者可以替换CLR,他也可以在机器上放置键盘记录器,但这可以通过良好的安全工具进行检测(希望如此)。还有很多其他攻击方式,核心问题是如何知道SecureString是否已更改。
signtool verify /a <filename>
),虽然在.NET中可能不会以这种方式使用,但它确实可以。既然可以这样使用,为什么不呢?更多信息 - Robert MacLean