보안정보

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

스크립팅 엔진 메모리 손상 취약점(CVE-2016-0189) 분석

2016.10.05

20,625

보안관제사업부 보안분석팀 유병욱, 신지용

 


1. 개요

 

'CVE-2016-0189'는 인터넷 익스플로러(Internet Explorer)의 VBScript엔진이 소스코드를 처리하는 과정에 메모리를 손상시켜 임의의 코드를 실행시키는 취약점이다. 이를 이용하면 공격자는 악성 홈페이지에 접속한 사용자 PC에서 공격코드를 실행할 수 있으며 마이크로소프트사에서는 해당 취약점을 방지하기 위해 2016년 5월 10일에 CVE-2016-0189 취약점의 보안패치(MS16-053)를 배포했다.
이번 호에서는 스크립팅 엔진 메모리 손상 취약점(CVE-2016-0189)분석 및 이를 이용한 공격과 대응방안에 대해서 설명하고자 한다.


1) 취약점 정보


 CVSS 점수

 7.6

 취약점 타이틀

 스크립팅 엔진 메모리 손상 취약점

 취약점 분류

 Denial Of Service, Execute Code, Overflow Memory corruption

 영향 받는 대상

 ※ 보안패치를 하지 않은 버전에 해당 한다.
 Internet Explorer 11
 VBScript 5.7
 VBScript 5.8
 Internet Explorer 9
 Internet Explorer 10
 Internet Explorer 11​

 

 

[표 1] CVE-2016-0189 정보

 

[참고] CVSS(Common Vulnerability Scoring System) 등급별 영향도

 CVSS 등급

 CVSS 점수

 영향

 높음

 7.0 ~ 10.0

 원격 공격에 의해 모든 시스템 권한 획득 가능

 중간

 4.0 ~ 6.9

 원격 공격 가능성이 있고 부분적인 권한 획득 가능

 낮음

 0.0 ~ 3.9

 원격 공격 가능성이 낮고 사용자의 주의로 쉽게 대응

 

[표 2] CVSS 등급별 영향도


2) CVE-2016-0189, POC 소스코드 분석


다음은 CVE-2016-0189 취약점을 증명하는 코드로 더 이상 유효하지 않는 메모리에 접근하면서 인터넷 익스플로러의 충돌을 발생시킨다. 이 과정은 VBScript 코드로 20000 사이즈의 배열을 선언한 뒤에 해당 배열 사이즈를 1로 변경 후 다시 원래의 값을 불러오며 메모리 충돌을 일으키는 것이다.

 

※ ReDim Preserve API(VisualBasic) : 배열에 저장된 값을 보전하면서 배열의 길이를 재선언 한다.

 

 

 

[그림 1] CVE-2016-0189, POC 소스코드

 

 

위의 소스코드로 작성된 페이지에 접속하면 아래와 같이 메시지 창(STAGE 1)을 띄우고 ‘확인’ 버튼을 누르면 메모리 충돌을 일으켜 인터넷 익스플로러의 작동을 중지(STAGE 2)시킨다.

 

 

 

[그림 2] CVE-2016-0189 소스코드 실행 결과

 


2. MIC(Mandatory Integrity Control) 정책*을 우회하여 ‘명령 프롬프트 창’ 실행

 

1) 공격 시나리오

 

일반적으로 인터넷 익스플로러를 실행하면 ‘Low’등급의 프로세스가 생성되므로 해당 등급에서는 ‘명령 프롬프트 창’을 실행 시킬 수 없다. 따라서 ‘명령 프롬프트 창’을 실행하기 위해서 ‘Medium’등급의 인터넷 익스플로러가 필요한데, 사용자 PC에서 강제로 서버를 동작시킨 후 로컬 페이지에 접속 시켜 ‘Medium’등급의 인터넷 익스플로러가 ‘명령 프롬프트 창’을 실행시키는 공격을 한다.

 

 


[그림 3] 공격 시나리오

 

* MIC(Mandatory Integrity Control)정책은 별첨을 통해서 설명한다.

 

2) 테스트 환경 및 파일 설명

 

 ■ 피해자 PC 환경
  · Windows 10 Home (Vmware)
  · jscript.dll 버전 : 5.812
  · VBScript  버전 : 5.812
  · 인터넷 익스플로러 11
     - 인터넷 옵션의 보호모드 사용
     - Integrity Level : Low 등급

 


■ 공격자 웹 서버에 아래의 파일을 업로드 한 후 동작 시킨다.

 

(1) 파일

악성행위 동작 페이지.html

행위

악성행위 동작의 메인 페이지로서 접속한 사용자 PC에 악성파일을 다운로드 시키고 공격에 필요한 명령을 동작시킨다.

내용

① 인터넷 익스플로러 임시저장 공간에 아래의 파일을 강제 다운로드 한다.
    - ieshell32.dll
    - ielocalserver.dll
    - vbscript_godmode.html
