我目前正在研究 C# / .NET 的可靠性功能和异常处理
这些特别是HandleProcessCorruptedStateExceptions
属性和带有PrepareConstrainedRegions
的 CER 。
现在我正在阅读SecureString
类的参考源代码,因为这是一个非常安全的地方,即使在特殊情况下也能保持数据加密,并找到类似这样的地方:
[HandleProcessCorruptedStateExceptions]
//...
RuntimeHelpers.PrepareConstrainedRegions();
try
{
Unprotect();
// ...
}
catch(Exception)
{
Protect();
throw;
}
finally
{
Protect();
// ...
}
catch
阻止的原因是什么? finally
块是否足以重新保护数据?
或者那些损坏的状态异常是否只会影响catch
并在之后终止应用程序?
答案 0 :(得分:1)
由于异常过滤功能中的安全漏洞(不是由C#提供,但Visual Basic和其他人提供),因此需要在catch块中进行代码重复。它允许恶意用户在捕获异常之后和最终执行块之前在try-catch-finally块中执行其代码。
威胁看起来像这样:你的库的Visual Basic用户在Unprotect()之后导致异常(甚至OutOfMemoryException因内存不足),CLR找不到catch块,然后CLR执行用户的异常过滤器代码,此代码窃取Unprotect() -ed数据,然后CLR才在finally块中执行Protect()。
因此,将安全清理代码放在catch和finally块中,通常清理只停留在最终。
答案 1 :(得分:0)