CA2153: 손상된 상태 예외 처리 방지
속성 | 값 |
---|---|
규칙 ID | CA2153 |
제목 | 손상된 상태 예외 처리 방지 |
범주 | 보안 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 아니요 |
원인
CSE(손상된 상태 예외)는 프로세스에 메모리 손상이 있음을 나타냅니다. 프로세스 충돌을 허용하는 대신 catch하면 공격자가 손상된 메모리 영역에 익스플로잇을 배치할 수 있는 경우 보안 취약점이 발생할 수 있습니다.
규칙 설명
CSE는 프로세스의 상태가 손상되었으며 시스템에 의해 catch되지 않았음을 나타냅니다. 손상된 상태 시나리오에서 일반 처리기는 System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute 특성으로 메서드를 표시하는 경우에만 예외를 catch합니다. 기본적으로 CLR(공용 언어 런타임)은 CSE에 대한 catch 처리기를 호출하지 않습니다.
가장 안전한 옵션은 이러한 종류의 예외를 catch하지 않고 프로세스에 크래시가 발생하도록 허용하는 것입니다. 로깅 코드를 사용해도 공격자가 메모리 손상 버그를 악용할 수 있습니다.
이 경고는 catch (System.Exception e)
또는 예외 매개 변수가 없는 catch
와 같이 모든 예외를 catch하는 일반 처리기로 CSE를 catch하는 경우에 트리거됩니다.
위반 문제를 해결하는 방법
이 경고를 해결하려면 다음 중 하나를 수행합니다.
HandleProcessCorruptedStateExceptionsAttribute 특성을 제거합니다. 이렇게 하면 CSE가 catch 처리기로 전달되지 않는 기본 런타임 동작으로 돌아갑니다.
특정 예외 유형을 catch하는 처리기 기본 설정에서 일반 catch 처리기를 제거합니다. 드문 일이지만 처리기 코드가 안전하게 처리할 수 있다고 가정하여 CSE가 여기에 포함될 수 있습니다.
예외를 호출자에게 전달하고 실행 중인 프로세스가 종료되도록 하는 catch 처리기에서 CSE를 다시 throw합니다.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시해야 합니다.
의사 코드 예제
위반
다음 의사 코드에서는 이 규칙에 의해 검색되는 패턴을 보여 줍니다.
[HandleProcessCorruptedStateExceptions]
// Method that handles CSE exceptions.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Handle exception.
}
}
해결 방법 1 - 특성 제거
HandleProcessCorruptedStateExceptionsAttribute 특성을 제거하여 메서드가 손상된 상태 예외를 처리하지 않도록 합니다.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Handle exception.
}
}
해결 방법 2 - 특정 예외 catch
일반 catch 처리기를 제거하고 특정 예외 형식만 catch합니다.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (IOException e)
{
// Handle IOException.
}
catch (UnauthorizedAccessException e)
{
// Handle UnauthorizedAccessException.
}
}
해결 방법 3 - 다시 throw
예외를 다시 throw합니다.
[HandleProcessCorruptedStateExceptions]
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Rethrow the exception.
throw;
}
}
.NET