CA2124: 취약한 finally 절을 외부 try에 래핑하십시오.
TypeName |
WrapVulnerableFinallyClausesInOuterTry |
CheckId |
CA2124 |
범주 |
Microsoft.Security |
변경 수준 |
주요 변경 아님 |
원인
.NET Framework의 버전 1.0 및 1.1에서 public 또는 protected 메서드에 try/catch/finally 블록이 포함되어 있습니다. finally 블록이 보안 상태를 다시 설정하고 finally 블록에 포함되지 않습니다.
규칙 설명
이 규칙은 호출 스택에 있는 악의적인 예외 필터에 취약할 수 있는 .NET Framework의 버전 1.0 및 1.1을 대상으로 하는 try/finally 블록을 찾습니다. try 블록에 가장과 같은 중요한 작업이 발생하면 예외가 throw되고 finally 블록 앞에서 필터가 실행될 수 있습니다. 가장을 예로 들면, 필터가 가장 사용자로 실행될 수 있다는 의미입니다. 필터는 현재 Visual Basic에서만 구현할 수 있습니다.
경고
참고 .NET Framework의 버전 2.0 이상에서 예외 블록이 포함된 메서드 내에서 다시 설정이 직접 발생하는 경우 런타임은 악의적인 예외 필터로부터 try/catch/ finally 블록을 자동으로 보호합니다.
위반 문제를 해결하는 방법
래핑되지 않은 try/finally를 외부 try 블록에 배치합니다. 다음 두 번째 예제를 참조하십시오. 이렇게 하면 필터 코드 앞에서 finally가 실행됩니다.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시해야 합니다.
의사(pseudo) 코드 예제
설명
다음 의사(pseudo) 코드에서는 이 규칙을 통해 감지되는 패턴을 보여 줍니다.
코드
try {
// Do some work.
Impersonator imp = new Impersonator("John Doe");
imp.AddToCreditCardBalance(100);
}
finally {
// Reset security state.
imp.Revert();
}
예제
다음 의사(pseudo) 코드에서는 코드를 보호하고 이 규칙을 만족시키는 데 사용할 수 있는 패턴을 보여 줍니다.
try {
try {
// Do some work.
}
finally {
// Reset security state.
}
}
catch()
{
throw;
}