CA2124:必須將有弱點的 finally 子句包裝在外層 try 中
型別名稱 |
WrapVulnerableFinallyClausesInOuterTry |
CheckId |
CA2124 |
分類 |
Microsoft.Security |
中斷變更 |
不中斷 |
原因
在 .NET Framework 1.0 和 1.1 版中,公用或保護的方法會包含 try/catch/finally 區塊。 finally 區塊似乎會重設安全性狀態,而且不會封入 finally 區塊中。
規則描述
此規則會在以 .NET Framework 1.0 和 1.1 版為目標的程式碼中找出 try/finally 區塊,這些區塊可能很容易遭受呼叫堆疊中出現之惡意例外篩選器的攻擊。 如果在 try 區塊中發生敏感作業 (例如模擬) 並且擲回例外狀況,則可以在 finally 區塊之前執行篩選條件。 若是模擬範例,則表示篩選條件會以模擬的使用者執行。 篩選條件目前只能在 Visual Basic 中實作。
警告
注意在 .NET Framework 2.0 (含) 以後版本中,如果直接在包含例外狀況區塊的方法中進行重設,執行階段會自動保護 try/catch/ finally 區塊,避免惡意例外篩選器干擾。
如何修正違規
請將未包裝的 try/finally 放置在外層 try 區塊中。 請參閱以下的第二個範例。 這會強制 finally 在篩選程式碼之前先執行。
隱藏警告的時機
請勿隱藏此規則的警告。
虛擬程式碼範例
描述
下列虛擬程式碼會說明這項規則偵測到的模式。
程式碼
try {
// Do some work.
Impersonator imp = new Impersonator("John Doe");
imp.AddToCreditCardBalance(100);
}
finally {
// Reset security state.
imp.Revert();
}
範例
下列虛擬程式碼會顯示您可以用於保護程式碼並符合此規則的模式。
try {
try {
// Do some work.
}
finally {
// Reset security state.
}
}
catch()
{
throw;
}