Silverlight를 설치하려면 여기를 클릭합니다.*
Korea 대한민국변경|Microsoft 전체 사이트
Microsoft
|프로필 관리|문의처|사이트 맵

Microsoft Windows XP 서비스 팩 2에서의 기능 변화

메모리 보호 기술

이 단원에서는 Windows XP 서비스 팩 2에 포함된 메모리 보호 기술에 대한 자세한 정보를 제공합니다.

실행 방지 기능(NX)

실행 방지는 어떤 기능을 수행합니까?

실행 방지 기능(일명 NX 또는 no execute)은 프로세스에서 실행 코드를 명시적으로 포함하고 있지 않은 메모리 영역 전체를 실행 불가로 표시합니다. 실행 불가 메모리 영역으로부터 코드를 가져와 삽입하여 실행하려는 공격이 있습니다. 실행 방지 기능은 이러한 시도를 차단하고 예외로 처리해서 이 공격을 막아줍니다.

실행 방지 기능은 프로세서 하드웨어를 이용해 코드가 특정 메모리 영역에서 실행되지 못하도록 하는 속성을 부여합니다. 실행 방지 기능은 가상 메모리 페이지 별로 작동하며 대부분의 경우 페이지 테이블 엔트리(PTE)의 비트를 변경하여 메모리 페이지에 표시합니다.

실행 방지 기능의 실제 하드웨어적 구현과 가상 메모리 페이지 표시 방식은 프로세스 아키텍처에 따라 다릅니다. 그러나 실행 방지를 지원하는 프로세서는 적절한 특성 집합으로 표시된 페이지로부터 코드가 실행되는 경우 예외 처리하는 기능을 갖고 있습니다.

Intel과 Advanced Micro Devices(AMD) 모두 실행 방지를 위한 Windows 호환 아키텍처를 정의하여 제품을 내보내고 있습니다. Windows는 AMD64 플랫폼과 Intel Itanium Processor Family(IPF) 프로세서에서 실행 방지 기능을 지원합니다. 32비트 버전의 Windows(Windows XP 서비스 팩 2부터 시작)는 AMD가 정의한 실행 불가 페이지 보호(NX) 프로세서 기능을 활용합니다. NX 프로세서 기능을 사용하려면 PAE(Physical Address Extension) 모드에서 프로세서가 실행되어야 합니다. 64비트 버전의 Windows는 64비트 확장 프로세서의 NX 프로세서 기능과 IPF 프로세서의 액세스 권한 페이지 테이블 엔트리(PTE) 필드의 특정 값을 사용합니다.

향후 32비트와 64비트 프로세서에서도 실행 방지 기능을 제공할 것입니다. Microsoft는 기존 응용 프로그램 및 드라이버와 발생할 수 있는 호환성 문제를 해결하는 한편으로 프로세서 업체들과 협력하여 실행 방지 기술의 채택과 발전을 독려하고 있습니다.

이 기능은 누구에게 적용됩니까?

응용 프로그램 및 드라이버 개발자들은 실행 방지 기능과 그 기능을 지원하는 플랫폼에서 실행되는 소프트웨어의 요구 사항을 알고 있어야 합니다. JIT(just-in-time) 코드 생성을 수행하거나 기본 프로세스 스택 또는 힙(heap)에서 메모리를 실행하는 응용 프로그램들의 실행 방지 요구 사항을 숙지해야 합니다.

드라이버 개발자들은 실행 방지 기능을 지원하는 플랫폼의 PAE 모드를 알고 있는 것이 좋습니다. 드라이버 호환성을 개선하기 위해 Windows XP 서비스 팩 2 시스템에서의 PAE의 동작이 변경되었습니다.

Windows XP 서비스 팩 2에서 이 기능에 추가된 새로운 기능은 무엇입니까?

32비트 버전 Windows와 응용 프로그램에서의 실행 방지 기능

앞으로 Windows와 Windows 호환 응용 프로그램을 실행하는 컴퓨터들의 다수는 32비트 버전 Windows를 실행하는 32비트 프로세서로 구성될 것으로 예상되고 있습니다. 그러나 AMD Opteron 및 Athlon 64와 같은 새로운 64비트 확장 프로세서들은 32비트와 64비트 운영 모드(각각 레거시와 네이티브)를 지원합니다. 이러한 32비트 및 64비트 통합 프로세서들은 완전한 레거시 환경(32비트 운영 체제에서 32비트 응용 프로그램을 실행하는 환경)에서 실행될 수 있으며 PAE 모드가 사용되는 경우에는 실행 방지 기능을 수행할 수 있습니다.

