힙 스프레이
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
힙 스프레이는 보안 취약점을 악용하기 쉽게 만드는 도구로, 힙 메모리 할당 방식을 이용하여 공격 성공 확률을 높이는 데 사용된다. 공격자는 힙 메모리에 공격 코드를 주입하고, 함수 포인터를 조작하여 코드 실행을 유도하며, 주소 공간 레이아웃 임의화 등의 기법으로 인해 발생하는 문제 해결을 위해 NOP 슬라이드를 활용한다. 2001년부터 익스플로잇에 사용되었으며, 웹 브라우저 익스플로잇에서 널리 사용되었다. 자바스크립트, VBScript, 액션스크립트, 이미지, HTML5 등 다양한 방식으로 구현될 수 있으며, 탐지 및 방지 기술도 연구되고 있다.
더 읽어볼만한 페이지
힙 스프레이 | |
---|---|
힙 스프레이 | |
유형 | 악용 기술 |
개요 | |
설명 | 힙 스프레이(Heap Spraying)는 공격자가 특정 메모리 주소에 데이터를 반복적으로 기록하여 대상 프로세스의 힙 메모리 영역을 채우는 악용 기술이다. 이 기술은 공격자가 예측 가능한 주소에 악성 코드를 배치하고, 다른 취약점(예: 버퍼 오버플로우)을 이용하여 해당 주소로 실행 흐름을 변경함으로써 악성 코드를 실행하는 데 사용된다. |
목표 | 힙 메모리 내의 특정 주소를 예측 가능하게 만든다. 악성 코드를 특정 주소에 배치하고 실행 흐름을 제어한다. |
작동 방식 | 공격자는 NOP 슬라이드와 악성 코드를 포함하는 큰 블록을 힙에 반복적으로 할당한다. NOP 슬라이드는 악성 코드 앞에 위치하여 약간의 주소 변동성을 허용한다. 다른 취약점을 통해 NOP 슬라이드 내의 주소로 점프하여 악성 코드를 실행한다. |
기술적 세부 사항 | |
메모리 조작 | 공격자는 운영체제 및 브라우저의 메모리 관리 방식을 이용하여 힙을 조작한다. |
스크립트 사용 | 종종 자바스크립트와 같은 스크립트 언어를 사용하여 힙 스프레이를 수행한다. |
예측 가능성 | 힙 스프레이는 특정 메모리 주소를 예측 가능하게 만드는 데 중점을 둔다. |
사용 사례 | |
웹 브라우저 공격 | 웹 브라우저의 취약점을 이용하여 악성 코드를 실행하는 데 사용된다. |
PDF 공격 | PDF 리더의 취약점을 이용하여 악성 코드를 실행하는 데 사용된다. |
기타 응용 프로그램 공격 | 다양한 응용 프로그램의 취약점을 악용하는 데 사용될 수 있다. |
방어 방법 | |
ASLR (Address Space Layout Randomization) | 메모리 주소를 무작위화하여 힙 스프레이의 예측 가능성을 감소시킨다. |
DEP (Data Execution Prevention) | 데이터 영역에서의 코드 실행을 방지하여 악성 코드가 실행되는 것을 막는다. |
최신 보안 업데이트 | 소프트웨어를 최신 상태로 유지하여 알려진 취약점을 해결한다. |
샌드박싱 | 응용 프로그램을 격리된 환경에서 실행하여 시스템에 대한 접근을 제한한다. |
추가 정보 | |
관련 용어 | ROP (Return-Oriented Programming), Buffer Overflow |
참고 자료 | Youtube title: Heap Spray Exploit Technique |
2. 동작 방식
힙 스프레이는 그 자체로 보안 취약점을 직접 악용하는 기법이라기보다는, 기존의 취약성을 이용한 공격 성공률을 높이는 데 사용되는 보조적인 기술이다. 따라서 실제 공격을 위해서는 힙 스프레이 외에 별도의 보안 취약점 존재가 필수적이다.
이 기법은 대부분의 컴퓨터 구조와 운영체제에서 힙 메모리를 대량으로 할당할 때 나타나는 예측 가능성을 이용한다. 즉, 큰 힙 공간을 요청하면 그 시작 메모리 주소를 어느 정도 예측할 수 있고, 연속적으로 할당된 메모리 블록들은 주소 공간 상에서 비교적 순차적으로 배치되는 경향이 있다. 공격자는 이 특징을 활용하여, 공격에 필요한 코드(셸코드 등)를 포함한 데이터를 대량으로 힙 메모리에 '뿌려놓음(spray)'으로써, 실행 시마다 메모리 배치가 달라지는 불확실성 속에서도 공격 코드가 예측 가능한 특정 영역에 위치할 확률을 높인다.
일반적인 공격 과정은 다음과 같다. 먼저, 공격자는 대상 프로세스 내에 매우 큰 힙 메모리 공간을 확보하고, 이 공간 여러 곳에 실행하려는 공격 코드(기계어)를 반복적으로 채워 넣는다. 그 후, 프로그램의 실행 흐름을 조작하여 이 힙 영역 중 한 곳을 가리키도록 만드는데, 주로 프로그램이 사용하는 함수 포인터의 값을 변조하는 방식이 사용된다. 프로그램이 변조된 함수 포인터를 통해 코드를 실행하려 하면, 원래 함수 대신 공격자가 힙에 심어둔 코드가 실행되어 시스템 제어권을 탈취당할 수 있다.
주소 공간 배치 난수화(ASLR)와 같은 메모리 보호 기법은 힙 영역의 정확한 주소 예측을 어렵게 만들어, 조작된 함수 포인터가 공격 코드의 시작점을 정확히 가리키지 못하게 할 수 있다. 이를 보완하기 위해 공격자는 실제 공격 코드 앞에 NOP(No-Operation) 명령어를 길게 배치하는 NOP 슬라이드 기법을 함께 사용하기도 한다. 이렇게 하면 실행 흐름이 NOP 영역 내 어느 지점에 떨어지더라도 NOP 명령어를 따라 미끄러지듯 이동하여 결국 실제 공격 코드에 도달하게 되므로, 공격 성공 가능성을 높일 수 있다.
2. 1. 기본 원리
힙 스프레이는 그 자체로 보안 취약점을 악용하는 기법이라기보다는, 취약성을 이용한 공격을 더 쉽게 만들기 위한 도구에 가깝다. 따라서 힙 스프레이만으로는 보안 시스템을 무력화할 수 없으며, 공격을 성공시키려면 별도의 보안 문제가 반드시 필요하다.보안 취약점을 이용한 공격은 실행 시마다 조금씩 달라지는 메모리 배치나 타이밍 같은 여러 요인 때문에 불확실성이 크다. 힙 스프레이는 이러한 불확실성을 줄이고 공격 성공 확률을 높이는 데 사용된다. 이 기법은 대부분의 컴퓨터 구조와 운영체제에서 힙 메모리를 대량으로 할당할 때 그 시작 주소를 어느 정도 예측할 수 있고, 연속적으로 할당된 메모리들은 주소 상에서 대체로 순차적으로 나열된다는 점을 이용한다. 이러한 특징 덕분에 공격자는 힙 스프레이를 실행할 때마다 거의 비슷한 위치에 원하는 데이터를 배치할 수 있다.
공격자는 프로그램의 제어 흐름을 탈취하기 위해 먼저 프로세스 내부에 큰 힙 메모리 공간을 확보한다. 그런 다음, 이 확보된 영역에 공격을 수행할 기계어 코드(명령어 집합)를 주입한다. 하지만 이 코드는 실행되기 전까지는 아무런 효과가 없다. 따라서 공격자는 추가적으로 프로세스가 사용하는 함수 포인터 중 하나를 조작하여, 이 포인터가 방금 코드를 주입한 힙 영역을 가리키도록 만든다. 이후 프로그램이 해당 함수 포인터를 통해 함수를 호출하면, 포인터가 가리키는 위치, 즉 공격자가 주입한 코드가 실행되게 된다.
하지만 주소 공간 배치 난수화(ASLR)와 같은 메모리 보호 기법 때문에, 힙 메모리에 주입된 코드가 매번 정확히 같은 바이트 주소에 위치하지는 않는다. 만약 조작된 함수 포인터가 주입된 코드의 중간이나 엉뚱한 위치를 가리키게 되면, 프로그램이 유효하지 않은 명령어를 읽어 공격이 실패하고 강제 종료될 수 있다. 이를 방지하기 위해 공격자는 NOP 슬라이드 기법을 사용한다. 예상되는 오차 범위만큼의 넓은 메모리 영역에 NOP(No Operation, 아무 동작도 하지 않음) 명령어를 채워 넣는 것이다. 이렇게 하면 함수 포인터가 NOP으로 채워진 영역 내의 어느 지점을 가리키더라도, 실행 흐름은 NOP 명령어를 따라 '미끄러지듯' 이동하여 결국 실제 공격 코드가 있는 위치에 도달하게 된다. 예를 들어, 0x0C0C0C0C와 같은 바이트 값은 특정 아키텍처에서 비표준 NOP 명령어로 자주 사용된다.
2. 2. NOP 슬라이드 활용
큰 크기의 힙 메모리에 주입된 명령어들은 대부분의 컴퓨터 아키텍처에서 거의 비슷한 위치에 배치되지만, 실제로는 ASLR과 같은 기법 때문에 바이트 단위까지 정확히 같은 위치에 배치되지는 않는다.[1] 이러한 미세한 위치 차이는 힙 스프레이 기법의 성공률에 영향을 미칠 수 있다. 만약 공격자가 조작한 함수 포인터가 주입된 명령어들의 중간이나 엉뚱한 곳을 가리키게 되면, 프로세스가 잘못된 명령어를 읽어들여 공격이 시작되기도 전에 강제 종료될 수 있기 때문이다.[1]이러한 문제를 해결하고 공격 성공률을 높이기 위해 NOP 슬라이드 기법이 사용된다. 공격자는 실제 악성 코드를 실행하는 명령어 앞부분에 넓은 영역에 걸쳐 NOP 명령어들을 채워 넣는다. 이렇게 하면, 조작된 함수 포인터가 NOP 명령어가 채워진 영역 내의 어느 주소를 가리키더라도, CPU는 NOP 명령어들을 순차적으로 실행하며 미끄러지듯 내려가다가 결국 실제 공격 코드가 있는 지점에 도달하여 실행하게 된다.[1][2] 즉, NOP 슬라이드는 ASLR 등으로 인해 발생할 수 있는 약간의 주소 오차를 극복하고 안정적으로 공격 코드를 실행시키기 위한 완충 지대 역할을 한다. 예를 들어, 특정 바이트 값(가령 0x0C0C0C0C)은 그 자체로 유효한 메모리 주소이면서 동시에 특정 아키텍처에서는 NOP 명령어처럼 작동하여 NOP 슬라이드를 구성하는 데 사용되기도 한다.[2]
2. 3. 함수 포인터 조작
공격자는 프로그램의 실행 흐름을 탈취하기 위해 힙 스프레이 기법을 활용한다. 먼저 프로세스 내에 큰 힙 메모리 영역을 확보하고, 이 영역에 실행하고자 하는 공격용 명령어(셸코드 등)를 채워 넣는다. 하지만 이 코드가 실제로 실행되려면 프로그램의 실행 흐름이 해당 메모리 영역으로 옮겨와야 한다.이를 위해 공격자는 프로그램이 사용하는 함수 포인터 중 하나를 조작하는 방법을 사용한다. 즉, 특정 함수 포인터가 힙 스프레이를 통해 미리 준비해 둔 공격 코드가 포함된 메모리 영역을 가리키도록 값을 변경하는 것이다. 이후 프로그램이 정상적인 실행 과정에서 해당 함수 포인터를 호출하게 되면, 원래 실행되어야 할 함수 대신 공격자가 주입한 코드가 실행되면서 프로그램의 제어권이 공격자에게 넘어갈 수 있다.
주소 공간 배치 난수화(ASLR)와 같은 현대 운영체제의 메모리 보호 기법 때문에 힙 스프레이 영역의 정확한 시작 주소는 실행할 때마다 조금씩 달라질 수 있다. 만약 조작된 함수 포인터가 공격 코드의 정확한 시작점을 가리키지 못하고 엉뚱한 곳을 가리키게 되면, 프로그램이 비정상적인 명령어를 만나 오류를 일으키거나 강제 종료되어 공격이 실패할 수 있다.
이러한 문제를 해결하고 공격 성공률을 높이기 위해 NOP 슬라이드(NOP Sled) 기법이 함께 사용되는 경우가 많다. 이는 실제 공격 코드 앞부분에 NOP(No Operation, 아무 동작도 하지 않는 명령어)에 해당하는 기계어 코드를 아주 길게 채워 넣는 방식이다. 이렇게 하면 조작된 함수 포인터가 이 긴 NOP 영역 내의 어느 지점을 가리키더라도, CPU는 NOP 명령어들을 순차적으로 지나쳐 미끄러지듯이 내려오다가 결국 실제 공격 코드에 도달하여 실행하게 된다. 예를 들어, 특정 바이트 값(가령 0x0C0C0C0C)은 일부 아키텍처에서 NOP 명령어와 유사하게 취급될 수 있어 힙 스프레이 시 NOP 슬라이드를 구성하는 데 사용되기도 한다.
3. 역사
힙 스프레이는 적어도 2001년부터 간혹 익스플로잇에 사용되어 왔지만,[3][4] 2005년 여름에 여러 익스플로잇이 인터넷 익스플로러의 광범위한 버그를 대상으로 이 기술을 사용하면서 웹 브라우저 익스플로잇 분야에서 널리 퍼지기 시작했다.[5][6][7][8][9] 당시 사용된 힙 스프레이 기법들은 서로 매우 유사했는데, 이는 힙 스프레이 기술이 다양한 상황에 적용될 수 있을 만큼 다재다능하고 사용하기 쉬우며, 익스플로잇마다 큰 수정 없이 적용될 수 있음을 보여주었다. 이 기술은 초보 해커조차도 웹 브라우저 및 웹 브라우저 플러그인의 여러 취약점에 대해 신뢰성 있는 익스플로잇을 빠르게 만들 수 있을 정도로 이해하고 사용하기 쉬운 것으로 증명되었다. 힙 스프레이를 이용하는 많은 웹 브라우저 익스플로잇은 단순히 이전 익스플로잇에서 힙 스프레이 코드를 잘라내기, 복사 및 붙여넣기하고, 취약점을 유발하는 작은 스크립트나 HTML 조각만을 추가하여 구성되는 경우가 많다.
4. 구현
힙 스프레이는 적어도 2001년부터 간헐적으로 익스플로잇에 사용되어 왔으나,[3][4] 2005년 여름 인터넷 익스플로러의 여러 버그를 대상으로 한 익스플로잇에서 이 기법이 사용된 이후 웹 브라우저 익스플로잇 분야에서 널리 퍼지기 시작했다.[5][6][7][8][9] 당시 사용된 힙 스프레이 기법들은 매우 유사했는데, 이는 이 기술이 다양한 상황에 적용될 수 있을 만큼 다재다능하고 사용하기 쉬우며, 특정 익스플로잇에 맞춰 큰 수정을 할 필요가 없음을 보여주었다.
이러한 특징 덕분에 힙 스프레이는 경험이 많지 않은 해커라도 비교적 쉽게 이해하고 활용할 수 있는 기술로 자리 잡았다. 웹 브라우저나 관련 플러그인에서 발견되는 다양한 종류의 취약점에 대해 신뢰도 높은 익스플로잇 코드를 빠르게 작성하는 데 유용하게 사용되었다. 실제로 많은 웹 브라우저 익스플로잇은 이전에 만들어진 힙 스프레이 코드를 그대로 잘라내기, 복사 및 붙여넣기하고, 취약점을 작동시키는 약간의 스크립트나 HTML 코드만 추가하는 방식으로 구성되기도 한다.
4. 1. 자바스크립트
웹 브라우저를 대상으로 하는 힙 스프레이는 일반적으로 자바스크립트를 사용하여 구현된다.[5][6][7][8][9] 이 방식은 큰 문자열을 대량으로 생성하여 힙 메모리를 특정 데이터로 채우는 기법이다. 가장 흔하게 사용되는 기술은 한 글자와 같은 짧은 문자열로 시작하여, 이 문자열을 자기 자신에게 반복적으로 연결하는 방식이다. 이렇게 하면 문자열의 길이는 지수적 성장을 통해 스크립팅 엔진이 허용하는 최대 길이까지 빠르게 늘어날 수 있다. 웹 브라우저가 문자열을 처리하는 방식에 따라 아스키 또는 유니코드 문자를 사용할 수 있다. 힙 스프레이 코드는 이렇게 생성된 긴 문자열의 복사본을 셸코드와 함께 만들고, 이 복사본들을 배열 등에 저장하여 익스플로잇이 성공적으로 실행될 수 있도록 충분한 메모리 공간을 예측 가능한 셸코드로 채운다.4. 2. VBScript
인터넷 익스플로러 환경에서는 가끔 VBScript가 힙 스프레이 기법에 사용된다. 이때 VBScript의 `String` 함수가 특정 문자열을 대량으로 생성하여 메모리에 할당하는 데 이용될 수 있다.4. 3. 액션스크립트
2009년 7월, 어도비 플래시에서 힙 스프레이를 위해 액션스크립트를 사용하는 익스플로잇이 발견되었다.[10][11]4. 4. 이미지
힙 스프레이는 이미지 파일을 프로세스에 로드하는 방식으로도 수행될 수 있다.[12] 그러나 이 방식은 2008년 8월 기준으로 널리 사용되지는 않았다.4. 5. HTML5
2012년 9월, 보안 컨퍼런스 EuSecWest 2012에서 새로운 힙 스프레이 기술이 발표되었다.[13] CORE 연구원인 페데리코 무티스(Federico Muttis)와 아니발 사코(Anibal Sacco)는 HTML5에 도입된 기술들을 이용하면 매우 정교하게 힙을 조작할 수 있음을 보여주었다. 특히, HTML5의 캔버스 API가 제공하는 저수준 비트맵 인터페이스와 웹 워커를 활용하여 기존보다 더 빠르게 힙 스프레이를 수행할 수 있다는 점을 시연했다.[13]5. 탐지 및 방지
- 마이크로소프트 연구소의 노즐(Nozzle) 프로젝트는 힙 스프레이를 탐지하고 예방하는 것을 목표로 한다.[14]
- BuBBle은 힙 스프레이 후 트리거되는 공격을 탐지하고 예방하기 위해 고려할 수 있는 또 다른 대응책이다.[15]
6. 한국의 관점
마이크로소프트 연구소의 노즐(Nozzle) 프로젝트는 힙 스프레이를 탐지하고 예방하는 것을 목표로 한다.[14] BuBBle은 힙 스프레이 후 트리거되는 공격을 탐지하고 예방하기 위해 고려할 수 있는 또 다른 대응책이다.[15]
참조
[1]
웹사이트
Youtube title: Heap Spray Exploit Technique
https://www.youtube.[...]
Palo Alto Networks Live Community
2016-09-02
[2]
웹사이트
Exploit writing tutorial part 11 : Heap Spraying Demystified
https://www.corelan.[...]
Corelan Team
2014-01-15
[3]
문서
"cami": telnetd exploit code
http://seclists.org/[...]
[4]
웹사이트
eEye Digital Security – Research
https://web.archive.[...]
[5]
웹사이트
InternetExploiter 1: MSIE IFRAME src&name parameter BoF exploit
http://skypher.com/w[...]
[6]
웹사이트
InternetExploiter 3: MSIE .ANI file "anih" header BoF exploit
http://skypher.com/w[...]
[7]
웹사이트
InternetExploiter 2: MSIE DHTML Object handling race condition exploit
http://skypher.com/w[...]
[8]
웹사이트
FrSIRT - Microsoft Internet Explorer javaprxy.dll COM Object Vulnerability / Exploit (Security Advisories)
http://www.frsirt.co[...]
2008-03-25
[9]
웹사이트
FrSIRT - Microsoft Internet Explorer "Msdds.dll" Remote Code Execution / Exploit (Security Advisories)
http://www.frsirt.co[...]
2008-03-25
[10]
웹사이트
Roee Hay: Exploitation of CVE-2009-1869
http://roeehay.blogs[...]
[11]
웹사이트
FireEye Malware Intelligence Lab: Heap Spraying with Actionscript
http://www.fireeye.c[...]
2014-04-22
[12]
간행물
Punk Ode—Hiding Shellcode in Plain Sight
https://www.blackhat[...]
Black Hat 2006
[13]
웹사이트
HTML5 Heap Spray. EUSecWest 2012
http://exploiting.wo[...]
[14]
웹사이트
Nozzle project from Microsoft Research aims to detect and prevent heap spraying
http://research.micr[...]
[15]
웹사이트
BuBBle: A Javascript Engine Level Countermeasure against Heap-Spraying Attacks
https://lirias.kuleu[...]
[16]
웹인용
Youtube title: Heap Spray Exploit Technique
https://www.youtube.[...]
Palo Alto Networks Live Community
2018-11-14
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com