② 다운로드 받은 파일을 시스템 임시저장 공간에 복사 후 다운로드 받은 파일은 삭제한다.
③ 사용자 PC에서 서버를 동작 시킨다.(http://127.0.0.1:5555)
④ ‘악성행위 실행 페이지’를 로컬서버에 업로드하여 리다이렉트 명령 한다.
⑤ 인터넷 익스플로러는 로컬 접속을 하기 때문에 ‘Medium’등급으로 실행된다.​

 

 

(2) 파일

악성행위 실행 페이지.html

행위

CVE-2016-0189 취약점을 이용해 ‘명령 프롬프트 창’을 띄우는 공격을 한다.

내용

① VBScript 엔진의 메모리 취약점을 공격한다.

② ‘명령프롬프트 창’을 실행한다.

 

(3) 파일

ielocalserver.dll

행위

사용자 PC에서 동작하는 서버 프로그램

내용

① 5555번 포트 오픈
② 서버 실행

 

(4) 파일

ieshell32.dll

행위

서버 동작에 필요한 환경변수를 서버 프로그램으로 전달한다.

 

[표 3] 공격에 필요한 파일 설명

 

 

3) 공격 시나리오 테스트


악성 홈페이지에 접속 하면 서버동작에 필요한 파일들을 인터넷 익스플로러의 임시저장폴더[1]에 자동으로 다운로드 된다.


  [1] C:Users사용자명AppDataLocalMicrosoftWindowsINetCacheLowIE

 



[그림 4] 악성 홈페이지 접속


※ 다운로드 파일
  ① ieshell32.dll
  ② ielocalserver.dll
  ③ vbscript_godmode.html (악성행위 실행 페이지.html)

 



[그림 5] 파일 다운로드 패킷


다음으로 해당 파일이 ‘검색기록 삭제’를 통해 지워지는 것을 대비해 시스템 임시저장폴더[2]에 복사 하며, ‘ieshell32.dll’파일은 ‘shell32.dll’으로 이름을 변경한 뒤에 ‘위의폴더System32’에 복사한다. 복사가 끝나면 다운로드 받은 파일을 삭제하고 다음의 과정으로 진행한다.


  [2] C:Users사용자명AppDataLocalTempLow

 



[그림 6] 복사된 파일


다음으로 사용자 PC에 다운받은 서버 프로그램을 동작시켜 아래와 같이 5555번 포트를 오픈 한다.

 

  

 

[그림 7] 사용자 PC에서 ‘5555’번 포트 오픈


사용자 PC에서 로컬서버인 ‘http://127.0.0.1:5555/악성행위실행페이지.html’에 자동으로 리다이렉트 되면서 ‘Medium’등급의 인터넷 익스플로 프로세스가 생성된다. 참고로 ‘Low’등급의 인터넷 익스플로러는 MIC등급의 영향으로 ‘명령프롬프트 창’을 실행할 수 없다.

 

‘악성행위실행페이지.html’에서 명령프롬프트 창을 띄우는 공격코드는 아래와 같이 삽입되어 있다.

 



[그림 8] 공격자 명령 코드

 

아래와 같이 인터넷 익스플로러는 ‘Medium’등급으로 실행되어 ‘명령프롬프트 창’을 실행 시킬 수 있었다.

 



[그림 9] 명령프롬프트창 실행

 

 ‘Medium’등급으로 실행된 인터넷 익스플로러는 ‘Low’등급에서 실행 시킬 수 있는 프로그램들의 제한을 우회하기 때문에 공격자 입장에서 다양한 공격을 할 수 있다.

 

 

 

 

3. 대응방안

 

1) SNORT 탐지 규칙

 

alert tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any (msg:"ET EXPLOIT CVE-2016-0189 Common Construct M1"; flow:established,from_server; file_data; content:"%u0008%u4141%u4141%u4141"; nocase; content:"redim"; nocase; content:"Preserve"; content:"2000"; distance:0; pcre:"/^s*?x29/Rs";  content:"%u400C%u0000%u0000%u0000"; nocase; reference:url,theori.io/research/cve-2016-0189; reference:cve,2016-0189; classtype:attempted-user; sid:2022971; rev:1;)

 

 

alert tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any (msg:"ET EXPLOIT CVE-2016-0189 Common Construct M2"; flow:established,from_server; file_data; content:"triggerBug"; nocase; content:"Dim "; nocase; distance:0; content:".resize"; nocase; pcre:"/^s*x28/Rs";  content:"Mid"; pcre:"/^s*?(xs*,s*1,s*24000s*x29/Rs"; reference:url,theori.io/research/cve-2016-0189; reference:cve,2016-0189; classtype:attempted-user; sid:2022972; rev:1;)

 

 

 

2) 보안패치를 통한 공격차단

 