자세한 설명

약간의 차이는 있지만 Windows에서 실행 방지 기능의 전반적인 작동은 Windows 32비트 버전과 64비트 버전 모두 동일합니다. 응용 프로그램과 드라이버 개발자들에게 일관성을 제공하기 위해 메모리 보호 모델(실행 방지 포함)은 Windows 32비트와 64비트 버전에 대해 동일하게 기능하도록 설계되었습니다.

응용 프로그램 개발자들은 실행 방지 기능이 사용자 모드에서 어떻게 동작하는지 알고 있어야 합니다. 사용자 모드 실행 방지의 예외 처리는 Windows 시스템에서 STATUS_ACCESS_VIOLATION (0xc0000005)를 발생시킵니다.

EXCEPTION_RECORD 구조 안에 위치한 ExceptionInformation의 첫 번째 매개 변수에는 발생한 액세스 위반 유형이 들어 있습니다. ExceptionInformation[0]의 값이 8인 것은 액세스 위반이 예외 위반이었음을 나타냅니다.

대부분의 프로세스에서 STATUS_ACCESS_VIOLATION 예외는 처리되지 않은 예외가 될 것이며 프로세스 종료를 낳습니다.

실행 방지는 또한 커널 모드의 드라이버에게 적용됩니다. 커널 모드의 메모리 영역에 대한 실행 방지는 별도로 사용 또는 사용 불가 설정될 수 없습니다. 32비트 버전 Windows의 경우 실행 방지는 기본적으로 스택에 적용됩니다. 이것은 스택, 페이지 풀, 세션 풀에 실행 방지가 적용되는 64비트 버전의 Windows에 대한 커널 모드 실행 방지와는 다릅니다.

실행 방지가 사용되는 경우 장치 드라이버들은 스택으로부터 코드를 실행하는 것이 허용되지 않습니다. 커널 모드에서 실행 방지 액세스 위반이 발생하면 bugcheck 0xFC를 낳습니다. ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY.

이 변경 사항이 중요한 이유는 무엇이며 이로 인해서 줄어드는 위협은 무엇입니까?

실행 방지 기능의 가장 중요한 장점은 기본 힙, 다양한 스택 및 메모리 풀 등 데이터 페이지로부터의 코드 실행을 금지한다는 점입니다. 정상적인 시스템 운영에서, 코드는 일반적으로 기본 힙 및 스택으로부터 실행되지 않습니다. 실행 방지 기능은 이러한 위치로부터 실행되는 코드를 탐지하여 실행이 이루어지면 예외 처리합니다. 해당 예외 사항이 처리되지 않으면 그 프로세스는 종료됩니다. 커널 모드의 보호된 메모리에서 코드를 실행하면 bugcheck가 나타납니다.

프로세스를 종료하거나 bugcheck와 함께 시스템에 장애를 야기하는 것은 그리 좋은 경험은 아니지만 악성 코드가 실행되는 것을 막을 수 있습니다. 시스템에서 악성 코드가 실행되는 것을 방지하면 시스템에 손상을 입히는 것을 막을 수 있으며 악의적인 코드가 확산되는 것을 막을 수 있습니다.

실행 방지 기능은 보안의 악용을 없앨 수 있습니다. 구체적으로 실행 방지 기능은 바이러스 또는 다른 공격이 프로세스에 추가 코드를 덧붙여 실행하는 유형의 보안 위협을 방지할 수 있습니다. 실행 방지 기능이 있는 시스템에서 삽입된 코드의 실행은 예외 처리 될 수 있습니다.

실행 방지 기능의 두 번째 장점은 응용 프로그램 및 드라이버 개발자를 위한 우수한 엔지니어링 및 모범 관행입니다. 실행 방지 기능은 개발자들이 페이지를 명시적으로 실행 가능으로 표시하지 않고도 데이터 페이지에서 코드를 실행하는 것을 막도록 합니다.

중단되거나 다르게 작동되는 것은 무엇입니까?

응용 프로그램 호환성

일부 응용 프로그램의 동작은 실행 방지 기능과 호환되지 않을 수 있습니다. 동적 코드 생성(예컨대 Just-In-Time 코드 생성)을 수행하면서 생성된 코드에 명시적으로 Execute 권한을 표시하지 않는 응용 프로그램은 실행 방지 기능과 호환성 문제가 있을 수 있습니다.

