힙 스프레이

컴퓨터 보안에서 힙 스프레이칠은 취약점 공격(익스플로잇)시에 임의 코드 실행을 용이하게하기 위해 사용되는 기술을 이르는 말으로, 이 기술을 구현하는 소스 코드를 힙 스프레이라고 한다. 일반적으로, 힙 스프레이는 공격의 대상이 되는 프로세스 내에 큰 사이즈의 힙 메모리를 할당하고, 여기에 익스플로잇에 사용할 명령어들을 주입시키는 것을 목표로 한다.

동작 방식 
힙 스프레이는 그 자체로 보안 문제를 악용하는 기법이라기보다는 취약성을 악용하기 쉽게하기 위해 사용되는 도구에 가깝다. 따라서 그 자체만을 사용하여 보안 장치들을 깨는 것은 불가능하고, 취약점 공격을 위해서는 별도의 보안 문제가 반드시 필요하다. 

대개 보안 문제를 악용한 공격은 많은 요소들에 의해 영향을 받는데, 가령 실행 시마다 미묘하게 달라지는 메모리 배치나 타이밍 등이 (공격자 관점에서 보았을 때) 많은 양의 불확실성을 야기시킨다. 힙 스프레이칠 기법은 이런 불확실성을 최소화시키고 공격의 성공 확률을 높이는 데 사용된다. 힙 스프레이는 대다수의 컴퓨터 아키텍처에서 i) 힙 메모리를 크게 할당하면 그 시작 주소를 어느 정도 예측할 수 있고, ii) 연달아서 할당된 메모리들은 대략 메모리 주소상에 일렬로 존재한다는 점을 이용하는데, 이는 곧 힙 스프레이가 작동할 때마다 매번 거의 비슷한 위치에 힙 스프레이칠을 할 수 있다는 것을 의미한다. 

공격자는 프로그램의 컨트롤을 탈취하기 위해 먼저 프로세스 내에 큰 힙 메모리를 할당한 후에, 이 영역에 공격을 수행할 임의의 명령어들(인스트럭션)을 주입한다. 하지만 이 명령어들은 실행되지 않는 이상 효력을 발휘하지 않는데, 따라서 공격자는 추가로 프로세스가 사용하는 함수 포인터 중 하나에 스프레이칠을 가하여 포인터가 이 영역을 향하도록 하고, 프로세스가 해당 함수 포인터를 읽어들여 호출한 시점부터 공격자가 주입한 명령어들이 실행될 수 있도록 만든다. 

큰 사이즈의 힙 메모리에 주입된 명령어들은 대부분의 컴퓨터 아키텍처에서 항상 얼추 비슷한 위치에 설치되지만, 실제로는 주소 공간 레이아웃 임의화(ASLR) 등의 기법으로 인하여 바이트 단위로 정확히 같은 위치에 설치되지는 않는다. 이러한 설치 위치의 미묘한 차이는 힙 스프레이 기법의 효용성에 좋지 않는 영향을 주는데, 만약 스프레이칠한 함수 포인터가 주입한 명령어들의 중간 부분이나 바깥을 향하게 되면 프로세스가 비적법한 명령어를 읽어들이면서 공격이 수행되기 전에 강제 종료되기 때문이다. 이를 방지하기 위해 공격자는 어느 정도 오차가 있을 것으로 예상되는 양만큼의 메모리 영역에 NOP 명령어들을 설치해두어, 이 영역 어느 부분에서부터 컨트롤이 시작하든 궁극적으로 컨트롤이 공격자가 미리 설치해둔 명령어들로 미끄러져 내려오게끔 만들어둔다. (NOP 슬라이드)

같이 보기 

 NOP 슬라이드 또는 NOP 미끄럼틀, 힙 스프레이를 보완하는 기술

출처 

취약점 공격