마이크로소프트에서는 CVE-2016-0189 취약점과 관련된  Internet Explorer 보안 패치(MS16-053)를 배포하고 있으므로 최신 보안 패치가 이루어지지 않은 사용자들은 해당 패치를 적용하는 것을 권고한다.

 

※ Windows 업데이트
https://technet.microsoft.com/ko-kr/library/security/MS16-053


3) VBScript.dll 및 JScript.dll에 대한 액세스 제한

 

해당 엔진(VBScript.dll, Jscript.dll)을 사용하지 않는다면 아래와 같은 방법으로 액세스 제한 조치를 할 수 있다. 만약, 해당 액세스 제한 조치를 ‘취소’ 하려면 아래 링크를 확인하기 바란다.


32비트 시스템의 경우 관리 명령 프롬프트에서 다음 명령을 입력한다.

 

C:> takeown /f %windir%system32vbscript.dll
C:> cacls %windir%system32vbscript.dll /E /P everyone:N
C:> takeown /f %windir%system32jscript.dll
C:> cacls %windir%system32jscript.dll /E /P everyone:N

 


64비트 시스템의 경우 관리 명령 프롬프트에서 다음 명령을 입력한다.

 

C:> takeown /f %windir%syswow64vbscript.dll
C:> cacls %windir%syswow64vbscript.dll /E /P everyone:N
C:> takeown /f %windir%system64jscript.dll
C:> cacls %windir%syswow64jscript.dll /E /P everyone:N

 

 

※ 액세스 제한을 취소하는 방법
https://technet.microsoft.com/ko-kr/library/security/MS16-053

 


4. 별 첨

 

1) MIC(Mandatory Integrity Control)

 

※ MIC(Mandatory Integrity Control) 이란?
MIC는 커널 객체에 등급(Level)을 지정하여 낮은 등급을 가진 프로세스는 높은 등급을 가진 커널 객체에 접근하지 못하도록 하는 규정이다. 이를 통해서 인터넷 익스플로러에 플러그인 된 컴포넌트(ActiveX 등)들이 시스템의 중요 디렉터리에 접근하는 것을 사전에 차단할 수 있으며, 서비스 유저 애플리케이션 사이에서도 ACL 체크 이전에 여러 객체에 대한 보안 레벨을 강화할 수 있는 수단이다.

 

 
인터넷 익스플로러는 인터넷에서 가져오는 데이터들을 신뢰하지 않기 때문에 자식 프로세스를 ‘Low’등급으로 실행시켜 보안성을 높여주게 되어 있다. ‘Low’등급의 인터넷 익스플로러는 프로그램 실행 시 제약이 있으므로 공격자는 제약을 받지 않는 ‘Medium’등급의 인터넷 익스플로러가 필요하다.

 

※ Medium 등급의 인터넷 익스플로러를 사용하는 방법은 아래와 같다.
  ① 로컬서버 페이지에 접속
  ② 인트라넷 환경
  ③ 인터넷 익스플로러 옵션의 보호 모드 사용 해제

 

아래는 ‘Medium’등급의 인터넷 익스플로러를 확인하기 위한 테스트이며, 일반적으로 실행한 인터넷 익스플로러는 ‘Low’등급인 것을 확인할 수 있다.

 



[그림 10] 보호모드 설정 시 ‘Low’등급으로 동작


인터넷 옵션에서 ‘보호 모드 사용’을 해제하면 아래와 같이 ‘Medium’등급으로 프로세스가 생성된 것을 확인 할 수 있다.

 

 

[그림 11] 보호모드 미설정 시 ‘Medium’등급으로 동작

 

Elevation Policy 정책에 따라 ‘Low’등급의 인터넷 익스플로에서 실행시킬 수 있는 프로그램의 제한은 아래의 레지스트리 주소에 정의되고 있다.

 

※ Elevation Policy 정책의 레지스트리 주소
HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerLow RightsElevationPolicy

 

 

5. 참고 자료

 

[1] JScript 및 VBScript용 누적 보안 업데이트(3156764)
https://technet.microsoft.com/ko-kr/library/security/ms16-053.aspx

[2] PATCH ANALYSIS OF CVE-2016-08189
http://theori.io/research/cve-2016-0189

[3] Scripting Engine Memory Corruption Vulnerability (CVE-2016-0189)
http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-0189

[4] Understanding and Working in Protected Mode Internet Explorer
https://msdn.microsoft.com/en-us/library/bb250462(v=vs.85).aspx

[5] There’s No Place Like Localhost: A Welcoming Front Door To Medium Integrity
https://community.hpe.com/t5/Security-Research/There-s-No-Place-Like-Localhost-A-Welcoming-Front-Door-To-Medium/ba-p/6560786#.V80lIU2LSvj

[6] SNORT 탐지 규칙
http://rules.emergingthreats.net/