실행 방지를 위반하려는 응용 프로그램은 상태 코드 STATUS_ACCESS_VIOLATION (0xC0000005)과 함께 예외를 수신하게 됩니다. 응용 프로그램이 실행 가능한 메모리를 요구하는 경우에는 가상* 메모리 할당 기능의 메모리 보호 인수에 PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE 또는 PAGE_EXECUTE_WRITECOPY를 지정하여 적절한 메모리에 이러한 특성을 명시적으로 설정해야 합니다. malloc() 및 HeapAlloc() 함수를 사용하는 힙 할당은 실행할 수 없습니다.

드라이버 호환성

실행 방지와 드라이버 호환성 문제는 대부분 PAE 모드 포함 호환성 문제에 집중됩니다. 실행 방지는 코드 생성을 수행하거나 다른 기법을 사용하여 실시간으로 실행 코드를 생성하는 드라이버와 호환성 문제를 낳을 수 있습니다. 그러한 드라이버들이 실행 방지 기능을 "항상 사용"으로 수정했지만 64비트 버전의 Windows의 모든 드라이버가 업데이트 되었다는 보장이 없습니다. 그러나 이러한 기법을 쓰는 드라이버는 거의 없으므로 실행 방지만으로 드라이버 호환성 문제를 자주 일으킬 것 같지는 않습니다.

주요 드라이버 호환성 문제는 PAE(Physical Address Extension) 모드를 32비트 시스템에서 실행하는 것입니다. PAE 모드는 프로세서가 4GB가 넘는 메모리 주소를 할당할 수 있도록 해줍니다. PAE 메모리 페이지 및 다른 메모리 페이지 구성표 사이의 주된 차이점은 PAE 모드에서 페이지 수준이 추가로 필요하다는 점에 있습니다(2개가 아닌 3개 수준). PAE가 실행되면 일부 드라이버는 로딩되지 않는데 그 이유는 해당 장치가 64비트 주소 할당을 할 수 없거나 해당 드라이버가 PAE 모드에는 4GB의 RAM이 필요하다고 가정할 수 있기 때문입니다. 그러한 드라이버는 PAE 모드에 있을 때는 항상 64비트 주소를 수신하지만 그 주소를 해석하지 못할 수도 있습니다.

다른 드라이버들은 PAE 모드에서 로딩될 수는 있지만 시스템 페이지 테이블 엔트리(PTE)를 직접 수정하여 시스템의 불안정성을 야기합니다. 이 드라이버들은 32비트 PTE를 예상하지만 PAE 모드에서는 64비트 PTE를 수신합니다.

가장 큰 드라이버 PAE 호환성 문제는 직접 메모리 액세스(DMA) 전송 및 맵 레지스터 할당에 관한 것입니다. DMA를 지원하는 많은 장치들(일반적으로 32비트 어댑터)은 64비트의 물리 주소 할당을 할 수 없습니다. 32비트 모드로 실행되는 경우 장치는 모든 물리 주소 공간을 할당할 수 있습니다. PAE 모드에서는 4GB가 넘는 물리 주소에 데이터가 있을 가능성이 있습니다. 이러한 제약이 있는 장치들이 이 시나리오에 작동하도록 하기 위해 Windows 2000 Server 제품군 이후에는 맵 레지스터에 의해 지시되는 32비트 주소를 제공하여 DMA 트랜잭션에 더블 버퍼링을 제공합니다. 장치는 32비트 주소에 DMA 트랜잭션을 수행할 수 있으며 커널은 드라이버에 제공된 64비트 주소로 메모리를 복사합니다.

PAE를 중지한 채로 시스템이 실행하면 32비트 장치를 위한 드라이버의 경우, 실제 메모리가 맵 레지스터를 지원할 필요가 없습니다. 모든 장치와 드라이버가 32비트 주소 공간에 포함되므로 이것은 더블 버퍼링이 필요하지 않다는 것을 의미합니다. 64비트 프로세서 컴퓨터에서 32비트 장치용 드라이버를 테스트한 결과 클라이언트 테스트된 DMA 기능 드라이버는 제한 없는 맴 레지스터가 예상됩니다.

호환성 문제를 억제하기 위해 Windows XP 서비스 팩 2에는 32비트 HAL DMA 동작을 흉내내는 하드웨어 추상 계층(HAL: Hardware Abstract Layer)에 관한 변경 내용이 있습니다. 변경된 HAL은 시스템이 PAE 모드에서 실행되는 경우 무제한 맵 레지스터를 허용합니다. 또한 커널 메모리 관리자는 4GB가 넘는 모든 물리적 주소를 무시합니다. 4GB 장벽을 넘는 모든 시스템 RAM은 Windows에 의해 주소 할당 될 수 없으며 따라서 시스템에서 사용될 수 없게 됩니다. 주소 공간을 4GB로 제한함으로써 32비트 DMA 버스 마스터와 호환되는 장치들은 4GB 경계를 넘는 주소와의 트랜잭션을 볼 수 없게 됩니다. 이러한 변경은 트랜잭션을 더블 버퍼링할 필요성을 제거하므로 더블 버퍼링 지원의 적절한 구현과 관련된 일부 드라이버에서의 버그를 방지됩니다.

