IE10의 향상된 메모리 보호 기능
Internet Explorer 10은 취약점을 쉽게 공격하지 못하도록 메모리 보호 기능이 대폭 향상되었으며 이를 통해 악의적인 웹으로부터 사용자를 안전하게 보호합니다. 이러한 향상된 기능은 공격의 난이도 및 개발 비용을 증가시킴으로써 악의적인 사용자를 곤란하게 만듭니다.
소셜 엔지니어링 방식의 맬웨어는 악의적인 사용자가 공격 대상자의 컴퓨터에 코드를 심는 주된 방법인데, 이는 지난 몇 년간 브라우저 취약점의 일반성이 희석되고 공격하기가 더욱 어려워졌기 때문입니다. 그러나 점점 많은 사용자가 IE9로 업그레이드하고 SmartScreen 필터의 보호 기능을 사용함에 따라 악의적 사용자들은 브라우저와 추가 기능을 직접 공격하는 쪽으로 관심을 돌렸습니다.
이 글에서는 위협적인 환경에 대해 설명한 다음 IE9에서 사용할 수 있는 기존의 보안 기능을 살펴보고, IE10의 새로운 메모리 보호 기능이 어떻게 훨씬 강화된 보안 성능을 제공하는지를 알아봅니다.
웹 브라우저 공격
메모리 관련 취약점을 공격하는 공격자의 목적은 브라우저의 코드 실행 경로를 자신이 선택한 코드로 이탈시키는 것입니다. 이를 위해 공격자는 두 가지 작업을 수행해야 합니다. 우선, 실행하려는 공격 대상자의 컴퓨터에서 사용 가능한 코드가 있어야 합니다. 이러한 코드를 가져오는 데 사용되는 기술은 크게 두 가지 등급으로 분류할 수 있습니다. 공격자는 힙 스프레이와 같은 기술을 사용하여 자신의 악성 코드를 메모리에 심을 수 있습니다. 또는 ROP(Return Oriented Programming)라는 기술을 사용하여 메모리에 이미 있는 코드 중에서 실행할 코드를 선택할 수 있습니다.
또한 공격자는 버퍼 오버플로 취약점과 같이 코드 실행 흐름을 설계에서 변경할 수 있도록 취약점을 공격할 수 있어야 합니다. 그런 다음 코드 경로를 변경하여 실행하려는 코드 주소로 "건너뛸" 수 있습니다.
일반적인 버퍼 오버플로 공격에서는 정교하게 조작된 데이터 집합이 스레드의 스택에 삽입되어 할당된 버퍼를 오버플로시키고 다른 데이터 구조를 덮어씁니다. 공격자는 코드 흐름을 자신이 선택한 메모리 내 위치로 변경할 수 있도록 예외 처리기 레코드 또는 함수의 반환 주소와 같은 구조를 덮어씁니다.
다른 유형의 공격에는 해당 메모리가 다른 용도로 재사용된 해제된 개체에 액세스하도록 응용 프로그램을 유인하는 use-after-free 취약점이 포함됩니다.
브라우저 방어
메모리 보호 기술은 공격자의 목표 달성을 제일선에서 차단합니다. 이러한 기술은 취약점의 공격을 보다 어렵고 불안정하게 하며 경우에 따라 불가능하게 만듭니다. 메모리 보호는 취약점 공격이 성공하여 공격자의 코드가 실행되기 '전'에 공격 대상 브라우저 프로세스를 안전하게 종료하는 것을 목표로 합니다. 대부분의 경우 이러한 보호를 통해 공급업체에서는 취약점이 공격을 당해 피해가 발생하기 전에 수정 프로그램을 만들어 배포할 시간적 여유를 가질 수 있습니다.
Internet Explorer에서 사용하는 메모리 완화 기술은 공격 기술이 새로 개발되고 대중화됨에 따라 이에 맞서 방어할 수 있도록 진화해 왔습니다. /GS 컴파일러 플래그와 같은 많은 방어 기술은 이전 버전의 Internet Explorer에서 사용되었지만 시간이 지나면서 업데이트되고 향상되었습니다. 또한 이 글에 간략하게 소개된 ForceASLR과 같은 일부 방어 기술은 IE10에 새로 도입된 기술로서, 새로운 운영 체제의 기능을 기반으로 합니다.
컴파일 시간 완화
컴파일러 완화 기술은 소프트웨어 개발자가 사용할 수 있으며 개발 모범 사례의 일부로 적용되어야 합니다. Internet Explorer 팀은 Internet Explorer 개발 과정에서 보안 개발 수명 주기의 요구 사항으로 이러한 완화 기술을 포함했습니다. 소프트웨어 개발자는 이러한 컴파일 시간 완화 기술의 구현이 포함된 고유의 SDL 프로세스를 채택하는 것이 좋습니다.
/GS 플래그는 Visual Studio .NET 2002에서 처음 도입되었으며 지원되는 모든 IE 버전에서 사용되었습니다. 이 컴파일러 기술은 버퍼 오버런 감지 기능을 응용 프로그램의 스택에 추가합니다. 런타임 시 "카나리아"라는 보안 암호가 응용 프로그램의 스택 경계에 추가됩니다. 예를 들어 반환 주소를 대상으로 하는 버퍼 오버플로 공격은 스택 버퍼와 반환 주소 사이에 삽입된 카나리아를 덮어씁니다. 이를 통해 프로세스에서 오버플로가 발생했음을 감지할 수 있습니다. 따라서 공격자의 코드가 실행되기 전에 예외가 발생하고 프로세스가 안전하게 종료될 수 있습니다.
이 기본적인 보호 개념은 새로운 각 버전의 Visual Studio에서 향상되었습니다. Internet Explorer 9 이상에서 사용되는 최신 버전의 향상된 /GS에는 포인터가 아닌 배열 및 순수한 데이터 구조를 포함하여 더 많은 함수를 보호하도록 현저히 향상된 추론이 포함되어 있습니다. 또한 보다 향상된 최적화를 통해 불필요한 검사가 제거되었으므로 방어 이행 비용이 절감됩니다.
/SAFESEH 플래그는 응용 프로그램의 등록된 예외 처리기가 보안 메모리 위치의 조회 테이블에 저장되는 메커니즘을 제공하는 링커 옵션입니다. 예외가 발생한 경우 응용 프로그램 스택의 예외 처리기 주소가 조회 테이블과 비교 확인됩니다. 값이 일치하지 않으면 프로세스가 종료됩니다.
/SAFESEH 플래그의 한 가지 문제는 프로세스를 안정적으로 보호하려면 모든 DLL 모듈이 보호에 옵트인되어야 한다는 점입니다. 옵트인되지 않은 모듈이 있으면 보호 효과가 감소합니다. SDL에서는 Microsoft의 모든 코드를 SAFESEH와 비교해야 하지만 타사의 추가 기능은 이 플래그로 컴파일되지 않을 수 있습니다.
/DYNAMICBASE 플래그는 이 글의 뒷부분에 자세히 설명된 ASLR(Address Space Layout Randomization) 이라는 운영 체제 완화 기술로 응용 프로그램을 옵트인하는 링커 옵션입니다.
/SAFESEH 제한과 마찬가지로 /DYNAMICBASE 플래그의 문제는 이 보호로 옵트인되지 않은 DLL이 있는 경우 악용 완화 기술인 ASLR 값이 줄어듭니다. 따라서 예측 가능한 위치에 있는 모든 모듈이 공격 대상이 될 수 있으며 이러한 예측 가능한 대상 하나만 있으면 공격이 가능합니다. 최근의 많은 공격은 ASLR 보호로 옵트인되지 않은 브라우저 추가 기능을 대상으로 합니다. 예를 들어 지난해의 Adobe Reader 및 Acrobat 제로 데이 공격은 주로 ASLR로 옵트인하지 못한 icucnv36.dll이라는 모듈 내의 예측 가능한 함수 위치를 대상으로 이루어졌습니다.
런타임 완화
런타임 완화 기술은 운영 체제가 프로세스 보안 유지 과정에 참여하는 것을 도와주도록 합니다.
DEP/NX는 현재 사용되는 CPU의 주요 보안 기능(Data Execution Prevention 또는 No eXecute)을 기반으로 하는 운영 체제 완화 기술입니다. 이 완화 기술은 메모리 페이지를 실행 불가능한 것(데이터)으로 표시하도록 지원합니다. 프로세서는 이렇게 표시된 메모리 페이지에서의 코드 실행을 거부합니다.
메모리 공격의 두 번째 단계에서 공격자는 메모리 내 데이터 페이지에 추가한 자체 코드를 실행하려고 할 수 있습니다. 데이터 페이지가 실행 불가능한 것으로 표시된 시나리오에서는 공격자의 코드가 실행되지 않고 프로세스가 안전하게 종료됩니다.
DEP/NX는 IE8에서 처음 기본적으로 지원되었으며, IE10에서도 계속 지원됩니다.
SEHOP는 /SAFESEH 컴파일러 플래그와 매우 유사한 예외 처리기 변조 방지 메커니즘을 제공하는 런타임 완화 기술입니다. 이 보호는 기호화된 예외 레코드를 스레드 예외 처리기 목록의 마지막 레코드로 삽입하는 방식으로 작동합니다. 예외가 발생한 경우 예외 처리기 목록에서 기호화된 예외 레코드에 도달할 수 있는지 확인합니다. 도달할 수 없는 경우 이는 예외 처리기 체인이 손상되었음을 나타내므로 프로세스가 안전하게 종료됩니다. SafeSEH와 달리, SEHOP에는 개별 모듈이 옵트인되지 않아도 되므로 추가 기능이 가장 강력한 보안 플래그로 컴파일되지 않은 경우에도 보호 기능을 제공합니다.
SEHOP는 IE9에서 처음 사용되었으며 IE10에서도 계속 사용됩니다.
Address Space Layout Randomization은 Windows Vista에 처음으로 도입되었고 Windows 8에서 기술이 대폭 향상되었습니다. ASLR은 응용 프로그램이 메모리에 처음 로드될 때 임의 메모리 주소를 할당합니다. 또한 PEB(Process Environment Blocks), TEB(Thread Environment Blocks), 스택 및 힙과 같은 다른 메모리 구조도 메모리 내의 임의 위치에 할당됩니다.
메모리 내의 개체 및 함수 위치를 임의로 지정하면 공격자가 해당 위치를 발견하지 못하므로 ROP(Return Oriented Programming)이라는 기술을 방지하는 데 도움이 됩니다. 이러한 임의 지정을 자물쇠 조합으로 공격자의 페이로드를 차단하는 것으로 생각하면 됩니다. 공격자는 조합을 모를 경우 한 가지만 추측할 수 있습니다. 잘못된 추측은 곧 공격 실패를 의미하므로 프로세스가 안전하게 종료됩니다.
다음 그림에서는 시스템 시작 시 핵심 시스템 구성 요소가 임의 메모리 주소에 로드되는 방식을 보여 줍니다.
Windows 8에서는 ASLR의 몇 가지 기능이 향상되었으며 이러한 기능은 모두 Internet Explorer 10에서 사용됩니다.
이제 모든 상향식 및 하향식 할당이 8비트 엔트로피를 사용하여 임의로 지정됩니다. 이 향상된 기능은 VirtualAlloc 및 MapViewOfFile을 포함하여 예측 가능한 메모리 영역을 크게 줄여 줍니다.
HEASLR(High Entropy Address Space Layout Randomization) 은 64비트 주소 공간의 증가를 활용하여 더 많은 비트를 엔트로피에 할당합니다. 이는 64비트 프로세스에 할당될 수 있는 잠재적 주소 수를 크게 증가시키는 효과를 제공합니다. 모든 64비트 프로세스는 HEASLR을 통해 증가된 엔트로피에 옵트인될 수 있습니다. 프로세스는 새 Image File Execution Option을 통해 링크 타임(/HIGHENTROPYVA) 또는 로드 시 옵트인될 수 있습니다.
기본적으로 Metro 스타일 브라우저는 64비트 컴퓨터에서 64비트 모드로 실행됩니다. 따라서 주소 공간이 훨씬 크고 메모리 레이아웃이 더 임의로 지정됩니다.
ForceASLR은 Windows 8에서 사용되는 ASLR의 가장 중요한 변경 사항이라고 할 수 있습니다. 또한 ForceASLR은 Internet Explorer 10에서 사용되는 로더 옵션으로서, 지정된 모듈이 /DYNAMICBASE 플래그로 컴파일되지 않은 경우에도 운영 체제에 브라우저에서 로드하는 '모든' 모듈의 위치를 임의로 지정하도록 지시합니다. ForceASLR 보호는 Windows 8 커널에 추가되었으며, 이제 Windows 7에서 Internet Explorer 10을 설치할 때 설치되는 업데이트로 사용할 수 있습니다.
이 기능과의 호환성을 지원하고 ForceASLR을 지원하지 않는 이전 Internet Explorer 버전에 메모리 임의 지정 보호를 제공하기 위해 추가 기능 개발자는 /DYNAMICBASE 플래그를 사용하는 것이 좋습니다.
요약
Windows 8과 Internet Explorer 10에서 제공되는 메모리 보호 기능에 대한 이 개요가 많은 도움이 되었기를 바랍니다. 우리는 보안 기능을 강화하기 위해 비밀리에 다른 많은 기술을 개발해 왔으며, 그 대부분은 기밀 사항이므로 이름조차 정하지 않았습니다. 조만간 몇 가지 추가 보안 관련 공지가 제공될 예정이므로 이에 대한 여러분의 많은 관심을 바랍니다. 앞으로도 보안 웹 검색 플랫폼을 제공하기 위해 최선을 다하겠습니다.
- Internet Explorer 보안 프로그램 관리자, Forbes Higman