다음을 통해 공유


비관리 코드

업데이트: 2007년 11월

일부 라이브러리 코드는 비관리 코드(예: Win32 같은 네이티브 코드 API)를 호출해야 합니다. 이는 관리 코드의 보안 범위를 벗어난다는 뜻이므로 충분한 주의가 필요합니다. 코드가 보안 중립적이면 해당 코드와 해당 코드를 호출하는 모든 코드는 비관리 코드 권한(UnmanagedCode 플래그가 설정된 SecurityPermission)을 갖고 있어야 합니다.

그러나 호출자가 이렇게 강력한 권한을 갖는 것이 비합리적인 경우가 많습니다. 이런 경우 신뢰를 받는 코드가 래퍼 코드 보안에서 설명한 관리되는 래퍼나 라이브러리 코드와 비슷한 중개자가 될 수 있습니다. 기본 비관리 코드의 기능이 완전히 안전하면 직접 노출될 수 있지만, 그렇지 않으면 적합한 권한 검사(요구)가 우선적으로 필요합니다.

코드가 비관리 코드를 호출하지만 호출자에게 비관리 코드에 대한 액세스 권한을 요구하지는 않으려는 경우 해당 권한을 어설션해야 합니다. 권한을 어설션하면 프레임에서 스택 워크가 차단됩니다. 이 과정에서 보안 허점을 만들지 않도록 주의해야 합니다. 일반적으로 호출자의 적절한 권한을 요구한 다음 비관리 코드를 사용하여 해당 권한이 허용하는 범위 내의 작업만 수행해야 합니다. 시간을 구하는 함수 같은 일부 경우에는 비관리 코드가 보안 검사 없이 호출자에게 직접 노출될 수 있습니다. 어떤 경우이든 어설션하는 모든 코드는 보안에 책임을 져야 합니다.

네이티브 코드에 대한 코드 경로를 제공하는 모든 관리 코드는 악성 코드의 목표가 될 수 있으므로 안전하게 사용될 수 있는 비관리 코드와 해당 코드의 사용 방법을 결정하는 데는 상당한 주의가 필요합니다. 일반적으로 비관리 코드는 부분적으로 신뢰할 수 있는 호출자에게 직접 노출되지 않아야 합니다. 부분적으로 신뢰할 수 있는 코드가 호출할 수 있는 라이브러리에서 비관리 코드를 사용할 때의 안전성을 평가할 때는 두 가지 주요 사항을 고려해야 합니다.

  • 기능 - 호출자가 위험 가능성이 있는 작업을 수행하지 못하게 하는 기능이 관리되지 않는 API에서 제공됩니까? 코드 액세스 보안에서는 권한을 사용하여 리소스에 대한 액세스를 적용하므로, API가 파일, 사용자 인터페이스 또는 스레딩을 사용하는지 여부와 보호되는 정보를 노출하는지 여부를 고려해야 합니다. 만약 그렇다면 API를 래핑하는 관리 코드에서는 API의 입력을 허용하기 전에 필요한 권한을 요구해야 합니다. 또한, 메모리 액세스는 권한으로 보호되지는 않지만 메모리 액세스는 엄격한 형식 안전성으로 제한되어야 합니다.

  • 매개 변수 검사 - 일반적인 공격 유형은 노출된 비관리 코드의 API 메서드에 예기치 않은 매개 변수를 전달해서 이 메서드가 지정된 범위에서 벗어난 동작을 하게 하는 것입니다. 범위에서 벗어난 인덱스나 오프셋 값을 사용하는 버퍼 오버런은 기본 코드의 버그를 이용할 수 있는 매개 변수와 마찬가지로 이러한 유형의 공격에 해당하는 일반적인 예입니다. 따라서 비관리 코드 API가 부분적으로 신뢰할 수 있는 호출자에 대해 필수 요구 과정을 거쳐 안전하게 작동하는 경우에도, 악성 코드가 관리 코드의 래퍼 계층을 사용하여 의도하지 않은 호출을 할 수 없도록 관리 코드에서 매개 변수의 유효성을 철저히 검사해야 합니다.

참고 항목

기타 리소스

보안 코딩 지침