HAL과 메모리 관리자에 관한 변경으로, 장치 드라이버 호환성이 실행 방지가 사용되는 Windows XP 서비스 팩 2에 미치는 영향을 최소화할 수 있습니다.

이러한 문제를 수정하는 방법은 무엇입니까?

실행 가능한 메모리 영역을 필요로 하는 응용 프로그램들은 메모리를 할당할 때 PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE 또는 PAGE_EXECUTE_WRITECOPY 속성값을 사용해야 합니다. 또한 응용 프로그램들은 기본 프로세스 힙 또는 스택으로부터 실행될 수 없습니다. 실행 방지와 호환되지 않는 작업을 수행하는 대부분의 응용 프로그램들을 호환되도록 업데이트해야 합니다.

응용 프로그램은 VirtualAlloc() 응용 프로그램 프로그래밍 인터페이스(API)를 사용하여 적절한 메모리 보호 옵션과 함께 실행 메모리를 할당할 수 있습니다. 최소한 PAGE_EXECUTE 메모리 보호 옵션이 사용되어야 합니다. 실행 코드가 생성된 후에는 응용 프로그램에서 할당된 메모리로의 쓰기 액세스를 허용하지 않도록 메모리 보호를 설정하는 것이 좋습니다. 응용 프로그램에서는 VirtualProtect() API를 사용하여 할당된 메모리에 대한 쓰기 액세스를 금지할 수 있습니다. 쓰기 액세스를

금지하면 프로세스 주소 공간의 실행 가능 영역을 최대한 보호할 수 있습니다. 악성 프로세스가 실행 영역에 코드를 삽입하려 하게 되면 그 액세스의 결과 STATUS_ACCESS_VIOLATION 쓰기 예외 처리가 발생합니다. 이 응용 프로그램은 자신의 주소 공간 중 실행 가능 영역을 가능한 한 작게 하려 합니다. 이렇게 하면 실행 가능 메모리가 프로세스 주소 공간에 삽입되어 실행될 수 있는 공격 노출 범위가 줄어듭니다.

또한 정교한 응용 프로그램들은 가상 메모리의 레이아웃을 제어하고 실행 가능 영역을 만들 수 있습니다. 이 응용 프로그램들은 실행 가능 영역보다 낮은 메모리 공간에서 실행 가능 영역을 찾으려 해야 합니다. 비실행 영역 아래의 실행 영역을 위치시키는 목적은 버퍼 오버플로가 실행 메모리로 넘치는 것을 방지하려는 데 있습니다.

Windows XP 서비스 팩 2에서 추가 또는 변경되는 설정은 무엇입니까?

호환성을 유지하려는 목적으로 32비트 응용 프로그램에 대해 실행 방지 기능을 선택적으로 중지할 수 있습니다. DisableNX이라는 명칭의 새로운 응용 프로그램 호환성 수정 사항이 Windows XP 서비스 팩 2에 포함되어 있습니다. DisableNX 호환성 수정 사항은 해당 프로그램에 대해 실행 방지를 중지시킵니다.

DisableNX 응용 프로그램은 Application Compatibility Toolkit을 사용하여 응용 프로그램에 적용될 수 있습니다. Windows 응용 프로그램 호환성에 대한 자세한 사항은 Microsoft 웹 사이트에서 "Windows 응용 프로그램 호환성"( http://go.microsoft.com/fwlink/?LinkId=23302 )을 참조하십시오.

또한 Windows XP 서비스 팩 2에는 사용자가 시스템에서 실행 방지를 구성할 수 있게 해주는 제어판 항목이 들어 있습니다. 이 제어판 항목을 사용하여 전체 컴퓨터에 실행 방지를 사용 또는 중지할 수 있을 뿐만 아니라 개별 응용 프로그램에 대해 선택적으로 실행 방지를 중지할 수 있습니다. 이 기능의 사용에 대한 세부 사항은 Windows XP 서비스 팩 2의 온라인 도움말에 포함되어 있습니다.


**
**

 

최종 수정일 : 2004년 11월 24일



Microsoft